我正在尝试实施Pacman。它工作正常,但到目前为止,鬼魂没有使用任何寻路,而是在每个路径交叉点上随机决定采用哪条路径。所以你可以想象Pacman赢得比赛并不是很困难;)
所以我在Pacman中阅读了一些关于路径查找算法的内容,在这里我发现了一个非常好的答案:Pathfinding Algorithm For Pacman
答案是指http://home.comcast.net/~jpittman2/pacman/pacmandossier.html#Chapter%204
这一切都很好,但在Pacman的实施中,有两个Pacman由两个不同的玩家玩。所以我想知道如何调整寻路算法,以便鬼魂并不总是追逐一个玩家。
关于如何修改算法的任何想法,以便幽灵对两个玩家或多或少都同等公平?
答案 0 :(得分:5)
我认为最简单的策略是让每个幽灵追逐最接近它的玩家。可以使用曼哈顿距离(在寻路问题中存在与其相关的链接)或欧几里德距离或通过玩家的路径长度来计算邻近度。最后一个选项意味着您必须计算两个玩家的路径。尝试所有这些选项,并根据自己的喜好选择一个。
另外,请注意。所有回答pathfinding question的人都没有提到Dijkstra's algorithm甚至比BFS慢:)但只允许搜索所有最短路径一次。也就是说,如果您实现A *或BFS并且具有 n 重影,您将至少进行 n 路径查找查询。使用Dijkstra,你只能从玩家开始做一次。但这一切都取决于。如果您的游戏区域太大,Dijkstra不是最佳选择。尝试,试验,也许它会适合你。
答案 1 :(得分:3)
(还没看过但是)我猜测所有幽灵算法的基础都是鬼魂和“玩家”的相对位置 - 好吧,只是让每个幽灵都改变主意关于这两个玩家中的哪一个它经常在其算法中用作“玩家”。
确定什么完全“每隔一段时间*意味着这将是一个游戏测试的问题 - 它应该是固定的时间表吗?每个幽灵都不一样?根据两者的相对接近程度而变化玩家?随机 - 在统一/泊松/其他分布上?
你可以看到许多可能性。请记住,你想要避免“太好”的行为和“过于愚蠢”的行为...
答案 2 :(得分:2)
如果你可以从任何一个Ghost查询任何一个Pacman的距离和方向,以及Ghosts(和Ghosts)当前正在追逐任何一个Pacman的数量,你应该能够做出一个非常好的和简单的AI一些创造力。
答案 3 :(得分:1)
我认为你保留了你提到的on this web page描述的寻路算法。这将使游戏感觉更加真实。那么唯一的问题是确定有多少鬼追逐特定的吃豆子。我认为这种行为应该包括所有鬼魂追逐一个玩家的场景。因此,需要一种算法来确定1,2,3或4个鬼魂是否在追逐玩家。该算法可以基于玩家之间的点差异。因此,领先的玩家将被更多的鬼魂追逐。算法应该考虑到玩家剩下的生命数量。因此,如果领先的玩家生命较少,则该算法应该延迟增加追逐玩家领先的鬼魂数量。追逐玩家的鬼魂数量的变化频率也不应经常发生。如果幽灵改变了被追逐的玩家太多,那么幽灵似乎也不会真正追逐。就像上面提到的网页一样,获得良好的行为需要进行一些实验。我认为一开始保持简单是关键,因为有时通过使用一些简单的规则可以实现复杂的外观行为。祝你好运,我很想看看你想出了什么。完成后请发布链接!
答案 4 :(得分:1)
我不知道这是否与你的“公平”概念相吻合,但我想有人想要防止一个玩家碰巧成为所有4个鬼魂的接近目标的情况,所以他们最终联合起来他和他一起跟随他,再也没有追逐过其他球员。这可能导致幽灵总是跟随最近的玩家。
你可能会考虑首先将2个鬼魂分配给玩家1和2个其他鬼魂给玩家2,然后让他们追逐他们的目标(并且每隔一段时间重新分配一次)。虽然,如果我是现实世界中的幽灵,我不会在意我和我的所有朋友是否正在联合起来。
而不是BFS或Dijkstra,我会使用深度优先搜索到深度3或4,使用你的幽灵和Pacman在这个搜索树的叶子之间的笛卡尔距离,并选择最佳叶子的值到根。对于小型前瞻,与BFS和Dijkstra相比,编码更快更容易。深度限制搜索应该为你的幽灵提供非常智能的行为,假设你的游戏板没有螺旋式走廊,其中逃离螺旋所需的移动次数大于3或4.这也意味着算法的运行时间不会与BFS和Dijkstra一样,随着越来越大的板块而增加,再次假设您没有螺旋式走廊。