到今天,函数学完了,数据也讲到多维数组了,老师让利用学到的东西,写一个走迷宫的程序。
在这里记录一下:
我要走的迷宫图如下:
OK,开始定义迷宫地图数组:
/************************************************************************/
// 迷宫地图数据
// 0表示墙
// 1表示可以行走的路
// 2表示已经走过的路
// 3表示返回的路
/************************************************************************/
int g_MazeMapData[13][13] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1},
{0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0},
{0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0},
{0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0},
{0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0},
{0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0},
{0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0},
{0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0},
{0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0},
{0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0},
{0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0},
{0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
相关的宏定义及函数声明:
//////////////////////////////////////////////////////////////////////////
#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;
}
现在貌似还有一个问题,就是,在入口点的时候,我们需要它往左走,按照我们的优先级,是最后向左移动,我们的入口在最右边……
不过这个也不是问题,因为我们的迷宫周围是用围墙围起来的,所以,向右就是墙,不会出现左边进,迷宫右侧出来的情况,好,先瞧瞧效果……