所以我最近在我的手机上玩了很多pacman,并且想知道鬼魂是如何独立工作的。我在考虑如何编程。
我想到的一个选择是线程。所有4个幽灵都在自己的线程中运行,并以某种方式找到了pacman的位置。但是有四个线程正在工作并且同步会很困难似乎有点太多了。此外,谷歌在Javascript中写了pacman,它不支持线程,所以它可以在没有线程的情况下完成,并且必须有一个更简单的方法。
我的第二个想法是事件处理程序。我只是将pacman将触发的'directionChanged'事件连接到4个事件处理程序,每个鬼程一个。然后每个幽灵决定走向pacman的路径。我认为这更有可能发生了什么。但是如果事件处理程序是同步执行的话,它会变慢,因为路径必须按顺序计算,第4个鬼魂需要时间来改变方向,这可能会产生可见的滞后(可能)。此外,当他们撞墙时,鬼魂会自己发射一个事件,他们的事件处理程序会改变鬼魂的方向。但考虑到pacman改变方向的频率和四个鬼的响应,事件处理程序似乎也有点过分。
我说上述想法会有点太多,因为记得游戏是30年前编写的,当时间和内存都很少,所以我认为必须有一个更简单的方法。
此外,即使pacman还在,鬼似乎也在追随着不同的道路。所有鬼魂都使用完全不同或不同优化的路径寻找算法吗?
我更感兴趣的是找出所有鬼魂似乎同时为他们自己的工作方式而不是他们使用的路径查找算法。想法?
答案 0 :(得分:13)
关于pacman如何工作here有很多很好的信息,包括一些关于鬼行为的详细写作。
**注意我前一段时间Pathfinding Algorithm For Pacman发现了这些信息。
编辑:
此博客post提供了有关幽灵的更多信息。
答案 1 :(得分:6)
你非常想过这个。
根据视频游戏标准,线程和事件处理程序非常慢。多线程游戏引擎是一项相对较新的发明,几乎在Pacman发布数十年之后。 Pacman的微弱逻辑将出现在一个相当紧凑的循环中,类似于这个非常简化的伪代码:
while (!pacman_dead) {
foreach ghost {
if (ghost has hit a wall) {
if (pacman to left) turn left
if (pacman to right) turn right
} else {
go straight
if (ghost touched pacman) {
pacman_dead = true
}
}
}
handle_input();
move_pacman();
draw_screen();
}
这在游戏中是一种相当常见的模式,它给出了并发的外观。通常情况下,游戏将在单个循环中运行,这会使游戏状态在屏幕重绘之间的空间中稍微增加一些。这就是为什么性能在游戏开发中仍然非常重要的原因:你的游戏必须遍历每个需要做某事或做出决定的游戏内对象(AI控制的对手,移动平台,简单的动画,等)并且每秒至少更新他们的状态30次。
答案 2 :(得分:1)
在渲染每一帧之前,我会遍历幽灵。没有事件,线程或异步问题。每个幽灵都可能有一个非常粗略的启发式,用于评分其动作并下定决心(左转或右转,不动作,whatev)。
Here's an implementation你可以看看。 :)