5

什么是A*寻路算法?

 3 years ago
source link: https://www.cxyxiaowu.com/3437.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
什么是A*寻路算法?-吴师兄学编程
当前位置:吴师兄学编程 > 算法 > 漫画算法 > 什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

比如像这样子:

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

第一步:把起点放入OpenList

什么是A*寻路算法?

第二步:找出OpenList中F值最小的方格,即唯一的方格Node(1,2)作为当前方格,并把当前格移出OpenList,放入CloseList。代表这个格子已到达并检查过了。

什么是A*寻路算法?

第三步:找出当前格上下左右所有可到达的格子,看它们是否在OpenList当中。如果不在,加入OpenList,计算出相应的G、H、F值,并把当前格子作为它们的“父亲节点”。

什么是A*寻路算法?

图中,每个格子的左下方数字是G,右下方是H,左上方是F。

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

Round2 ~ 第一步:找出OpenList中F值最小的方格,即方格Node(2,2)作为当前方格,并把当前格移出OpenList,放入CloseList。代表这个格子已到达并检查过了。

什么是A*寻路算法?

Round2 ~ 第二步:找出当前格上下左右所有可到达的格子,看它们是否在OpenList当中。如果不在,加入OpenList,计算出相应的G、H、F值,并把当前格子作为它们的“父亲节点”。

什么是A*寻路算法?

为什么这一次OpenList只增加了两个新格子呢?因为Node(3,2)是墙壁,自然不用考虑,而Node(1,2)在CloseList当中,说明已经检查过了,也不用考虑。

Round3 ~ 第一步:找出OpenList中F值最小的方格。由于这时候多个方格的F值相等,任意选择一个即可,比如Node(2,3)作为当前方格,并把当前格移出OpenList,放入CloseList。代表这个格子已到达并检查过了。

什么是A*寻路算法?

Round3 ~ 第二步:找出当前格上下左右所有可到达的格子,看它们是否在OpenList当中。如果不在,加入OpenList,计算出相应的G、H、F值,并把当前格子作为它们的“父亲节点”。

什么是A*寻路算法?

剩下的就是以前面的方式继续迭代,直到OpenList中出现终点方格为止。这里就仅用图片简单描述了,方格中数字表示F值:

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

什么是A*寻路算法?

public Node aStarSearch(Node start, Node end) {
// 把起点加入 open list  
   openList.add(start);
//主循环,每一轮检查一个当前方格节点
   while (openList.size() > 0) {
// 在OpenList中查找 F值最小的节点作为当前方格节点
       Node current = findMinNode();
// 当前方格节点从open list中移除
       openList.remove(current);
// 当前方格节点进入 close list
       closeList.add(current);
// 找到所有邻近节点
       List<Node> neighbors = findNeighbors(current);
for (Node node : neighbors) {
if (!openList.contains(node)) {
//邻近节点不在OpenList中,标记父亲、G、H、F,并放入OpenList
               markAndInvolve(current, end, node);
}
}
//如果终点在OpenList中,直接返回终点格子
       if (find(openList, end) != null) {
return find(openList, end);
}
}
//OpenList用尽,仍然找不到终点,说明终点不可到达,返回空
   return null;
}

什么是A*寻路算法?

几点说明:

1.这里对于A*寻路的描述做了很大的简化。实际场景中可能会遇到斜向移动、特殊地形等等因素,有些时候需要对OpenList中的方格进行重新标记。

2.截图中的小游戏可不是小灰开发的,而是一款经典的老游戏,有哪位小伙伴玩过吗?

—————END—————

喜欢本文的朋友们,欢迎长按下图关注订阅号梦见,收看更多精彩内容

什么是A*寻路算法?

原文始发于微信公众号(程序员小灰):什么是A*寻路算法?


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK