众所周知,A*寻路是用来计算行进路径的,通过它可以计算出避开阻挡到达终点的最短路径。基本原理也很简单,就是遍历周围所有可以行进的点选出一个最优点再次遍历,直到到达终点。
A*寻路有一套固定的公式:f = g + h
f:寻路消耗;g:离起点的距离;h:离终点的距离
如何计算G值
顾名思义,G是离起点的距离,就是从起点到达格子要走的距离,比如从起点到上、下、左、右四个点都是紧挨着起点,距离可以用1来表示,左上、左下、右上、右下这种顶点相邻的格子,根据勾股定理可以判断出距离为√2约等于1.4。
如何计算H值
H值的计算通过曼哈顿街区算法判定,即从该格子走到终点一共需要走多少个格子。
A*算法还需要两个列表:开启列表和关闭列表
开启列表:用来存储可以考虑行进的格子。
关闭列表:用来存储不再考虑的格子。
A*寻路伪代码
1、将起点记录为当前点a
2、将当前点a放入关闭列表,并设置父对象为空
3、将当前点a周围所有能行进的格子放入开启列表,如果周围的点已经在开启列表或者关闭列表中,就不用管它了
4、记录当前点a周围所有能行进的格子的F值和父对象(父对象为当前点)
5、寻找最优点将其放入关闭列表,每次往关闭列表放点时,要判断该点是否为终点,如果是证明路径已经找完了,跳到步骤8,如果不是继续步骤6
6、将最优点作为起点b
7、跳回步骤3
8、找到终点,寻路结束
确定路径
那么寻路结束后要怎么确定路径呢?虽然最优点都在关闭列表中,但是并不能直接使用关闭列表中的点作为路径,而是在关闭列表中从终点开始查找父对象,再查找父对象的父对象。。。直到找到父对象为空。
特殊情况,判断死路
当开放列表为空时,说明找遍了所有的点没有到达终点,说明是死路,寻路失败
DEMO下载链接
链接: A*寻路DEMO.