游戏寻路——深度优先搜索

来源:互联网 发布: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,并把上一个点置为当前点。继续循环,根据当前点移动方向的次序找它的相邻的没有走过的点,重复上述步骤。如果退回到起始点的话,说明起始点到终点无路可走,直接退出吧。