关于BFS的相关知识由于水平有限就不多说了,感兴趣的可以自己去wiki或者其他地方查阅资料。

这里大概说一下BFS寻路的思路,或者个人对BFS的理解:

大家知道Astar的一个显著特点是带有启发函数,换句话说,Astar尝试以人的思维来去寻找一段路径。而BFS则没有这种聪明劲,他看起来更中规中矩,老实巴交,更像是机器人的风格。

简单的说,BFS为了找到一条路径,他从起点开始,然后是身边的邻居,然后是邻居的邻居,一个一个的搜查,直到搜到终点(寻路成功),或者把整个地图搜索完(除非最后一个点就是终点,否则寻路失败)。

可能乍看上去BFS真的比较笨,但是他也并没有笨的不着边际,因为他最多把整个地图都搜一遍,这样,对于一张有限的地图,他寻找一段路径所花的时间也是相对的有一个上限。

但Astar则不同,Astar虽然看起来带有聪明劲,但是这种聪明只是一种自作聪明,有时候,对于一些设计特殊的地图,Astar要为自己的聪明付出很大的代价。比如带有半岛的地图。

总体上看,Astar在障碍越少的情况下寻路越快,而BFS则比较平缓,不管障碍多少,他快慢幅度并不大。

废话不多说,下面用代码来说明BFS的思路:

		public function tryFindPath(sx:int, sy:int, ex:int, ey:int):Boolean
{
var start:uint = getTimer(); _startNode = _mapData.setStartNode(sx,sy);
_endNode = _mapData.setEndNode(ex,ey); if(_startNode == _endNode) return false;
if(!_endNode.walkable) return false; var i:uint=0;
_startNode.f = i;
var queue:MinHeap = new MinHeap(100);
queue.Enqueue(_startNode);
var neighbor:Node;
var testedNodes:Dictionary = new Dictionary(); while(queue.size>0)
{
var testNode:Node = queue.Dequeue() as Node;
i++;
var x:int,y:int;
for(var dx:int=-1;dx<=1;++dx)
{
x = testNode.x + dx;
for(var dy:int=-1;dy<=1;++dy)
{
y = testNode.y+dy;
neighbor = _mapData.getNode(x,y);
if(!neighbor) continue;
if(!neighbor.walkable) continue;
if(testedNodes[neighbor]) continue;
testedNodes[neighbor] = true;
neighbor.parent = testNode;
neighbor.f = i;
if(neighbor == _endNode)
{
return true;
} queue.Enqueue(neighbor);
}
}
}
return false;
}

这里并没有给出全部相关的源码,该方法只展示一个思路:

_mapData是对一个二维网格地图数据做了一个封装,包括设置起始点,终点,根据索引获取节点等。

Node是一个节点对象,他有xy的属性和一个f属性,跟Astar的代价属性类似。

queue是一个最小堆,他保证f值越小的Node对象越靠近队列的顶部。

testedNodes用来记录节点是否被搜寻过。

其寻路过程为:

1,将起点放入队列;

2,弹出队列中的最小代价的节点,搜寻他周围的有效节点(即存在,可走,而且没有被检查过),设置代价值,和父节点,如果这个节点就是终点,那么寻路成功,否则将此节点放入队列,在检查下一个邻居节点,如果所有的邻居节点都不是终点则进入3;

3,如果队列空了,那么说明所有的节点都检查过了,没有找到终点,否则继续2。

BFS的这种平缓特性在有些时候看起来似乎可以弥补Astar的缺陷,比如我们想在长程情况下采用BFS而短程的时候用Astar,但是这并不总是合适的,因为Astar并不是因为路程长才耗时,而是因为地形复杂,而地形复杂又没有一个可以衡量的指标,只能人为的去判断,所以最多我们通过人为的配置来选择寻路的方式。

BFS寻路的AS3实现的更多相关文章

  1. BFS寻路算法的实现

    关于BFS的相关知识由于水平有限就不多说了,感兴趣的可以自己去wiki或者其他地方查阅资料. 这里大概说一下BFS寻路的思路,或者个人对BFS的理解: 大家知道Astar的一个显著特点是带有启发函数, ...

  2. POJ-3984.迷宫问题(BFS + 路径输出)

    昨天中午做的这道题,结果蛙了一整天,就因为一行代码困住了,今天算是见识到自己有多菜了.流泪.jpg 本题大意:给一个5 * 5的迷宫,1表示墙壁,0表示通路,从左上角走到右下角并输出路径. 本题思路: ...

  3. 游戏AI之路径规划(3)

    目录 使用路径点(Way Point)作为节点 洪水填充算法创建路径点 使用导航网(Navigation Mesh)作为节点 区域分割 预计算 路径查询表 路径成本查询表 寻路的改进 平均帧运算 路径 ...

  4. “AS3.0高级动画编程”学习:第四章 寻路(AStar/A星/A*)算法 (下)

    在前一部分的最后,我们给出了一个寻路的示例,在大多数情况下,运行还算良好,但是有一个小问题,如下图: 很明显,障碍物已经把路堵死了,但是小球仍然穿过对角线跑了出来! 问题在哪里:我们先回顾一下ASta ...

  5. A*寻路算法探究

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

  6. 用简单直白的方式讲解A星寻路算法原理

    很多游戏特别是rts,rpg类游戏,都需要用到寻路.寻路算法有深度优先搜索(DFS),广度优先搜索(BFS),A星算法等,而A星算法是一种具备启发性策略的算法,效率是几种算法中最高的,因此也成为游戏中 ...

  7. A*寻路算法的探寻与改良(一)

    A*寻路算法的探寻与改良(一) by:田宇轩                                                                    第一部分:这里我们主 ...

  8. BFS、双向BFS和A*

    BFS.双向BFS和A* Table of Contents 1. BFS 2. 双向BFS 3. A*算法 光说不练是无用的.我们从广为人知的POJ 2243这道题谈起:题目大意:给定一个起点和一个 ...

  9. [笔记]A*寻路算法初探

    写在开始之前 最近突然对各路游戏的寻路算法很感兴趣,于是去学习了下游戏里的AI们是如何寻路的.网上相关内容很多,但同时有些说法也不一,制作自己的A* 算法时也有因不同的说法而困惑.整理多方资料并自己实 ...

随机推荐

  1. js 字符串为空

    content.replace(/(^\s)|(\s$)/g, "")

  2. Definitions

    Definitions and ODR Definitions are declarations that fully define the entity introduced by the decl ...

  3. JavaSE学习总结第15天_集合框架1

      15.01 对象数组的概述和使用 public class Student { // 成员变量 private String name; private int age; // 构造方法 publ ...

  4. BZOJ 1567: [JSOI2008]Blue Mary的战役地图( 二分答案 + hash )

    二分答案, 然后用哈希去判断... ------------------------------------------------------------------------- #include ...

  5. 调试带有源代码的DLL文件

    工作环境:dll源代码是c,在Visual studio 2010中调试. 第一步,调试的准备. 用C#语言编写一个测试dll文件的程序,由于dll源程序是c的,且运行结果是黑屏的,所以C#代码也是运 ...

  6. VS2010 .net4.0 登录QQ 获取QQ空间日志 右键选中直接打开日志 免积分 源码下载

    代码有一部分是原来写的  最近翻代码 看到了  就改了一下 CSDN上传源码 上传了几次都没 成功 郁闷   不知道怎么回事 上传不了 想要的留 邮箱 或加群77877965 下载地址在下面 演示地址 ...

  7. js中访问对象的方法

    如果在js中定义了一个变量obj1,如 var obj1 = 234; 那么访问这个边个两的方式至少有两种, 1 window["obj1"],那么值为234, 2 var tar ...

  8. [LeetCode]题解(python):024-Swap Nodes in Pairs

    题目来源: https://leetcode.com/problems/swap-nodes-in-pairs/ 题意分析: 给定一个链表,每两个相邻节点就行交换.比如1->2->3-&g ...

  9. poj 2515 Birthday Cake

    /** 大意 : 求1^m + 2^m + 3^m + 4^m +....+ n^m 解题步骤: 先构造从0到m的第1阶差分序列,然后以下所有2---->p阶的差分表. 令C[n+1][1]=n ...

  10. linux配置nfs服务

    简单介绍: unix/linux系统一种远程文件文件夹共享的服务,能够把某一个远程的文件文件夹共享到本地,进而像操作本地文件一样,操作这个远程的文件夹. 比如:a主机作为服务端,共享出来test1这个 ...