从零开始为《吃豆人》创建BT
这一次我们对《吃豆人》游戏创建一组逐渐复杂的BT。
如图所示BT通过包含多个幽灵和大量药丸的迷宫控制智能体,即吃豆人,这些药丸中大的药丸就是说为的大力丸。游戏的目的就是吃豆人吃完所有的药丸,而不被幽灵吃掉。如果吃了大力丸就会暂时获得可以吃掉幽灵的能力。吃过大力丸以后过了一段时间,大力丸的效果会消失,幽灵可以重新获得吃掉吃豆人的能力。当幽灵被吃掉的时候它会回到中间的盒子里,在那里复活,并再次变得危险,可以被吃的幽灵会改变颜色,当大力丸的持续时间快要结束时,幽灵会变得闪烁。
最简单的行为就是让吃豆人忽略幽灵,专注于吃豆子,这是使用贪婪的动作——“吃药丸” 完成的!
吃药丸是BT最简单的非随机行为,可以最大化下一个时间步长中“吃药丸”的数量
上述描述的简单行为忽略了幽灵。考虑到幽灵,可以扩展前面的行为,当条件“幽灵靠近”为真时添加执行“躲避幽灵”的动作。这个动作可以贪婪的最大化吃豆人和所有幽灵之间的距离。那么可以将新的动作和条件添加到BT中,如下图所示。由此产生的BT将在吃药丸和躲避幽灵之间切换,这取决于幽灵靠近条件返回“成功”还是“失败”。
下一步扩展考虑当吃豆人吃了大力丸,就可以吃幽灵,并且希望此时去追踪幽灵而不是躲避。为此将条件不害怕幽灵和动作追逐幽灵添加到BT中。如下图所示。追逐幽灵的动作可以最大限度的减少与最近可吃的幽灵之间的距离。注意如此的设计的BT只会在距离幽灵近的时候才会开始追逐它,否则就会继续吃药丸。还需要注意的是所有扩展都是模块化的,不需要重新连接以前的BT。
通过这种增量设计,可以得到一个基本的吃豆人AI,但是还是有很多细节没有考虑进去,比如当被追赶时朝着大力丸移动,当幽灵闪烁时不在追逐幽灵等。然而吃豆人的很多细节都是基于对迷宫的几何形状的考虑,例如选着避免死胡同的路径和避免可能被多个幽灵追击的路径。这种空间分析最好在动作内部进行。