使用A*寻路小记
前几天做另一个DEMO 要用实现自动寻路功能,看到普遍都是A* 学习了下
我的主循环代码:
isFindEndPoint = false;
//主循环
do
{
CreateOutSkirtsNode(currpoint);//创建外围点
auto temppoint =SelectNextNode(currpoint);//从外围中选出下一个当前点
currpoint = temppoint;
SetNodeToSelection(currpoint);//将选定的当前点添加入_SelectCollection,并将其从_unSelectionCollection删除
} while (!isFindEndPoint/*如果终点出现在当前点的外围*/);
算法是封装在一个算法类中,使用时传入 几个参数就可以随意调用.
主循环就3件事:
1、创建外围点,即A点周围8个点,使用其坐标创建一个自定义类型MapNodeClass 这个类型存储算用到的一些关键信息。
比如 f g h x y Ispass parent ,H就是简单的用了 xy位移差, 相信看过A*的都懂,我的做法是当需要检测路径时才创建MapNodeClass 。
2、 从外围中选出下一个当前点
很好理解 根据f值 选定,其中牵扯到F值得更新问题,这个方法已经包装在MapNodeClass 中了
3、将选定的当前点添加入_SelectCollection,并将其从_unSelectionCollection删除
_SelectCollection 就是算法中的colseList 表示 不用再检索
_unSelectionCollection 就是openlist 表示待检索
都很好理解
---------------------
看上去差不多了,但是运行起来有问题。因为我的瓦片地图测试中 起点周围是一个胡同,所以会出现 指针为空的报错,一看都是出现在SelectNextNode()中的错误。
即第二个环节中,寻找到的当前点currpoint 为空。其原因就是算法陷入死路之后currpoint 外围并不存在openlist中的点,即找不到可以选择的点。
这种情况我看网上大多数A*介绍都没提到,没有说明死路状况。
其实一想,解决也简单,无非是倒退一步,从currpoint父节点执行一次SelectNextNode().所以要修改SelectNextNode()。
在其检测不到currpoint 外围节点时,直接把检测范围变成openlist,为什么不是父节点外围,主要是考虑到如果死胡同比较深的情况下检测父节点外围所检测的范围太大。
这里面需要注意的是:如果currpoint 存在外围节点时,会更新外围节点F值(主要是更新G值) ,而检测范围扩大时,则不能执行更新F值.
使用A*寻路小记的更多相关文章
- [原]Paste.deploy 与 WSGI, keystone 小记
Paste.deploy 与 WSGI, keystone 小记 名词解释: Paste.deploy 是一个WSGI工具包,用于更方便的管理WSGI应用, 可以通过配置文件,将WSGI应用加载起来. ...
- 一步一步开发Game服务器(五)地图寻路
目前大多数使用的寻路算法有哪些? 目前市面上大部分游戏的寻路算法是A*,或者B*. A*通常所说的是最优算法也就是寻找最短路径.B*碰撞式算法也就是,也就是不断的去碰撞能走就走,不管是不是绕路.当然以 ...
- A星寻路算法介绍
你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢? 如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! 在网上已经有很多篇关于A星寻路算法 ...
- 地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了
地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了 四叉树对于区域查询,效率比较高. 原理图
- MySql 小记
MySql 简单 小记 以备查看 1.sql概述 1.什么是sql? 2.sql发展过程? 3.sql标准与方言的关系? 4.常用数据库? 5.MySql数据库安装? 2.关键概念 表结构----- ...
- A*寻路算法探究
A*寻路算法探究 A*算法常用在游戏的寻路,是一种静态网路中求解最短路径的搜索方法,也是解决很多搜索问题的算法.相对于Dijkstra,BFS这些算法在复杂的搜索更有效率.本文在U3D中进行代码的测试 ...
- Git小记
Git简~介 Git是一个分布式版本控制系统,其他的版本控制系统我只用过SVN,但用的时间不长.大家都知道,分布式的好处多多,而且分布式已经包含了集中式的几乎所有功能.Linus创造Git的传奇经历就 ...
- 广州PostgreSQL用户会技术交流会小记 2015-9-19
广州PostgreSQL用户会技术交流会小记 2015-9-19 今天去了广州PostgreSQL用户会组织的技术交流会 分别有两个session 第一个讲师介绍了他公司使用PostgreSQL-X2 ...
- A*寻路算法
对于初学者而言,A*寻路已经是个比较复杂的算法了,为了便于理解,本文降低了A*算法的难度,规定只能横竖(四方向)寻路,而无法直接走对角线,使得整个算法更好理解. 简而言之,A*寻路就是计算从起点经过该 ...
随机推荐
- 恶补---bell数
定义 bell数即一个集合划分的数目 示例 前几项的bell数列为 1, 1, 2, 5, 15, 52, 203, 877, 4140, 21147, 115975 ,... 求值方法 1.bell ...
- 微信小程序-template模板
============================= 构建template模板 ============================= 1.分析得出共为 ...
- noip模拟赛 铺瓷砖
[问题描述]有一面很长很长的墙. 你需要在这面墙上贴上两行瓷砖. 你的手头有两种不同尺寸的瓷砖, 你希望用这两种瓷砖各贴一行.瓷砖的长可以用分数表示,贴在第一行的每块瓷砖长度为A/B贴在第二行的每块瓷 ...
- PageUtil ,简单的分页工具
public class PageUtil { private int totalCount;//总数 private int pageSize=10;//每页显示数量 private int cur ...
- RMAN RECOVERY
Data Recovery Advisor The health monitor and the ADR The capabilities and limitations of DRA using t ...
- Java Web文件下载
Web文件下载有两种.一种是文件在站点文件夹下.在浏览器中直接输入文件路径就可以下载.如http://www.xxx.com/file.zip.第二种是文件不在站点文件夹下或者文件是动态生成的(导出报 ...
- HDU 1973
Prime Path Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- 最全Pycharm教程(37)——Pycharm版本号控制之基础篇
1.主题 介绍Pycharm的版本号控制系统 2.准备工作 (1)Pycharm版本号为2.7或者更高 (2)已经创建一个project.參见Getting Started tutorial (3)安 ...
- 【JAVA】两点经纬度直线距离的计算
来自谷歌地图的计算公式: 通过JAVA的Math类各种方法调用.实现上述公式 private static double EARTH_RADIUS = 6378.137;// 单位千米 /** * 角 ...
- unity3D游戏开发实战原创视频讲座系列7之消消乐游戏开发
解说文件夹 第一讲 游戏介绍和资源简单介绍 第二讲 游戏场景背景的搭建 第三讲 游戏特效预制体的制作 第四讲 游戏场景前景的显示 第五讲 瓷砖背景块 第六讲 方块的消除 第七讲 方块的交 ...