我目前正在使用java进行pacman游戏。我对鬼有疑问。
我知道鬼魂并不都有同样的攻击方式。我首先要研究让幽灵去追逐pacman的基础知识,而不是担心会出现差异。
我向你提出的问题聪明的人有什么最好的办法让幽灵追逐吃豆子,但有时会随机转移路径。我目前正在使用一个21乘21的二维阵列来说明墙壁的位置,所以我正在考虑让它更多尝试并前往pacman的当前网格位置。 (例如,转到10,14)当然,虽然避免穿过像pacman这样的墙。我想知道我怎么能做到这一点,并且鬼魂有时会停下来并朝着另一个方向或某个方向发展,以至于它并不总是一直追逐而且pacman有机会逃脱。也许你们中的一些人编写了一个pacman游戏,或者只是知道一个很好的方法。任何帮助将不胜感激。
(请注意我目前正在读11年级的计算机科学课程,并且在学习java的第一学期中途。)
答案 0 :(得分:6)
如果你只是希望幽灵并非所有人都表现相同,那么每次他们遇到一个交叉点时,都要将他们的决定随意混合一些合理的追逐默认值(例如继续使用距离Pacman最短的距离 - 使用{{ 3}}关于选择最佳选择的所有后继者和随机选择。
答案 1 :(得分:4)
我发现这篇文章非常有用:Understanding Pac-Man Ghost Behavior,因为它解释了你需要什么。
答案 2 :(得分:4)
这是一种可能性:对于幽灵可以采取的所有步骤,计算该步骤是否会使它更接近Pacman。这可以使用Manhattan distance完成,{2}网格中的x
距离+ y
距离。然后随机选择一个步骤,将更高的概率分配给那些实际上会更接近的步骤。
如果您有一个数组steps
,其中第一个n_closing_in
步骤表示将幽灵更接近Pacman的步骤,那么您可以将这些概率分配给prob_closing_in
< / p>
double total_probility = 1.;
for (int i=0; i<n_closing_in; i++) {
step_prob[i] = prob_closing_in / n_closing_in;
total_probability -= prob_closing_in / n_closing_in;
}
然后同样分发total_probability
中剩下的那些将使幽灵远离Pacman的步骤。
Step random_step(Step[] possible_steps, double[] step_prob) {
double r = Math.random();
int i;
for (i=0; i<possible_steps.length(); i++) {
if (r < step_prob[i])
break;
r -= step_prob[i];
}
return possible_steps[i];
}
如果迷宫不是太复杂而且关闭的可能性是>.5
,那么幽灵似乎会追逐吃豆子,但却是偶然的。
将prob_closing_in
提升到1.
将使游戏更加困难。
(以上所有代码都是未经测试的,可能包含错误。我不太擅长Java。)
答案 3 :(得分:1)
对于我的大学级AI课程,我使用较旧版本的Pacman Ghost AI框架进行了一些工作。看起来可以在http://www.pacman-vs-ghosts.net/software (Now DEAD)找到当前版本。在此,您将开发自己的Ghost代理,以尝试捕获代理或用户控制的Pacman。
这对于玩不同的AI技术非常有用。
更多问题,该框架中的级别实际上是由图形而不是2d数组构建的。您可以查看代码,看看他们是如何做到的。
原来的链接已经死了,到目前为止还没有找到官方镜像。但是,以下内容可能会有所帮助:
Understanding Pac Man Ghost Behavior Ms Pac Man Vs Ghost AI (GitHub) PacMan_v6.2 (GitHub)
答案 4 :(得分:0)
这种AI的最简单实现是使用朴素图搜索算法。 BFS将是一个简单的工作。但是,你想要实现一个启发式算法来更好地优化运行时,所以从ghost代理到Pac-man的简单曼哈顿距离就足够了。
摘要:具有曼哈顿距离启发式的BFS。
如果你想获得更好的体验,并让你的鬼魂在狩猎时更加高效,你可以实施游戏状态启发式(基于从幽灵到吃豆人的距离,以及Pac-man到目前为止吃了多少点,例如,当鬼必须选择下一步采取的时候使用。在这种情况下,您可以使用pruning techniques缩短运行时间。