到今天,函數(shù)學(xué)完了,數(shù)據(jù)也講到多維數(shù)組了,老師讓利用學(xué)到的東西,寫一個(gè)走迷宮的程序。
在這里記錄一下:
我要走的迷宮圖如下:

OK,開(kāi)始定義迷宮地圖數(shù)組:
/************************************************************************/
// 迷宮地圖數(shù)據(jù)
// 0表示墻
// 1表示可以行走的路
// 2表示已經(jīng)走過(guò)的路
// 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}
};
相關(guān)的宏定義及函數(shù)聲明:
//////////////////////////////////////////////////////////////////////////
#define IN_POS_X 1 // 入口點(diǎn)X坐標(biāo)
#define IN_POS_Y 12 // 入口點(diǎn)Y坐標(biāo)
#define OUT_POS_X 12 // 出口點(diǎn)X坐標(biāo)
#define OUT_POS_Y 1 // 出口點(diǎn)Y坐標(biāo)
#define UNKNOWN 1 // 從來(lái)沒(méi)走過(guò)的路
#define PASS 2 // 經(jīng)過(guò)的標(biāo)記
#define BACK 3 // 返回的標(biāo)記
#define GO 0 // 前進(jìn)
#define COMEBACK 1 // 后退
//////////////////////////////////////////////////////////////////////////
extern int g_MazeMapData[13][13];// 迷宮地圖數(shù)據(jù)
extern int g_nCurPosX; // 當(dāng)前的X坐標(biāo)
extern int g_nCurPosY; // 當(dāng)前的Y坐標(biāo)
//////////////////////////////////////////////////////////////////////////
int Start(); // 找到出口了, 返回1, 否則返回0, 如果程序異常中斷了,返回-1
int MoveTo(int nFlag); // 具體走路的函數(shù)
先初始化當(dāng)前坐標(biāo)到入口坐標(biāo):
int g_nCurPosX = IN_POS_X; // 當(dāng)前的X坐標(biāo)
int g_nCurPosY = IN_POS_Y; // 當(dāng)前的Y坐標(biāo)
整體流程上,如果當(dāng)前的坐標(biāo)等于出口的坐標(biāo),那就可以確定已經(jīng)找到出口了,如果遇到死角,則原路返回到上一個(gè)岔口,走另一條路,如果退回到迷宮入口的坐標(biāo),那就認(rèn)為沒(méi)有找到出口……
/************************************************************************/
// 開(kāi)始走迷宮
// 如果找到出口了,返回1,否則返回0
// 如果程序異常中斷了,返回-1
/************************************************************************/
int Start()
{
while (1)
{
// 開(kāi)始走路
if (MoveTo(GO) == 0)
{
MoveTo(COMEBACK);
}
// 不停的刷新窗口,模擬動(dòng)態(tài)走路效果
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");
// 如果當(dāng)前的坐標(biāo)是出口坐標(biāo)表示找到出口了
if (g_nCurPosX == OUT_POS_X && g_nCurPosY == OUT_POS_Y)
{
return 1;
}
// 如果又退回入口位置了,表示沒(méi)有找到出口
if (g_nCurPosX == IN_POS_X && g_nCurPosY == IN_POS_Y)
{
return 0;
}
}
return -1;
}
現(xiàn)在開(kāi)始寫具體的走路函數(shù)了,重點(diǎn)有兩點(diǎn),首先是遇到岔路得優(yōu)先選擇,再就是如果原路退回。
關(guān)于第一個(gè)問(wèn)題,比較容易解決,我們寫if判斷的時(shí)候,按照 上、右、下、左的順序?qū)懀@樣它就可以優(yōu)先選擇方向了。
對(duì)于第二個(gè)問(wèn)題,我們可以給函數(shù)加個(gè)參數(shù),來(lái)表明是前進(jìn)還是后退。
代碼如下:
/************************************************************************/
// 按照 上、右、下、左的順序?qū)ぢ?br>// 參數(shù)含義:
// nFlag: GO 表示前進(jìn),COMEBACK表示返回
// 返 回 值:
// 1 : 向上走,2: 向右走, 3: 向下走, 4: 向左走, 0:異常(出地圖了,不移動(dòng))
/************************************************************************/
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;
}
現(xiàn)在貌似還有一個(gè)問(wèn)題,就是,在入口點(diǎn)的時(shí)候,我們需要它往左走,按照我們的優(yōu)先級(jí),是最后向左移動(dòng),我們的入口在最右邊……
不過(guò)這個(gè)也不是問(wèn)題,因?yàn)槲覀兊拿詫m周圍是用圍墻圍起來(lái)的,所以,向右就是墻,不會(huì)出現(xiàn)左邊進(jìn),迷宮右側(cè)出來(lái)的情況,好,先瞧瞧效果……