我正在尝试在我的NetLogo游戏中加入某种形式的人工智能。
我计划计算从僵尸乌龟到人类乌龟的曼哈顿距离。
到目前为止,我已经成功计算了两个乌龟之间的曼哈顿距离,并绘制了路径,同时还让僵尸代理沿着计算出的路径向人类乌龟移动。
我现在面临的问题是,人类代理的位置将由用户控制。曼哈顿距离使用了一个while循环,并且在到达人类代理之前不会退出循环。我希望僵尸代理能够向人类代理移动一步,然后让人类代理移动。
目前的代码见NetLogo游戏
回答:
我不确定你在plot-manhattan-distance
过程中试图做什么。这似乎是对一个本应相对简单的问题采取了复杂的方法,但也许我误解了你的目的。以下是我对整个问题的处理方式:
globals [ zombie human]to setup clear-all ask n-of 2 patches [ sprout 1 ] set human turtle 0 ask human [ set shape "person" ] set zombie turtle 1 ask zombie [ pen-down ]endto go ask human [ flee zombie ] ask zombie [ pursue human ]endto pursue [ target ] face target set heading first sort-by [abs (?1 - heading) < abs (?2 - heading)] [0 90 180 270] fd 1endto flee [ pursuer ] face pursuer rt 180 fd 0.5end
关键在于pursue
过程。由于僵尸无法预测人类将要去哪里,它只是试图朝人类的大致方向移动。它首先直接面对人类(使用方便的NetLogo face
原语)。但由于它可能只能在四个基本方向上移动,它必须选择最理想的方向,即与当前(理想)航向差异最小的方向。这就是sort-by [abs (?1 - heading) < abs (?2 - heading)] [0 90 180 270]
表达式的作用:它通过比较它们与当前航向的绝对差异来对方向列表进行排序。这个排序列表的第一个项目将是差异最小的一个,因此,僵尸需要使用这个方向。
在当前的实现中,人类只是试图远离僵尸,但你可以轻松地用玩家控制代码替换它。