如果你只有一个像素网格——一个 pacman 和 ghost 可以在上面自由移动的“大场”——那么最短路径很简单——ghost 和 pacman 之间的直线。
但是“最短路径”总是意味着我们正在尝试解决图论问题。(我假设了解图、一些图论、adj. 矩阵等!)
在上述情况下,将每个像素视为图上的一个节点。每个节点通过一条边连接到它的邻居,并且每条边都具有相等的“权重”(移动到“上方”的节点并不比移动到“下方”的节点慢)。
所以你有这个:(“*”=节点,“-,/,\,|”=边缘)
*-*-*
|\|/|
*-*-* ... (etc)
|/|\|
*-*-*
如果 Pacman 在中心,它可以很容易地移动到任何其他节点。
更接近现实的可能是这样的:
*-*-*
| | |
*-*-* ... (etc)
| | |
*-*-*
现在,吃豆人不能对角移动。从中心到右下角需要 2 次“跳跃”而不是 1 次。
继续前进:
*-*-*-*
| | | |
| | | |
| | | |
*-*-*-*
| | | |
*-*-*-*
现在,要从中间的节点到顶部的节点,您需要 3 跳。然而,向底部移动只需要 1 跳。
将任何游戏板设置转换为图形很容易。每个“交叉点”都是一个节点。两个交点之间的路径是一条边,该路径的长度是该边的权重。
进入一个*。通过构建图(使用邻接矩阵或节点列表),您可以使用 A* 算法找到最短路径。其他算法包括 Dijkstra 算法。还有许多其他人!但首先你需要用图表来描述你的问题,然后玩弄如何从节点 A(pacman)到节点 B(ghost)。
希望有帮助!