Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 吃豆人鬼AI_Java_Artificial Intelligence_Pacman - Fatal编程技术网

Java 吃豆人鬼AI

Java 吃豆人鬼AI,java,artificial-intelligence,pacman,Java,Artificial Intelligence,Pacman,我目前正在用java制作一个吃豆人游戏。不过我有一个关于鬼魂的问题 我知道鬼魂的攻击方式不尽相同。我首先要做的是让鬼魂追上吃豆人的基础工作,而不必担心会有什么不同 我想问你们这些聪明人,什么是让鬼魂追逐吃豆人的最好方法,但有时会随机改变路径。我目前正在使用一个21乘21的2D阵列来告诉墙在哪里,所以我想让它更努力,并前往pacman的当前网格位置。(例如转到10,14)当然要避免像吃豆人一样穿过墙壁。我想知道我怎样才能让它做到这一点,同时也让鬼魂有时停下来,朝另一个方向或别的什么方向走,这样就不

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

我知道鬼魂的攻击方式不尽相同。我首先要做的是让鬼魂追上吃豆人的基础工作,而不必担心会有什么不同

我想问你们这些聪明人,什么是让鬼魂追逐吃豆人的最好方法,但有时会随机改变路径。我目前正在使用一个21乘21的2D阵列来告诉墙在哪里,所以我想让它更努力,并前往pacman的当前网格位置。(例如转到10,14)当然要避免像吃豆人一样穿过墙壁。我想知道我怎样才能让它做到这一点,同时也让鬼魂有时停下来,朝另一个方向或别的什么方向走,这样就不会总是不断地追逐,而吃豆人有机会逃脱。也许你们中的一些人已经编写了一个吃豆人游戏,或者只是知道一个好方法。任何帮助都将不胜感激


(请注意,我目前正在上一门11年级的计算机科学课程,学习java的第一学期已经过了一半。)

我发现这篇文章非常有用:,因为它正好解释了你需要什么。

如果你只是想让鬼魂的行为不尽相同,那么每当它们遇到十字路口时,让他们的决定随机混合一些合理的追逐默认值(例如继续走到Pacman的最短距离的路-对所有继任者使用以选择最好的一个)和随机选择。

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

如果您有一个数组
steps
,其中第一个
n\u closing\u in
步骤表示将使幽灵更接近Pacman的步骤,那么您可以使用

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;
}
如果迷宫不是太复杂,并且接近的概率是
.5
,鬼魂看起来会追逐吃豆人,但是以一种偶然的方式

1方向提升
prob\u closing\u in
将使游戏更加困难


(以上所有代码都未经测试,可能包含bug。我不太擅长Java。)

对于我的大学级人工智能课程,我使用了一个较旧版本的Pacman Ghost人工智能框架。看起来可以在这里找到当前版本。在这里,您将开发自己的Ghost代理,以尝试捕获代理或用户控制的Pacman

这在使用不同的人工智能技术时非常有用

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

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


这种人工智能最简单的实现就是使用一种简单的图形搜索算法。BFS将是一个简单的工作。不过,您当然希望实现一种启发式方法来更好地优化运行时,所以从ghost代理到Pac man的简单曼哈顿距离就足够了

小结:带曼哈顿距离启发式的BFS


如果你想变得更有趣,让你的鬼魂在狩猎时更加高效,你可以实现一个游戏状态启发式(基于鬼魂到吃豆人的距离,以及吃豆人到目前为止吃了多少点,例如),当鬼魂必须选择下一步行动时使用。在这种情况下,你可以用它来缩短运行时间。

对于我们这些抵制盎格鲁萨克索堡同化的人来说,11年级是什么?@larsmans这是高中三年级的课程,虽然我在高中二年级,但我迫不及待地想上这门课。我可以在你的用户资料中看到这一点,当然:)是的,我知道每个鬼魂都有自己的行为,但我们根本不希望在我参与的课程中编写如此复杂的游戏。我只是想先添加一个基本的Chase系统,而不是这种先进的方法。看看它,但请考虑我的技术水平。我认为该网站是不活跃的。还有其他地方可以找到框架吗?jumpnett。你有更新的链接吗?你把我弄丢了。我以前从未学习过步骤。@Fogest:我一直在思考
enum Step{LEFT,RIGHT,UP,DOWN}
@Fogest:我的意思是你应该以某种方式表示可能的步骤。我假设您有一个类型
步骤
,它可能是
枚举
。这其实并不重要,只要你有某种方式来表示信息,一个步骤可以是左、右、上或下。你甚至可以使用
int
来实现这个目的。你看,我不知道什么是步骤,什么是类或枚举。还没学过呢。@Fogest:在你当地的图书馆里找一本关于Java的书,然后查找课程。它们非常基本。(我打赌你很快就会了解他们。)所以你的话让他们从十字路口随机选择一个转弯,但更可能他们会朝着吃豆人要去的方向走?@Fogest完全正确。防止鬼魂聚集但使游戏有趣的值必须通过实验确定(取决于迷宫的形状),但我猜50%的随机选择-50%的最短路径会给出可接受的结果。好吧,我喜欢这个想法,并且很可能会使用类似于这个或@larsmans答案的东西。
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];
}