这实质上是一个我正在开发的吃豆人克隆游戏。我有一个敌人类,创建了4个该类的实例,它们都代表游戏中的4个幽灵。
所有幽灵都会在屏幕的随机区域启动,然后他们必须朝着吃豆人角色前进。当玩家控制吃豆人四处移动时,幽灵应该跟随并采取最近的方式朝向他。
目前还没有迷宫/障碍物,因此整个地图(400x400像素)对它们来说是开放的地面。
对于玩家和每个幽灵,我可以检索到X、Y、图像宽度和高度属性。此外,我已经有了一种碰撞检测算法,因此不必担心,只需要让幽灵找到通往吃豆人的方式。
这实质上是一个我正在开发的吃豆人克隆游戏。我有一个敌人类,创建了4个该类的实例,它们都代表游戏中的4个幽灵。
所有幽灵都会在屏幕的随机区域启动,然后他们必须朝着吃豆人角色前进。当玩家控制吃豆人四处移动时,幽灵应该跟随并采取最近的方式朝向他。
目前还没有迷宫/障碍物,因此整个地图(400x400像素)对它们来说是开放的地面。
对于玩家和每个幽灵,我可以检索到X、Y、图像宽度和高度属性。此外,我已经有了一种碰撞检测算法,因此不必担心,只需要让幽灵找到通往吃豆人的方式。
对于一个好的寻路算法,使用A*可能是个好主意,但是对于一个不需要复杂、高效或有效路径搜索的简单游戏来说,只需通过找到目标方向使角色向目标移动就足够了。
例如,让角色移动的决策,伪代码如下:
if (target is to the left of me):
move(left);
else
move(right);
if (target is above me):
move(up);
else
move(down);
是的,角色移动可能不会非常高效,但在每个游戏循环的迭代中,它会越来越接近目标。
我猜测,80年代早期的街机游戏可能不会使用复杂的路径查找算法。
*-*-*
|\|/|
*-*-* ... (etc)
|/|\|
*-*-*
如果Pacman在中心,它可以很容易地移动到任何其他节点。
更接近现实的情况可能是这样的:
*-*-*
| | |
*-*-* ... (etc)
| | |
*-*-*
现在,Pacman无法对角移动。从中心到右下角需要进行2次“跳跃”,而不是一次。
继续进行:
*-*-*-*
| | | |
| | | |
| | | |
*-*-*-*
| | | |
*-*-*-*
在Pacman游戏中,所有的幽灵都有不同的追逐算法
幽灵们的移动中编程了有趣的模式:偶尔,它们会同时停止追赶Pac-Man并返回迷宫的各自角落,进入“散开模式”。
完整的算法描述可以在the pacman dossier找到
此致
Guillaume
你可以开始看A*(A星)
这里还有一个页面,其中包含其他路径查找算法的链接。点击这里。
[编辑] 噫...我的大脑太慢了...我忘记了这本书,它是用C或C++编写的(我忘记了),但你仍然可以从中获取Java的概念。它可能不是最容易阅读的,但总体上还不错。《游戏开发人员的AI》David M. Bourg, Glenn Seemann。
我认为在每次Pacman移动时都应该采用最短路径算法。一个非常好的实现是Dijkstra算法。
简单总结一下:将迷宫视为具有顶点和边的图形。每条边都有一个等待时间(在您的情况下,所有边的权重相同)。该算法通过沿着每个可达边缘向下移动一步来找到从源顶点到目标顶点的最短路径。然后在下一个顶点上,您做同样的事情,并继续执行,直到到达目标。第一条到达的路径是最短路径。可以对此算法进行许多优化,以加快速度,例如考虑Pacman在其先前位置以及移动方向,以便在算法中获得一些启发式。我建议在每次移动时找到每个幽灵到Pacman的最短路径,并朝那个方向移动幽灵。最终距离会减少,您将能够抓住Pacman。
另一个可用的启发式方法是找到所有从吃豆人可以到达的直接边,然后尝试通过幽灵覆盖尽可能多的这些顶点。因此,我们不将吃豆人设置为目标顶点,而是将吃豆人可以直接到达的顶点设置为目标,结果是可用的幽灵将尝试覆盖吃豆人的主要逃生路线并捉住他。