视力有限的寻路

时间:2015-11-30 15:00:17

标签: c algorithm path-finding

我正在制作一个基于2D拼图的迷宫游戏,我正在尝试编程一个可以通过迷宫找到路径的AI播放器。 与普通路径发现不同,我希望将每个玩家(包括AI玩家)的视野限制在他们周围的2x2。也就是说,AI应该只知道它周围的周围5x5网格和迷宫中的确切坐标,如:

Tile mapRecord[MAP_SIZE][MAP_SIZE];
Direction FindPathAI(int row, int column, Tile surroundings[5][5]) {
    int i, j;
    int r = row - 3, c = column - 3;
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            r = (r + MAP_SIZE + 1) % MAP_SIZE; //wrap around
            c = (c + MAP_SIZE + 1) % MAP_SIZE; //wrap around
            mapRecord[r][c] = surroundings[i][j];
        }
    }

    //FindPath

    //return the direction to go
}

有什么方法可以解决这个问题?我认为我可以声明一个整个地图大小的数组,并将AI播放器的视觉记录到地图上。但后来我陷入了下一步应该做什么......任何想法? 谢谢。

2 个答案:

答案 0 :(得分:1)

如果迷宫的入口和出口(开始/结束)都通过其他墙壁连接到外墙(即,一个不在中间的“岛”上),那么您将拥有一个简单连接的迷宫。

+----S----+
|         |
|   +-F-+ |  <-- OK: "Finish" is connected
|   +---+-|      Simply-connected maze
|         |
+---------+

+----S----+
|         |
|   +-F-+ |  <-- Bad: "Finish" is not connected
|   +---+ |      Maze with Start or Finish on an island
|         |
+---------+

简单连接的迷宫

如果你没有像上面这样的“岛屿”情况,你可以使用简单的“墙跟随者”方法,你可以蒙上眼睛(即根本没有视力!)。只需将左手(或右手)放在墙上,然后走路。如果您到达障碍物,请转向允许您将手放在墙上的任何方向。如果有的话,你最终会到达出口。

复杂的“岛屿”迷宫

如果你必须处理岛屿,你可以使用像Trémaux算法这样的东西。如果您考虑基于2D拼块的迷宫中的每个空拼贴,则每个拼贴都将为空,标记一次或两次。 (0,1或2分。)

显然,当访问一个图块时,你会增加标记,所以假设在这里:

  • 一开始,向随机有效方向移动(N / S / E / W)。
  • 当您到达0访问区块时,沿着随机方向行走
  • 当你到达一次访问的瓷砖时,转过身来,然后沿着你的方式走回来。
  • 否则,请转到标记最少的图块。

当您到达出口时,标记一次的瓷砖将带您回到起点。

有关详细信息,请参阅Wikipedia page on maze solving

答案 1 :(得分:0)

这可以通过运行彼此嵌入的2个不同路径搜索来完成。一种算法分析了玩家可见的迷宫补丁(没有玩家移动)。另一种算法移动AI本身并搜索路径。分析迷宫的可见部分的算法用于搜索AI的可能的其他路径。通过这种方式,AI可以在不知情的情况下分析整个迷宫。

路径查找本身是特定于实现的,并且有一个很好的可用算法列表(https://en.wikipedia.org/wiki/Maze_solving_algorithm) - 除了BFS,DFS和图形的其他路径查找算法。

使用的算法取决于AI的行为方式。例如,Wall-follower-algorithm算法很容易实现,但如果AI表示例如,它会显得相当愚蠢。游戏中的角色。最有效的算法可能是具有适当启发式的A *(通过它可以修改AI的行为)。