3

我正在尝试实现 Pacman。它工作得很好,但到目前为止,幽灵没有使用任何寻路,而是随机决定每个路径交叉点要走哪条路径。所以你可以想象吃豆人赢得比赛并不难;)

所以我在 Pacman 中阅读了一些关于寻路算法的信息,在这里我找到了一个非常好的答案:Pathfinding Algorithm For Pacman

答案参考http://home.comcast.net/~jpittman2/pacman/pacmandossier.html#Chapter%204

这一切都很好,但是在我的 Pacman 实现中,有两个 Pacman 由两个不同的玩家玩。所以我想知道如何调整寻路算法,让鬼魂不总是追逐一个玩家。

关于如何修改算法以使幽灵对双方玩家或多或少平等公平的任何想法?

4

5 回答 5

5

我认为最简单的策略是让每个幽灵追逐离它最近的玩家。可以使用曼哈顿距离(在寻路问题中有指向它的链接)或欧几里德距离或玩家的路径长度来计算接近度。最后一个选项意味着您必须计算两个玩家的路径。尝试所有这些选项并根据您的口味选择一个。

另外,在旁注中。所有回答寻路问题的 人都没有提到比 BFS 还要慢的 Dijkstra 算法:) 但只允许搜索所有最短路径一次。也就是说,如果您实现 A* 或 BFS 并有n 个ghost,您将至少进行n 个寻路查询。使用 Dijkstra,您只能从播放器开始执行一次。但这一切都取决于。如果你的游戏领域太大,Dijkstra 不是最好的选择。尝试,实验,也许它会适合你。

于 2010-06-23T12:50:20.583 回答
3

(还没有看过,但是)我猜所有的幽灵算法都基于幽灵和“玩家”的相对位置 - 好吧,只是让每个幽灵改变主意它使用的两个玩家中的哪一个算法中的“玩家”,每隔一段时间。

确定“每隔一段时间*”到底意味着什么将成为游戏测试的一个问题——它是否应该在一个固定的时间表上?每个幽灵会有所不同?根据两个玩家的相对接近程度而有所不同?随机 - 在制服/泊松/其他分布?

如您所见,有很多可能性。请记住,您要避免“太好”的行为和“太愚蠢”的行为……

于 2010-06-23T12:10:49.660 回答
2

如果你可以从任何一个 Ghost 中查询到任何一个 Pacman 的距离和方向,以及当前正在追逐任何一个 Pacman 的 Ghost 的数量(以及哪些 Ghost),你应该可以用一些创造力制作一个非常好的和简单的 AI。

于 2010-06-23T12:22:45.393 回答
1

我不知道这是否与您的“公平”概念相吻合,但我想有人想防止一名玩家碰巧成为所有 4 个鬼魂的更近目标,因此他们最终联合起来追捕他并跟随他在身边,再也不会去追逐其他玩家。这可能是让幽灵始终跟随最近的玩家的规则的可能结果。

您可以考虑首先将 2 个幽灵分配给玩家 1,将 2 个其他幽灵分配给玩家 2,然后让他们追逐目标(并经常重新分配)。不过,如果我是现实世界中的鬼魂,我不会在乎我和我所有的朋友是否都在联手搞一个吃豆人。

而不是 BFS 或 Dijkstra,我会使用深度优先搜索到深度 3 或 4,使用你的幽灵和 Pacman 在这个搜索树的叶子之间的笛卡尔距离,并选择最好的叶子的值直到根。对于一个小的前瞻,与 BFS 和 Dijkstra 相比,它的编码会更快、更容易。深度有限搜索应该为您的鬼魂提供非常智能的行为,假设您的游戏板没有螺旋走廊,其中逃离螺旋所需的移动次数大于 3 或 4。这也意味着算法的运行时间不会与 BFS 和 Dijkstra 一样,随着越来越大的板增加,再次假设您没有螺旋走廊。

于 2010-06-23T20:51:25.557 回答
1

我认为您保留了此网页上描述的寻路算法你提到的。这将使游戏感觉更真实。唯一的问题是确定有多少鬼魂追逐一个特定的吃豆人。我认为这种行为应该包括所有鬼都在追逐一个玩家的场景。因此,需要一种算法来确定是否有 1、2、3 或 4 个幽灵在追逐玩家。该算法可以基于玩家之间的点差。所以,领先的玩家会被更多的鬼追赶。该算法可能应该考虑玩家剩余的生命数量。因此,如果领先玩家的生命较少,算法应该延迟增加追赶领先玩家的幽灵数量。追逐玩家的鬼魂数量的变化频率也不应该太频繁。如果鬼改变被追逐的玩家太多,那么鬼似乎也不会真的在追逐。就像上面提到的网页一样,要获得良好的行为需要进行一些实验。我认为一开始保持简单是关键,因为有时可以通过使用一些简单的规则来实现复杂的外观行为。祝你好运,我很想看看你想出了什么。完成后请发链接!

于 2010-06-23T13:38:27.273 回答