8

我目前正在用java制作一个吃豆人游戏。不过,我有一个关于鬼魂的问题。

我知道鬼的攻击方式并不完全相同。我首先想研究让幽灵追捕吃豆人的基础知识,而不是担心存在差异。

我对你们聪明人的问题是,让鬼魂追逐吃豆人但有时会随机改变路径的最佳方法是什么。我目前正在使用 21 x 21 2D 数组来判断墙壁的位置等等,所以我想让它更多地尝试并前往 pacman 的当前网格位置。(例如转到 10,14)当然,同时避免像吃豆人一样穿过墙壁。我想知道我怎样才能让它做到这一点,并且有时鬼魂会停下来并转向另一个方向或其他东西,这样它并不总是一个持续的追逐并且吃豆人有机会逃脱。也许你们中的一些人已经编写了一个吃豆人游戏,或者只是知道一个好的方法。任何帮助将不胜感激。

(请注意,我目前正在学习 11 年级的计算机科学课程,并且正在学习 Java 的第一学期。)

4

5 回答 5

6

如果你只是想让幽灵的行为不一样,每次他们遇到交叉路口时,让他们的决定随机混合一些合理的追逐默认值(例如继续以最短距离到 Pacman 的方式 -对所有后继者使用Dijkstra 算法选择最好的)和随机选择。

于 2011-11-15T18:48:24.453 回答
4

我发现这篇文章很有帮助:了解吃豆人幽灵行为,因为它解释了你需要什么。

于 2011-11-15T18:34:16.450 回答
4

这是一种可能性:对于幽灵可以采取的所有步骤,计算该步骤是否会使它更接近吃豆人。这可以通过曼哈顿距离来完成,在二维网格中就是x距离 +y距离。然后随机选择一个步骤,将更高的概率分配给那些实际上会更接近它的步骤。

如果您有一个数组steps,其中的n_closing_in第一步表示将使幽灵更接近 Pacman 的步骤,那么您可以将这些总概率分配prob_closing_in

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到将使幽灵离吃豆人更远的步骤上。

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。)

于 2011-11-15T18:50:15.253 回答
1

对于我的大学水平 AI 课程,我使用旧版本的 Pacman Ghost AI 框架做了一些工作。看起来当前版本可以在这里找到http://www.pacman-vs-ghosts.net/software (Now DEAD)。在这种情况下,您将开发自己的 Ghost 代理来尝试捕获代理或用户控制的 Pacman。

这在使用不同的 AI 技术时非常有用。

对于您的问题,该框架中的级别实际上是由图形而不是二维数组构建的。你可以看一下代码,看看他们是如何做到的。

原链接失效了,目前还没有找到官方镜像。但是,以下内容可能会有所帮助:

了解 Pac Man Ghost 行为 Ms Pac Man Vs Ghost AI (GitHub) PacMan_v6.2 (GitHub)

于 2011-11-15T18:51:46.147 回答
0

这种人工智能的最简单实现是使用简单的图搜索算法。BFS 将是一个简单的工作。但是,您当然希望实施启发式算法以更好地优化运行时间,因此从幽灵代理到吃豆人的简单曼哈顿距离就足够了。

摘要:具有曼哈顿距离启发式的 BFS。

如果你想变得更漂亮,让你的幽灵在狩猎时更有效率,你可以实现一个游戏状态启发式(基于幽灵到吃豆人的距离,以及到目前为止吃豆人吃了多少个点,例如)用于当幽灵必须选择下一步采取的行动时。在这种情况下,您可以使用修剪技术来缩短运行时间。

于 2016-04-26T21:52:43.893 回答