嗨!大家好,我是小蚂蚁。
上一节里我们详细讲解了A*寻路算法的原理,这一节我们就在微信小游戏制作工具中实现一下这个算法。
几个概念
在正式开始之前,我们还是先了解几个重要的概念,以便于接下来你能够顺畅的阅读理解。
估值函数
用于计算寻路过程中的节点的估值,每轮查找算法都会选择估值最小的节点,然后以它为中心继续查找。
开放列表(OpenList)
保存的是当前需要关注的点,一般指的是当前寻路点周围的那些相邻的节点。
关闭列表(CloseList)
保存的是已经被处理过的节点,即以一个点为中心查找周围的一圈节点,查找完成之后,这个位于中心的节点就会被放到关闭列表中。
如图,假设这一轮查找以 5 号节点为中心,查找其周围一圈相邻的节点,查找完成后,开放列表和关闭列表就是右图的状态,然后接下来要做的,就是从开放列表中找出估值最小的节点,然后以其为中心继续查找周围的节点.....一直重复这个过程,直到最终找到目标节点为止。
A*寻路算法的描述
这里我们使用 OpenList 表示开放列表,CloseList 表示关闭列表,节点的实际代价用 g(n) 表示,估值用 f(n) 表示,然后使用伪代码来详细的描述一下 A*算法的整个执行过程。
*初始化清空OpenList和CloseList列表; *将起点加入OpenList中,并设置估值为0(估值最小); *如果OpenList不为空,则从OpenList中选取估值最小的节点n: *如果节点n为终点,则: *从终点开始逐步追踪父节点,一直达到起点; *返回找到的结果路径,算法结束; *如果节点n不是终点,则: *将节点n从OpenList中删除,并加入CloseList中; *遍历节点n所有的邻近节点: *如果邻近节点m在CloseList中,则: *跳过,选取下一个邻近节点 *如果邻近节点m在OpenList中,则: *计算并判断节点m的新的g(n)值是否小于原来的g(n)值,如果小于,则重新设置节点m的g值,f值和父节点等数据 *如果邻近节点m不在OpenList中,则: *设置节点m的父节点为节点n *计算节点m的估值f(n) *将节点m加入OpenList中 *如果OpenList为空,则所有节点查找完毕,没有找到合适路径;
以上就是整个寻路算法的执行过程了,其实并不复杂,如果能够把这个过程理解透彻了,那接下来做的时候就会简单很多。
该教程为付费教程,剩余部分可前往公众号文章中阅读。