我正在制作一个基于二维瓷砖的迷宫游戏,我正在尝试编程一个人工智能玩家,可以找到它的路径通过迷宫。
与普通的路径查找不同,我想将每个玩家(包括人工智能玩家)的视野限制在2×2左右。也就是说,人工智能应该只知道它周围的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
}
有什么可能解决这个问题?我想我可以声明一个整个地图大小的数组,并将人工智能播放器的视觉记录到地图上但后来我被困在下一步该怎么办…知道吗?
谢谢。
最佳答案
如果迷宫的入口和出口(开始/结束)都被其他墙壁连接到外面的墙上(即,一个不是在中间的一个岛上),那么你有一个简单连接的迷宫。
+----S----+
| |
| +-F-+ | <-- OK: "Finish" is connected
| +---+-| Simply-connected maze
| |
+---------+
+----S----+
| |
| +-F-+ | <-- Bad: "Finish" is not connected
| +---+ | Maze with Start or Finish on an island
| |
+---------+
简单连接迷宫
如果你没有像上面这样的“孤岛”情况,你可以使用简单的“墙跟随者”方法,你可以蒙住眼睛(也就是说,根本没有视力!)把你的左手(或右手)放在墙上,然后走。如果你碰到障碍物,向任何能让你把手放在墙上的方向转弯。如果有一个出口,你最终会到达出口。
复杂的“岛屿”迷宫
如果你真的要处理岛屿,你可以使用类似于特雷莫克斯的算法。如果在基于二维平铺的迷宫中考虑每个空平铺,则每个平铺将为空,标记一次或两次。(0、1或2标记。)
显然,当访问一个tile时,您会增加标记,因此假设:
开始时,以随机有效的方向移动(N/S/E/W)。
当您到达0-visit互动程序时,请沿未标记的随机方向行走。
当你到达一个一次参观的地砖时,转身走回你来的路。
否则,转到标记最少的瓷砖。
当您到达您的出口,瓷砖标记一次将带你回到开始。
有关更多信息,请参见Wikipedia page on maze solving。