游戏中的人物是如何寻路的? (3)

好啦,咱们来看看具体点的例子。在初始时的 9 个方块中,当开始方格被加到封闭 列表后,开放列表里还剩 8 个方格。在这八个方格当中,位于起点方格右边的那个 方格具有最小的 F 值 40。所以我们选择这个方格作为下一个中心方格。下图中它以 高亮的蓝色表示。

游戏中的人物是如何寻路的?

首先,我们将选中的方格从开放列表中移除,并加入到封闭列表中(所以用亮蓝色 标记)。然后再检验它的相邻节点。那么在它紧邻的右边的方格都是墙,所以不管它 们。左边挨着的是起始方格,而起始方格已经在封闭列表中了,所以我们也不管它。

其他四个方格已经在开放列表中,那么我们就要检验一下如果路径经由当前选中方 格到那些方格的话会不会更好,当然,是用 G 值作为参考。来看看选中方格右上角 的那一个方格,它当前的 G 值是 14,如果我们经由当前节点再到达那个方格的话, G 值会是 20(到当前方格的 G 值是 10,然后向上移动一格就再加上 10)。为 20 的 G 值比 14 大,因此这样的路径不会更好。你看看图就会容易理解些。显然从起始点 沿斜角方向移动到那个方格比先水平移动一格再垂直移动一格更直接。

当我们按如上过程依次检验开放列表中的所有四个方格后,会发现经由当前方格的 话不会形成更好的路径,那我们就保持目前的状况不变。现在我们已经处理了所有 相邻方格,准备到下一个方格吧。

我们再遍历一下开放列表,目前只有 7 个方格了。我们挑个 F 值最小的吧。有趣的 是,目前这种情况下,有两个 F 值为 54 的方格。那我们怎么选择呢?其实选哪个都 没关系,要考虑到速度的话,选你最近加到开放列表中的那一个会更快些。当离目 的地越来越近的时候越偏向于选最后发现的方格。实际上这个真的没关系(对待这 个的不同造成了两个版本的 A*算法得到等长的不同路径)。

那我们选下面的那个好了,就是起始方格右边的,下图所示的那个

游戏中的人物是如何寻路的?

这一次,在我们检验相邻方格的时候发现右边紧挨的那个是墙,就不管它了。上面 挨着的那个也同样忽略。还有右边墙下面那个方格我们也不管。为什么呢?因为你 不可能切穿墙角直接到达那个格子。实际上你得先向下走然后再通过那个方格。这 个过程中是绕着墙角走。(注意:穿过墙角的这个规则是可选的,取决于你的节点是 如何放置的。)

那么还剩下其他五个相邻方格。当前方格的下面那两个还不在开放列表中,那我们 把它们加进去并且把当前方格作为它们的父方格。其他三个中有两个已经在封闭列 表中了(两个已经在图中用亮蓝色标记了,起始方格,上面的方格),所以就不用管 了。最后那个,当前方格左边挨着的,要检查一下经由当前节点到那里会不会降低 它的 G 值。结果不行,所以我们又处理完毕了,然后去检验开放列表中的下一个格 子。

重复这个过程直到我们把目的方格加入到开放列表中了,那时候看起来会像下图这个样子。

游戏中的人物是如何寻路的?

注意到没?起始方格下两格的位置,那里的格子已经和前一张图不一样了。之前它 的 G 值是 28 并且指向右上方的那个方格。现在它的 G 值变成了 20 并且指向了正上 方的方格。这个改变是在搜索过程中,它的 G 值被核查时发现在某个新路径下可以 变得更小时发生的。然后它的父方格也被重设并且重新计算了 G 值和 F 值。在本例 中这个改变看起来好像不是很重要,但是在很多种情况下这种改变会使到达目标的 最佳路径变得非常不同。

那么我们怎样来自动得出实际路径的呢?很简单,只要从红色目标方格开始沿着每一 个方格的指针方向移动,依次到达它们的父方格,最终肯定会到达起始方格。那就 是你的路径!如下图所示。从 A 方格到 B 方格的移动就差不多是沿着这个路径从每 个方格中心(节点)移动到另一个方格中心,直到抵达终点。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxpwg.html