在制作蛇游戏的过程中,不能弄清楚如何使运动正确

时间:2015-11-30 18:33:47

标签: java stdin jgrasp

我目前正在jgrasp中使用标准绘制动作和静态方法制作这个游戏的蛇游戏,到目前为止,这是我的代码,因为我刚刚开始昨天。但我现在仍然坚持如何制作蛇的动作,因此它只能上下左右并且运动不变。目前我所拥有的是箭头键移动蛇但它仍然可以对角移动并且不会持续

import java.awt.event.KeyEvent;
public class snake
{
   static double squareX = .5;
   static double squareY = .5;
   static double squareR = .02;



   public static void drawScene() 
   {
      StdDraw.clear();
      StdDraw.filledSquare(squareX, squareY, squareR);
      StdDraw.show(1000/24);

   }

   public static void updateMotion()
   {

      if (StdDraw.isKeyPressed(KeyEvent.VK_UP))
      {
         squareY += .01;
      }
      if (StdDraw.isKeyPressed(KeyEvent.VK_DOWN))
      {
         squareY -= .01;
      }
      if (StdDraw.isKeyPressed(KeyEvent.VK_LEFT))
      {
         squareX -= .01;
      }
      if (StdDraw.isKeyPressed(KeyEvent.VK_RIGHT))
      {
         squareX += .01;

      }
   }



   public static void main(String[] args)
   {
       while(true)
       {
         snake.drawScene();
         snake.updateMotion();
         if (squareX + squareR >= 1 )
         {
            //TODO: show "you lose" message / stop on edge of square
            break;
         }
         if (squareX - squareR <= 0)
         {
            //TODO: show "you win" message / stop on edge of square
            break;
         }   
         if (squareY + squareR >= 1 )
         {
            //TODO: show "you lose" message / stop on edge of square
            break;
         }
         if (squareY - squareR <= 0)
         {
            //TODO: show "you win" message / stop on edge of square
            break;
         }   


       }
   }
}

1 个答案:

答案 0 :(得分:0)

在此方法中,将if语句更改为else ifs可以解决您的问题。

  if (StdDraw.isKeyPressed(KeyEvent.VK_UP)){
     squareY += .01;
  }else if (StdDraw.isKeyPressed(KeyEvent.VK_DOWN)){
     squareY -= .01;
  }else if (StdDraw.isKeyPressed(KeyEvent.VK_LEFT)){
     squareX -= .01;
  }else if (StdDraw.isKeyPressed(KeyEvent.VK_RIGHT)){
     squareX += .01;
  }

你所描述的似乎是你的问题是蛇在对角线上行走。这将发生在你的程序进行垂直和水平输入。这段代码现在每帧只占一个方向,因此蛇只能向上,向下,向左和向右移动。

要使蛇的移动速度恒定,您需要限制每秒的帧数。您可以使用每个while循环中的最简单的Thread.sleep(10);调用或swing计时器来执行此操作。你的问题不在于移动速度,而在于帧速率的波动。

public static void main(String[] args) throws InterruptedException
{
    while(true)
    {
     snake.drawScene();
     snake.updateMotion();
     if (squareX + squareR >= 1 )
     {
        //TODO: show "you lose" message / stop on edge of square
        break;
     }
     if (squareX - squareR <= 0)
     {
        //TODO: show "you win" message / stop on edge of square
        break;
     }   
     if (squareY + squareR >= 1 )
     {
        //TODO: show "you lose" message / stop on edge of square
        break;
     }
     if (squareY - squareR <= 0)
     {
        //TODO: show "you win" message / stop on edge of square
        break;
     }   
     Thread.sleep(20);
   }
}

添加一条线来限制这样的帧会让你的蛇以恒定的速度移动。作为一个注释,有不同的方法可以使用Thread.sleep(),例如你可以查看的swing定时器,但这应该可以解决你的一般问题。