我写的迷宫算法[2]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 conanzhang 的 blog

        在从入口到出口的过程中程序对当前点的上、下、左、右四个点依次进行判断,当发现任一个方向是未走过的区域时,就将当前点指向那个点进行尝试,同时将当前点入栈并做标记。而当4个方向都不通或已走过时,则为死路,标记当前点为死路并从栈中弹出上一个点继续进行尝试,这时因为当前点已被标记为死路,则弹出上一个点时就不会重复这条路,达到寻找正确路径的效果。
        go函数的具体实现如下,其实挺简单的^_^:
void cgomaze::go()
{
    cpointstack pspath;//保存路径的栈
    point ptcur = m_ptin, ptnext;//设置当前点为入口
 
    while(ptcur.x != m_ptout.x || ptcur.y != m_ptout.y)//判断是否已经走出
    {
        ptnext = ptcur;//设置目标点为当前点,便于下面偏移
        if(m_btarrmaze[ptcur.y - 1][ptcur.x] == 0)
            ptnext.y --;//如果上方是空的,则目标点向上偏移
        else if(m_btarrmaze[ptcur.y][ptcur.x - 1] == 0)
            ptnext.x --;//如果左边是空的,则目标点向左偏移
        else if(m_btarrmaze[ptcur.y + 1][ptcur.x] == 0)
            ptnext.y ++;//如果下方是空的,则目标点向下偏移
        else if(m_btarrmaze[ptcur.y][ptcur.x + 1] == 0)
            ptnext.x ++;//如果右边是空的,则目标点向右偏移
        else
        {//这里是没有路的状态
            m_btarrmaze[ptcur.y][ptcur.x] = 3;//标记为死路
            pspath.pop(ptcur);//弹出上一次的点
            continue;//继续循环
        }
        //如果有路的话会执行到这里
        m_btarrmaze[ptcur.y][ptcur.x] = 2;//标记当前点为路径上的点
        pspath.push(ptcur);//当前点压入栈中
        ptcur = ptnext;//移动当前点
    }
}

        其实这个部分可以将栈设置为cgomaze类的成员,然后在go函数里加上:
        pspath.clearstack();
        这样就可以用timer来演示走迷宫的过程了

        程序在windows2000sp4,vc6.0环境下通过
        完整代码的其余部分因为使用了mfc的向导,比较复杂,没有列出,需要的请e-mail至:conan@5ivb.net
        但是我个人认为应该没有必要了,呵呵,算法了解了,这个程序没有别的什么值得看的了^_^
        累啦~不知道这东西对初学者有没有帮助,随便写写~hoho

本文关键:我写的迷宫算法
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top