Snake AI奇怪的动作(错误的动作)

时间:2012-11-28 18:20:24

标签: java game-ai

所以,我用AI制作了自己的Snake游戏,但现在我的蛇行动非常非常奇怪。

Video

所以,我的算法是:

  1. 获取地图:1 - 路径清晰,0 - 没有路径(墙壁,蛇)
  2. 获得水果位置
  3. 获取SnakeAI头部位置
  4. 将其发送至A *算法(正常工作)
  5. 获取路径(点数组;结束是水果位置,开始是蛇头)
  6. 设定snakeAI的方向
  7. Code on Pastebin

    private void AI() {
    
            Point s = new Point();
            //SnakeAI head
            Point n = new Point();
            //Food
            n.x = food.x / 13;
            n.y = food.y / 13;
            s.x = snakeAI.getBody().get(0).x / 13;
            s.y = snakeAI.getBody().get(0).y / 13;
    
            int px;
            int py;
    
            //Path
            g = f.findPath(map, n, s);
    
            if (g.size() > 0) {
            //Next snake positin
                px = g.get(g.size() - 1).x;
                py = g.get(g.size() - 1).y;
            } else {
               return;
                }
    
                if (s.x == px) {  
                    //Move UP
                    if (s.y > py) {
                        snakeAI.setDirection(Snake.DIR_UP);
                    }
                    //Move DOWN
                    if (s.y < py) {
                        snakeAI.setDirection(Snake.DIR_DOWN);
                    }
                }
                if (s.y == py) {
                    //Move LEFT    
                    if (s.x > px) {
                        snakeAI.setDirection(Snake.DIR_LEFT);
                    }
                    //Move RIGHT
                    if (s.x < px) {
                        snakeAI.setDirection(Snake.DIR_RIGHT);
                    }
                }
            }
    

    所以,我打算用一周的错误动作,我真的不知道错误在哪里。 尤达大师,帮帮我。

1 个答案:

答案 0 :(得分:1)

我知道问题是什么!

在Snake中,你无法转过身来。换句话说,如果你向左移动,你不能向右移动,你必须先向上移动。但是,您的代码正在命令蛇移动不正确而不考虑它之前的方向。它不应该上升然后下降等。

修复这个问题,你可能会解决整个问题。确保A *算法的因素是转向是非法的方向。

这是正确的伪代码:

  1. 看看我们是否朝着正确的方向前进
    • 如果是,请继续
    • 如果不是,请确定A *是否要我们左转或右转
  2. 移动一个方格
  3. 重复步骤1
  4. 逻辑应该是这样的:

    switch (snakeAI.getDirection()) {
      case Snake.DIR_LEFT:
        if (s.x >= px) { // don't go left anymore
          if (s.y > py) {
            snakeAI.setDirection(Snake.DIR_UP);
          } else if (s.y < py) {
            snakeAI.setDirection(Snake.DIR_DOWN);
          } else {
            // You should probably change this
            snakeAI.setDircetion(Snake.DIR_DOWN);
          }
        }
        break;
      case Snake.DIR_RIGHT: