我在做贪吃蛇实验的时候运行蛇投被覆盖,只有一个矩形蛇身一直往前冲(原来连舌头有3个),现在我把循环的代码贴上:
public void Draw(Graphics g)
        {
            Pen blackPen = new Pen(Color.Black);
            Pen redPen = new Pen(Color.Red);
            Brush redBrush = redPen.Brush;
            Brush blackBrush = blackPen.Brush;            g.FillRectangle(redBrush, head.X, head.Y, 15, 15);            for (int i = 1; i < nodes; i++)
            {
                g.FillRectangle(blackBrush, arraybody[i].X, arraybody[i].Y , 15, 15);
                
            }        }        public void move(Size mun)
        {
            moveX = 10;
            moveY = 10;
            head.X += moveX;
            arraybody [0] .X += moveX;
            //arraybody [0].Y += moveY;            int maxX = mun.Width - 30;
            int maxY = mun.Height - 30;
            for (int i=1;i<nodes ;i++)
            {
                arraybody[i].X = arraybody [i-1].X;
                arraybody[i].Y = arraybody [i-1].Y ;
               
            }
            for (int i = 0; i < nodes; i++)
            {
                if (arraybody[i].X < 0 || arraybody[i].Y > maxX)
                {
                    moveX = -moveX;
                    
                }
                if (arraybody[i].Y < 0 || arraybody[i].Y > maxY)
                {
                    moveY = -moveY;
                   
                }
            }move 和 draw方法循环调用,蛇初始化如下
class Snake
    {
        int moveX;
        int moveY;
        Point head;
        Point body;
        Point[] arraybody = new Point [100] ;
        enum direction { up, down, left, right };
        int nodes;
        bool live;        public Snake ()
        {
            nodes = 3;
            head = new Point(50,30);
            arraybody[0] = head;
  
            for (int i = 1; i < nodes; i++)
            {
                body.X = head.X - 15*i;
                body.Y = head.Y ;
                arraybody[i] = body;
                
            }            live = true;
        }请大家帮忙看一下,还有一个问题,我如何捕获键盘的上下左右键的事件啊?

解决方案 »

  1.   

    Draw里面没画蛇头吧
    键盘用keydown事件,然后在事件里面判断key是哪个就可以了
      

  2.   

    用onKeyDown事件,参数e中有key属性吧,然后写if-else分支判断就可以了
      

  3.   

    还有一个棘手的问题,不好意思啊,问题多了点,呵呵
    private void timer1_Tick(object sender, EventArgs e)
            {
                snake.move(panel1.ClientSize);
                panel1.Invalidate();
                panel1.Update();
                timer1.Enabled = snake.isRun;
            } 
     
    我想判断计时器是否停止计时,但我在Snake类中将isRun改为false之后并没有停止计时 ,反复出现
     public void GameOver()
            {
                MessageBox.Show ("游戏已结束", "贪吃蛇", MessageBoxButtons.OK, MessageBoxIcon.Information);
                
            }
    的对话框。
    附:
    public void move(Size mun)
            {
                for (int i = nodes ; i>0; i--)
                {
                        arraybody[i].X = arraybody[i - 1].X;
                        arraybody[i].Y = arraybody[i - 1].Y;            }            switch (direction)
                {
                    case Keys .Up :
                        arraybody [0].Y  -= step;
                        break;
                    case Keys .Down :
                        arraybody[0].Y += step;
                        break;
                    case Keys .Left :
                        arraybody[0].X -= step;
                        break;
                    case Keys .Right :
                        arraybody[0].X += step;
                        break;
                    case Keys.Escape :
                        this.GameOver();
                        break;
                }
                int maxX = mun.Width;
                int maxY = mun.Height;            for (int i = 0; i < nodes; i++)
                {
                    if (arraybody[i].X < 0 || arraybody[i].Y > maxX)
                    {
                        isRun  = false ;
                        GameOver();
                        
                        break;                }
                    if (arraybody[i].Y < 0 || arraybody[i].Y > maxY)
                    {
                        isRun  = false ;
                        GameOver();
                        
                        break;
                    }
                }