首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在制作蛇游戏的过程中,不知道如何做正确的动作

在制作蛇游戏的过程中,不知道如何做正确的动作
EN

Stack Overflow用户
提问于 2015-12-01 02:33:47
回答 1查看 669关注 0票数 0

我目前正在用jgrasp制作一个蛇游戏,只使用标准的绘制移动和静态方法来创建这个游戏,到目前为止,这是我拥有的代码,因为我昨天才开始。但我目前被困在如何让蛇移动,所以它只能是上上下下和一边到另一边,并且运动是恒定的。目前我只知道箭头键可以移动蛇,但它仍然可以沿对角线移动,而且不是恒定的

代码语言:javascript
运行
复制
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;
         }   


       }
   }
}
EN

回答 1

Stack Overflow用户

发布于 2015-12-01 02:38:45

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

代码语言:javascript
运行
复制
  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计时器来完成此操作。你的问题不是你的移动速度,而是帧速率的波动。

代码语言:javascript
运行
复制
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计时器相比,您可以研究不同的方法,但这应该可以解决您的一般问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34005531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档