我目前正在用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;
}
}
}
}发布于 2015-12-01 02:38:45
在这种方法中,将if语句更改为else if可以解决您的问题。
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计时器相比,您可以研究不同的方法,但这应该可以解决您的一般问题。
https://stackoverflow.com/questions/34005531
复制相似问题