前几天做另一个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*寻路小记的更多相关文章

  1. [原]Paste.deploy 与 WSGI, keystone 小记

    Paste.deploy 与 WSGI, keystone 小记 名词解释: Paste.deploy 是一个WSGI工具包,用于更方便的管理WSGI应用, 可以通过配置文件,将WSGI应用加载起来. ...

  2. 一步一步开发Game服务器(五)地图寻路

    目前大多数使用的寻路算法有哪些? 目前市面上大部分游戏的寻路算法是A*,或者B*. A*通常所说的是最优算法也就是寻找最短路径.B*碰撞式算法也就是,也就是不断的去碰撞能走就走,不管是不是绕路.当然以 ...

  3. A星寻路算法介绍

    你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢? 如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! 在网上已经有很多篇关于A星寻路算法 ...

  4. 地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了

    地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了 四叉树对于区域查询,效率比较高. 原理图

  5. MySql 小记

    MySql  简单 小记 以备查看 1.sql概述 1.什么是sql? 2.sql发展过程? 3.sql标准与方言的关系? 4.常用数据库? 5.MySql数据库安装? 2.关键概念 表结构----- ...

  6. A*寻路算法探究

    A*寻路算法探究 A*算法常用在游戏的寻路,是一种静态网路中求解最短路径的搜索方法,也是解决很多搜索问题的算法.相对于Dijkstra,BFS这些算法在复杂的搜索更有效率.本文在U3D中进行代码的测试 ...

  7. Git小记

    Git简~介 Git是一个分布式版本控制系统,其他的版本控制系统我只用过SVN,但用的时间不长.大家都知道,分布式的好处多多,而且分布式已经包含了集中式的几乎所有功能.Linus创造Git的传奇经历就 ...

  8. 广州PostgreSQL用户会技术交流会小记 2015-9-19

    广州PostgreSQL用户会技术交流会小记 2015-9-19 今天去了广州PostgreSQL用户会组织的技术交流会 分别有两个session 第一个讲师介绍了他公司使用PostgreSQL-X2 ...

  9. A*寻路算法

    对于初学者而言,A*寻路已经是个比较复杂的算法了,为了便于理解,本文降低了A*算法的难度,规定只能横竖(四方向)寻路,而无法直接走对角线,使得整个算法更好理解. 简而言之,A*寻路就是计算从起点经过该 ...

随机推荐

  1. 【Lqb T336】Cowboys

    [链接] 我是链接,点我呀:) [题意] 出现AB就要交换一下 给你结果序列 问你原序列有多少种可能 首尾可以交换. [题解] 设 dp[i][0]表示i和i-1不交换,达到前i个字符序列的状态的方案 ...

  2. Java基础学习总结(81)——如何尽可能的减少Java代码中bug

    Java编程语言的人气自然无需质疑,从Web应用到Android应用,这款语言已经被广泛用于开发各类应用及代码中的复杂功能. 不过在编写代码时,bug永远是困扰每一位从业者的头号难题.在今天的文章中, ...

  3. noip模拟赛 密码

    题目描述 YJC把核弹发射密码忘掉了……其实是密码被加密了,但是YJC不会解密.密码由n个数字组成,第i个数字被加密成了如下形式:第k小的满足(2^L)|(P-1)且P为质数的P.YJC希望你能帮他算 ...

  4. NOIP2014 提高组合集

    NOIP 2014 提高组 合集 D1 T1 生活大爆炸版石头剪刀布 首先,先将两个人的猜拳序列都变得不小于n.然后逐个模拟.胜败什么的看表就行了. #include <iostream> ...

  5. bbed改动undo段状态(ORA-01578)

    ZBDBA@orcl11g>select * from zbdba; select * from zbdba * ERROR at line 1: ORA-01578: ORACLE data ...

  6. 在Java中按字节获得字符串长度的三种方法

    转载:http://www.blogjava.net/nokiaguy/archive/2010/04/11/317982.html 由于Java是基于Unicode编码的,因此,一个汉字的长度为1, ...

  7. Fedora下搭建LAMP开发环境

    LAMP是Linux + Apache + MySQL +PHP/Python的缩写,是一组常用来搭建动态网站服务器的开源软件.它们本身都是各自独立的程序,但是因为开源并且常放在一起使用,所以拥有了越 ...

  8. 2015:WPS笔试-Android开发岗位

    题目一共三道: 一:实现一个函数,能够推断两条直线的关系:平行.重合.垂直或相交. 二:实现一个函数.能够得到随意两个日期的相隔天数. 三:针对题目一或题目二,实现一个完整的单元測试. (笔试后在网上 ...

  9. C语言控制台窗体图形界面编程(总结)

    本系列文章是笔者通过学习<C语言控制台窗体界面编程(修正版)>而写(关于此文档的很多其它信息请看本系列文章第一篇),旨在让大家更加清晰简洁easy地学习C语言控制台窗体界面的编程. 通过本 ...

  10. CDOJ 1324 卿学姐与公主(分块)

    CDOJ 1324 卿学姐与公主(分块) 传送门: UESTC Online Judgehttp://acm.uestc.edu.cn/#/problem/show/1324 某日,百无聊赖的卿学姐打 ...