聚星亭

吾笨笨且懒散兮 急须改之而奋进
posts - 74, comments - 166, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
            到今天,函数学完了,数据也讲到多维数组了,老师让利用学到的东西,写一个走迷宫的程序。
在这里记录一下:
我要走的迷宫图如下:
            

      OK,开始定义迷宫地图数组:
/************************************************************************/
// 迷宫地图数据
// 0表示墙
// 1表示可以行走的路
// 2表示已经走过的路
// 3表示返回的路
/*
***********************************************************************/
int g_MazeMapData[13][13= {
    {
0000000000000},
    {
0111001111011},
    {
0101100001010},
    {
0100111111010},
    {
0111010010010},
    {
0101010111010},
    {
0101110100010},
    {
0111010101110},
    {
0010001111010},
    {
0010001000010},
    {
0110111111010},
    {
0101100001110},
    {
0100000000000}
};

            相关的宏定义及函数声明:
//////////////////////////////////////////////////////////////////////////
#define IN_POS_X    1  // 入口点X坐标
#define IN_POS_Y    12   // 入口点Y坐标
#define OUT_POS_X   12   // 出口点X坐标
#define OUT_POS_Y   1  // 出口点Y坐标

#define UNKNOWN     1   // 从来没走过的路
#define PASS        2   // 经过的标记
#define BACK        3   // 返回的标记


#define GO          0   // 前进
#define COMEBACK    1   // 后退
//////////////////////////////////////////////////////////////////////////
extern int g_MazeMapData[13][13];// 迷宫地图数据
extern int g_nCurPosX; // 当前的X坐标
extern int g_nCurPosY; // 当前的Y坐标

//////////////////////////////////////////////////////////////////////////
int Start(); // 找到出口了, 返回1, 否则返回0, 如果程序异常中断了,返回-1
int MoveTo(int nFlag); // 具体走路的函数
            先初始化当前坐标到入口坐标:
int g_nCurPosX = IN_POS_X; // 当前的X坐标
int g_nCurPosY = IN_POS_Y; // 当前的Y坐标

   
            整体流程上,如果当前的坐标等于出口的坐标,那就可以确定已经找到出口了,如果遇到死角,则原路返回到上一个岔口,走另一条路,如果退回到迷宫入口的坐标,那就认为没有找到出口……

/************************************************************************/
// 开始走迷宫
// 如果找到出口了,返回1,否则返回0
// 如果程序异常中断了,返回-1
/*
***********************************************************************/
int Start()
{
    
while (1)
    {
        
// 开始走路
        if (MoveTo(GO) == 0)
        {
            MoveTo(COMEBACK);
        }

        // 不停的刷新窗口,模拟动态走路效果
        
for(int i=0; i<=OUT_POS_X; i++)
        {
            
for(int j = 0; j <= IN_POS_Y; j++)
            {
                printf(
"%d ", g_MazeMapData[i][j]);
            }
            printf(
"\r\n");
        }

        Sleep(
500);

        system(
"cls");

        
// 如果当前的坐标是出口坐标表示找到出口了
        if (g_nCurPosX == OUT_POS_X && g_nCurPosY == OUT_POS_Y)
        {
            
return 1;
        }

        
// 如果又退回入口位置了,表示没有找到出口
        if (g_nCurPosX == IN_POS_X && g_nCurPosY == IN_POS_Y)
        {
            
return 0;
        }
    }

    
return -1;
}

         现在开始写具体的走路函数了,重点有两点,首先是遇到岔路得优先选择,再就是如果原路退回。

关于第一个问题,比较容易解决,我们写if判断的时候,按照 上、右、下、左的顺序写,这样它就可以优先选择方向了。

对于第二个问题,我们可以给函数加个参数,来表明是前进还是后退。

代码如下:

/************************************************************************/
// 按照 上、右、下、左的顺序寻路
// 参数含义:
//     nFlag: GO 表示前进,COMEBACK表示返回
// 返 回 值:
//     1 : 向上走,2: 向右走, 3: 向下走, 4: 向左走, 0:异常(出地图了,不移动)
/*
***********************************************************************/
int MoveTo(int nFlag)
{
    
if(nFlag == 0)
    {
        
// 上
        if (g_MazeMapData[g_nCurPosX][g_nCurPosY-1== UNKNOWN)
        {
            g_MazeMapData[g_nCurPosX][g_nCurPosY] 
= PASS;
            g_nCurPosY
--;
            
return 1;
        }

        
// 右
        if (g_MazeMapData[g_nCurPosX+1][g_nCurPosY] == UNKNOWN)
        {
            g_MazeMapData[g_nCurPosX][g_nCurPosY] 
= PASS;
            g_nCurPosX
++;
            
return 2;
        }

        
// 下
        if (g_MazeMapData[g_nCurPosX][g_nCurPosY+1== UNKNOWN)
        {
            g_MazeMapData[g_nCurPosX][g_nCurPosY] 
= PASS;
            g_nCurPosY
++;
            
return 3;
        }

        
// 左
        if (g_MazeMapData[g_nCurPosX-1][g_nCurPosY] == UNKNOWN)
        {
            g_MazeMapData[g_nCurPosX][g_nCurPosY] 
= PASS;
            g_nCurPosX
--;
            
return 4;
        }
    }
    
else
    {
        
// 上
        if (g_MazeMapData[g_nCurPosX][g_nCurPosY-1== PASS)
        {
            g_MazeMapData[g_nCurPosX][g_nCurPosY] 
= BACK;
            g_nCurPosY
--;
            
return 1;
        }

        
// 右
        if (g_MazeMapData[g_nCurPosX+1][g_nCurPosY] == PASS)
        {
            g_MazeMapData[g_nCurPosX][g_nCurPosY] 
= BACK;
            g_nCurPosX
++;
            
return 2;
        }

        
// 下
        if (g_MazeMapData[g_nCurPosX][g_nCurPosY+1== PASS)
        {
            g_MazeMapData[g_nCurPosX][g_nCurPosY] 
= BACK;
            g_nCurPosY
++;
            
return 3;
        }
        
        
// 左
        if (g_MazeMapData[g_nCurPosX-1][g_nCurPosY] == PASS)
        {
            g_MazeMapData[g_nCurPosX][g_nCurPosY] 
= BACK;
            g_nCurPosX
--;
            
return 4;
        }
    }

    
return 0;
}

            现在貌似还有一个问题,就是,在入口点的时候,我们需要它往左走,按照我们的优先级,是最后向左移动,我们的入口在最右边……

            不过这个也不是问题,因为我们的迷宫周围是用围墙围起来的,所以,向右就是墙,不会出现左边进,迷宫右侧出来的情况,好,先瞧瞧效果……


Feedback

# re: 写了个很笨的走迷宫(效率很差……)  回复  更多评论   

2009-12-20 02:59 by 你健哥
你个小菜鸟,写的太菜,花钱秀腿

# re: 写了个很笨的走迷宫(效率很差……)  回复  更多评论   

2009-12-23 08:07 by 呵呵
兄弟 好好学,冬至问候声,现在天气比较冷,多注意身体.
-------厦门的哥们

# re: 写了个很笨的走迷宫(效率很差……)  回复  更多评论   

2009-12-23 16:14 by besterChen
@呵呵

恩,谢谢,你也多保重哈

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理