You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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类的方法权限不对:确保CoordinategetX()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

火山引擎 最新活动