游戏寻路——深度优先搜索
来源:互联网 发布:centos怎么安装chrome 编辑:程序博客网 时间:2024/05/20 23:08
基本思想:
从起始点开始开始遍历,首先访问起始点V,再访问与V相邻的点W,接着访问与W相邻且没访问过的点,以此类推,直至某个被访问的顶点的所有相邻顶点均被访问为止。
然后退回到尚有相邻顶点未被访问的顶点R,再从R的一个未被访问的顶点出发,重复上述步骤,直至图中所有和V有路径相通的顶点都被访问过。
若图中尚有顶点未被访问,则另选图中一个未被访问的顶点做起始点,重复上述过程直至图中所有顶点都被访问为止。
代码:
测试代码:
代码基本思想:
1.用一个二维数组表示Map,其中x为横坐标,y为纵坐标,0 表示可以通过,1 表示不可以通过,为阻挡点。
2.在class DeepSearch中也用一个二维数组,m_Table记录点是否已经走过。
用一个大小最大为1000的数组记录每一步移动的方向,移动次序为:左、右、上、下,分别用1,2,3,4表示。
按这个次序从开始点V移动到其相邻的一个点T,T的坐标可以根据V的坐标,及移动方向对点坐标X、Y的影响因子dx、dy计算得出。
3.主要的搜索过程在StartSeach()中完成:
用两个bool变量记录所有过程是否结束和当前过程是结束,后者也就是从一个点有没有走到下一个点。
外层while:
条件,所有搜索过程没有结束。
循环体,把记录已经走过的步数的变量m_curSteps + 1,把当前搜索结束标记至false。
里层while:
把当前步数的移动方向+1,也就是根据左、右、上、下的移动次序移动。
如果这个方向可以移动的话,可以移动的意思是:移动方向没有超过最大移动方向,将要移动到的点在地图内,将要移动到的点是可以通过的,将要移动到的点以前没有走到过,也就是在m_Table中为0。
如果可以通过的话,那么把当前点m_curPt,设为刚才移动到的那个点,并且在m_Table设1,记录此点已经走过。把当前移动是否结束的标记m_isLevelOk置true,并把点添加进保存路径的vector——m_Path中。
如果不可以通过的话,再判断所有方向是否已经走完,如果是的话,往回退。往回退的意思是:根据m_curSteps可以,在记录每步移动方向的数组m_Act中得到上一个点到当前的移动方向,因此根据当前点的坐标和上一个点的移动方向,可以反推上一个点的坐标,把当前点的移动方向清0,并把上一个点置为当前点。继续循环,根据当前点移动方向的次序找它的相邻的没有走过的点,重复上述步骤。如果退回到起始点的话,说明起始点到终点无路可走,直接退出吧。
- 游戏寻路——深度优先搜索
- 【游戏编程】AI-迷宫寻路算法-深度优先搜索和广度优先搜索
- 【游戏编程】AI-迷宫寻路算法-深度优先搜索和广度优先搜索
- 搜索——深度优先搜索
- 深度优先搜索+解炸弹人游戏
- 组合算法——深度优先搜索
- DFS——深度优先搜索基础
- 深度优先搜索——毕业BG
- 深度优先搜索——迷宫
- 深度优先搜索——DFS遍历
- 深度优先搜索——单词方阵
- 走迷宫——深度优先搜索
- 图——深度优先搜索(Graph
- 算法思维——深度优先搜索
- 深度优先搜索—C—python
- DFS-深度优先搜索—2
- 深度优先搜索算法—DFS
- 图搜索——深度优先与广度优先
- 泛型集合
- ExtJs学习笔记
- 汇编语言中PTR的含义及作用
- VB下自动选择所有文本并切换默认输入法
- 牛人的回字算法
- 游戏寻路——深度优先搜索
- 如何: 使用 BTDC 工具来调试 Windows CE 中的蓝牙无线技术
- How to Use C's volatile Keyword
- 结构体指针变量的注意事项
- linux内核——创建自己的/proc文件——processinfo
- 爆!史上最简单最有效的春药配制方法
- 探讨struct对齐
- @property and @synthesize
- sql2000和sql2005分页存储过程