A星寻路算法是一种计算最短路径的算法,通过遍历周围所有可以前进的点,计算出最优路径。
它吸取了Dijkstra 算法中的优点,为每个边长设置权值,不停的计算每个顶点到起始顶点的距离(G),以获得最短路线,同时也汲取贪婪最佳优先搜索算法中不断向目标前进优势,并持续计算每个顶点到目标顶点的距离(Heuristic distance),以引导搜索队列不断想目标逼近,从而搜索更少的顶点,保持寻路的高效。
1、将起点加入OpenList;
2、开始循环判断OpenList中是否有可前进的节点;
3、将F值最小的节点从OpenList取出,放入Close List;
4、判断该节点是否未终点,是则跳出循环,不是继续将该点周围可行进的节点添加到OpenList;
5、循环第3步直到查找到终点或遍历完所有OpenList;
f = g + h
f:寻路消耗;
g:离起点的移动消耗;G值的计算可以进行拓展
往上、下、左、右这4个格子走时,移动代价为10
往左上、左下、右上、右下这4个格子走时,移动代价为14;即走斜线的移动代价为走直线的1.4倍。
h:离终点的预估消耗,最常用最简单的方法就是使用曼哈顿距离进行预估
H = 当前方块到结束点的水平消耗 + 当前方块到结束点的垂直消耗
OpenList;用来存储可以前进并且没有计算过的节点。
Close List:用来存储不再考虑的节点。
- public List<AstarNode> FindPath(int _startX, int _startY, int _endX, int _endY)
- {
- List<AstarNode> _path = new List<AstarNode>();
- m_openList.Clear();
- closeList.Clear();
- bool findPathFlag = false;
-
- AstarNode currNode = null;
- addToOpenList(null, _startX, _startY, _endX, _endY);//将起点加入OpenList;
-
- while (m_openList.Count > 0)
- {
- currNode = OpenList[0];//取F值最小的节点
- m_openList.Remove(currNode);//将当前节点移出OpenList
- closeList.Add(currNode);//将当前节点加入CloseList
- if (currNode == null)
- {
- break;
- }
-
- if (currNode.X == _endX && currNode.Y == _endY)//如果找到重点,退出循环
- {
- findPathFlag = true;
- break;
- }
-
- genAroundNode(currNode, _endX, _endY);//将周围满足条件的节点加入OpenList
- }
- if (!findPathFlag)
- {
- currNode = findNearPointFromList(closeList, endX, endY);//如果没有找到终点,在CloseList找一个最近的点。
- }
- if (currNode == null)
- {
- return null;
- }
- while (true)//递归父节点,找到所有路径
- {
- _path.Add(currNode);
-
- if (currNode.X == _startX && currNode.Y == _startY)
- {
- break;
- }
- currNode = currNode.Parent;
- }
-
- _path.Reverse();
-
- return _path;
-
- }
A星寻路算法Demo
https://download.csdn.net/download/qq_33461689/14928453