漫画:什么是A*寻路算法?
比如像这样子:
第一步:把起点放入OpenList
第二步:找出OpenList中F值最小的方格,即唯一的方格Node(1,2)作为当前方格,并把当前格移出OpenList,放入CloseList。代表这个格子已到达并检查过了。
第三步:找出当前格上下左右所有可到达的格子,看它们是否在OpenList当中。如果不在,加入OpenList,计算出相应的G、H、F值,并把当前格子作为它们的“父亲节点”。
图中,每个格子的左下方数字是G,右下方是H,左上方是F。
Round2 ~ 第一步:找出OpenList中F值最小的方格,即方格Node(2,2)作为当前方格,并把当前格移出OpenList,放入CloseList。代表这个格子已到达并检查过了。
Round2 ~ 第二步:找出当前格上下左右所有可到达的格子,看它们是否在OpenList当中。如果不在,加入OpenList,计算出相应的G、H、F值,并把当前格子作为它们的“父亲节点”。
为什么这一次OpenList只增加了两个新格子呢?因为Node(3,2)是墙壁,自然不用考虑,而Node(1,2)在CloseList当中,说明已经检查过了,也不用考虑。
Round3 ~ 第一步:找出OpenList中F值最小的方格。由于这时候多个方格的F值相等,任意选择一个即可,比如Node(2,3)作为当前方格,并把当前格移出OpenList,放入CloseList。代表这个格子已到达并检查过了。
Round3 ~ 第二步:找出当前格上下左右所有可到达的格子,看它们是否在OpenList当中。如果不在,加入OpenList,计算出相应的G、H、F值,并把当前格子作为它们的“父亲节点”。
剩下的就是以前面的方式继续迭代,直到OpenList中出现终点方格为止。这里就仅用图片简单描述了,方格中数字表示F值:
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 listcloseList.add(current);// 找到所有邻近节点List<Node> neighbors = findNeighbors(current);for (Node node : neighbors) {if (!openList.contains(node)) {//邻近节点不在OpenList中,标记父亲、G、H、F,并放入OpenListmarkAndInvolve(current, end, node);}}//如果终点在OpenList中,直接返回终点格子if (find(openList, end) != null) {return find(openList, end);}}//OpenList用尽,仍然找不到终点,说明终点不可到达,返回空return null; }
几点说明:
1.这里对于A*寻路的描述做了很大的简化。实际场景中可能会遇到斜向移动、特殊地形等等因素,有些时候需要对OpenList中的方格进行重新标记。
2.截图中的小游戏可不是小灰开发的,而是一款经典的老游戏,有哪位小伙伴玩过吗?
漫画:什么是A*寻路算法?相关推荐
- 【Android】基于A星寻路算法的简单迷宫应用
简介 基于[漫画算法-小灰的算法之旅]上的A星寻路算法,开发的一个Demo.目前实现后退.重新载入.路径提示.地图刷新等功能.没有做太多的性能优化,算是深化对A星寻路算法的理解. 界面预览: 初始化: ...
- 漫画:什么是MD5算法?
来自:梦见(微信号:dreamsee321) 摘要哈希生成的正确姿势是什么样呢?分三步: 1.收集相关业务参数,在这里是金额和目标账户.当然,实际应用中的参数肯定比这多得多,这里只是做了简化. 2.按 ...
- 漫画:如何破解MD5算法?
来自:梦见(微信号:dreamsee321) 在之前的漫画中,我们介绍了MD5算法的基本概念和底层原理,没看过的小伙伴们可以点击下面的链接: 漫画:什么是MD5算法? 这一次,我们来讲解如何破解MD5 ...
- A*寻路算法的探寻与改良(三)
A*寻路算法的探寻与改良(三) by:田宇轩 第三分:这部分内容基于树.查找算法等对A*算法的执行效率进行了改良,想了解细 ...
- 关于A*寻路算法的认识
最近要参加学校的APP比赛,我们组做的是一个3D迷宫的小APP,我负责的是迷宫的生成与寻路. 寻路算法选择的是A*寻路算法,具体参考的是下面的这篇博客. 本文主要是谈谈自己对A*算法的理解,具体细节, ...
- 光速AStar寻路算法(C++)
光速AStar寻路算法(C++) 一.最终效果 可以看到,我创建了500个小动物,也有110的FPS.虽然它们并不是每一帧都在计算寻路,但是平均下来不卡顿也不错了.我是i7 6700 + GT 720 ...
- Cocos2d-x 寻路算法解析(一): 距离优先
寻路这块在游戏中一直很重要,花了点时间研究了下这个问题,主要参考的是<Data Structures For Game Programmers>,其他的算法用普通Console演示就行了, ...
- Cocos2d-x 寻路算法解析(二): 离目的地的距离优先
看这个图,我们发现这个寻路算法有点傻,明明终点在右侧却每个方向都找.难道没有其他办法了吗?从现实生活中我们知道东西如果在东边,当然是往东边搜索才是最好的办法. Figure 2 计算机中如何表示离目标 ...
- 寻路算法实例解析:贪吃蛇AI的实现
本文是寻路算法的实际应用篇,以贪吃蛇的实现为例子. 1.首先看下这个在微博上很火的贪吃蛇gif 这次我们尝试用代码来模拟下,说不定上面这个图就是计算机搞的. 2.讲贪吃蛇snake AI之前,我们先看 ...
- 游戏中常用的寻路算法的分享(4)处理移动中的障碍物
一个寻路算法会计算出一条绕过静止障碍物的路径,但如果障碍物会移动呢?当一个单位移动到达某特定点时,原来的障碍物可能不在那点了,或者在那点上出现了新的障碍物.如果路线可以绕过典型的障碍物,那么只要使用单 ...
最新文章
- 英语单词 factor cull
- SQL server 中SQL语句实战操作
- ajax返回的是流如何转换为pdf,如何在AJAX请求成功响应中返回PDF文件
- ASP.Net全局变量的设置和读取方法
- ASP.NET跨页面传值(二)
- ITK:在不复制内存的情况下为每个像素添加常量
- 使用 做签名的post_ASP.NET WebApi 基于分布式Session方式实现Token签名认证
- 项目实施双机热备备忘
- Visual Studio 2017发布会:黄金时代的家族聚会
- find linux 目录深度_浪里淘沙,详解Linux系统中Find命令的实用技巧
- Linux_创建母版,快速克隆,如何移动虚拟机.ziw
- c++ vector,list,deque,map,set,hash_map 特点及区别
- 知识图谱构建流程与实现技术浅谈
- 文曲星猜数字用c语言编程,文曲星中的猜数字游戏,要猜一个四位数,有什么通用公式?...
- 【Python】Windows微信清理工具
- 从招式与内功谈起——设计模式概述(三)
- “寻找下一代CTO”-- 机会啊
- Nuxt - 自定义页面布局,<Nuxt /> 个性化多套模板(一个项目内既要有用户正常浏览的普通页面,又要存在后台管理系统布局的页面)
- LeetCode刷题——36.有效的数独
- 超标量处理器设计——第二章_Cache