Java贪吃蛇游戏问题:蛇已构建但无法移动,坐标不更新
搞定你的贪吃蛇移动问题!
我仔细扒了你的GameEngine代码,找到了几个让蛇“僵住”的关键问题,咱们逐个解决:
1. UpdateSnake方法的致命疏漏:蛇身X坐标没更新!
你看UpdateSnake里处理蛇身的循环,只写了snake.get(i).setY(snake.get(i-1).getY()),完全漏掉了X坐标的更新!这就导致蛇身根本不会跟着蛇头动,而且你在这个方法里修改map的操作完全是白费功夫——因为getMap()每次都会生成一个全新的TileType数组,这里改了也留不住。
把UpdateSnake改成这样就对了:
private void UpdateSnake(int x, int y) { // 从尾巴开始,每一节都挪到前一节的位置 for (int i = snake.size() - 1; i > 0; i--) { Coordinate prevPart = snake.get(i - 1); snake.get(i).setX(prevPart.getX()); snake.get(i).setY(prevPart.getY()); } // 最后移动蛇头 Coordinate head = snake.get(0); head.setX(head.getX() + x); head.setY(head.getY() + y); }
2. 别忘了定时调用Update方法!
就算修复了上面的问题,如果你的游戏没定时触发Update(),蛇还是不会动。你得搞个游戏循环或者定时器,每隔100-200ms调用一次gameEngine.Update(),比如用Timer实现:
// 游戏初始化后启动定时器 Timer gameTimer = new Timer(); gameTimer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { if (gameEngine.getCurrentGameState() == GameState.Running) { gameEngine.Update(); // 每次更新后要重新渲染界面哦 redrawGame(gameEngine.getMap()); } else { gameTimer.cancel(); } } }, 0, 150); // 每150ms更新一次,数值可以调快慢
3. 解决map和get方法的下划线提示
你说添加代码时map和get方法有下划线,大概率是这几个原因:
- Coordinate类的方法权限不对:确保
Coordinate的getX()、getY()、setX()、setY()都是public的,不然GameEngine访问不了这些方法。 - TileType枚举没定义对:检查
TileType是不是正确的枚举,比如:
public enum TileType { Nothing, SnakeHead, SnakeTail, Wall }
- IDE抽风了:试试清理IDE缓存(比如IntelliJ的File -> Invalidate Caches / Restart),有时候IDE会瞎报错。
最后再确认下:initGame()方法在游戏启动时有没有被调用?要是没调用,蛇和墙都没初始化,肯定也看不到移动效果~
内容的提问来源于stack exchange,提问作者Asp Designer




