我发现在《吃豆人》中有很多关于幽灵AI的参考,但没有一个提到当幽灵被《吃豆人》吃掉后,眼睛是如何找到中央幽灵洞的。

在我的实现中,我实现了一个简单但糟糕的解决方案。我只是在每个角落都用硬编码标明了应该往哪个方向走。

有没有更好的/最好的解决办法?也许是适用于不同关卡设计的通用设计?


当前回答

对于更传统的寻路算法的替代方案,您可以看看(名称很合适!)吃豆人气味反对象模式。

你可以在启动时在迷宫中弥漫怪物洞的气味,然后让眼睛跟着它回家。

气味设置好后,运行成本非常低。


编辑:很遗憾维基百科上的文章已经被删除了,所以WayBack Machine来拯救…

其他回答

《吃豆人》中的幽灵遵循或多或少可预测的模式,即尝试先匹配X或Y,直到实现目标。我一直认为这对于眼睛寻找回去的路是完全一样的。

对于我的《吃豆人》游戏,我创造了一个“最短多条回家路径”算法,它适用于我所提供的任何迷宫(在我的规则集内)。它也适用于隧道。

当关卡被加载时,每个十字路口的所有归途数据都是空的(默认),一旦幽灵开始探索迷宫,它们每次遇到“新的”十字路口或从不同的路径再次遇到已知的十字路口时,它们的归途路径信息就会不断更新。

你应该看看寻径算法,比如Dijsktra算法或a *算法。这就是你的问题所在:图/路径问题。

这是我能找到的关于它是如何工作的最好的资料。

http://gameai.com/wiki/index.php?title=Pac-Man#Respawn 当幽灵被杀死时,它们脱离实体的眼睛会回到最初的位置。这可以通过将幽灵的目标贴图设置到该位置来实现。导航使用相同的规则。

这是有道理的。也许不是世界上最有效的方法但这是一种很好的方法不用担心另一种状态或者沿着这些线你只需要改变目标。

附注:我没有意识到那些吃豆人程序员有多棒,他们基本上是在非常小的空间和非常有限的内存中创建了一个完整的消息系统……太神奇了。

我的方法有点内存密集型(从《吃豆人》时代的角度来看),但你只需要计算一次,它适用于任何关卡设计(包括跳跃)。

一次标记节点

当你第一次加载一个关卡时,将所有怪物巢穴节点标记为0(代表与巢穴的距离)。继续向外标记已连接的节点1,连接到它们的节点2,依此类推,直到所有节点都被标记。(注意:如果巢穴有多个入口,这也是有效的)

我假设您已经有了表示每个节点和到它们的邻居的连接的对象。伪代码可能看起来像这样:

public void fillMap(List<Node> nodes) { // call passing lairNodes
    int i = 0;

    while(nodes.count > 0) {
        // Label with distance from lair
        nodes.labelAll(i++);

        // Find connected unlabelled nodes
        nodes = nodes
            .flatMap(n -> n.neighbours)
            .filter(!n.isDistanceAssigned());
    }
}

眼睛移动到距离标签最小的邻居

一旦所有节点都标记好了,路由眼睛就变得很简单了……只需要选择距离标签最小的相邻节点(注意:如果多个节点的距离相等,那么选择哪个节点并不重要)。伪代码:

public Node moveEyes(final Node current) {
    return current.neighbours.min((n1, n2) -> n1.distance - n2.distance);
}

全标记示例