-1

所以,我用人工智能创建了我自己的蛇游戏,但现在我有非常非常奇怪的蛇动作。

视频

所以,我的算法是:

  1. 获取地图:1 - 路径清晰,0 - 没有路径(墙壁,蛇)
  2. 获取水果位置
  3. 获取 SnakeAI 头部位置
  4. 将其发送到 A* 算法(正常工作)
  5. 获取路径(点阵;end为水果位置,start为snakeAi头部)
  6. 设置snakeAI的方向

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);
                }
            }
        }

所以,我在一周左右与那个错误的动作作斗争,我真的不知道错误在哪里。尤达大师,帮帮我。

4

1 回答 1

1

我知道问题是什么!

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

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

这是正确的伪代码:

  1. 看看我们是否朝着正确的方向前进
    • 如果是,继续
    • 如果不是,判断 A* 是想让我们左转还是右转
  2. 移动一格
  3. 重复步骤 1

逻辑应该是这样的:

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:
于 2012-11-28T18:58:28.860 回答