本文主要是介绍A* 寻路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
定义
寻路步骤
- 从起点A开始,把它作为待处理的方格存入到一个开启列表(开启列表就是一个等待检查方格的列表)
- 寻找起点A周围可以到达的方格,将它们存入到开启列表,并设置它们的父方格为A
- 从开启列表中删除起点A,并把A加入到关闭列表(关闭列表中存放的是不需要再次检查的方格)
- 从开启列表中选择 F 值最低的方格,进行移动,把最低的方格设置为当前点,设置当前点的父方格为 A,假设为P
- 把点 P 从开启列表中删除,并放到关闭列表中
- 检查点 P 所有相邻并且可以到达(障碍物和关闭列表的方格都不考虑)的方格,如果这些方格还不在开启列表中,则将它们加入到开启列表中,再分别计算这些方格的G H F 值,并设置它们的父方格为 P
- 如果某个相邻方格 D 已经在开启列表中,检查如果用新的路径(经过P点的路径)到达D的话,G的值是否会更低一些,如果新的 G 值更低,那就把它的父方格改为目前选中的方格 P,然后重新计算它的 F G值;但是如果新的 G 值比较高,就说明经过 P 再到达 D 不是一个正确的选择,此时我们什么也不做;
从开启列表中查找最靠谱的方块,需要通过公式 F=G+H 去计算; G 表示从起点 A 移动到网格上指定方格的移动耗费 (可沿斜方向移动).
H 表示从指定的方格移动到终点 B 的预计耗费 (H 有很多计算方法, 这里我们设定只可以上下左右移动).
伪代码
把起始格添加到 "开启列表"
do
{寻找开启列表中F值最低的格子, 我们称它为当前格.把它切换到关闭列表.对当前格相邻的8格中的每一个if (它不可通过 || 已经在 "关闭列表" 中){什么也不做.}if (它不在开启列表中){把它添加进 "开启列表", 把当前格作为这一格的父节点, 计算这一格的 FGHif (它已经在开启列表中){if (用G值为参考检查新的路径是否更好, 更低的G值意味着更好的路径){把这一格的父节点改成当前格, 并且重新计算这一格的 GF 值.}}
} while( 目标格已经在 "开启列表", 这时候路径被找到)
如果开启列表已经空了, 说明路径不存在.最后从目标格开始, 沿着每一格的父节点移动直到回到起始格, 这就是路径.
代码分析
启发值设计
具体实现
地图表示
github上有是实现代码,可以下载
这篇关于A* 寻路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!