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

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;
}
現在貌似還有一個問題,就是,在入口點的時候,我們需要它往左走,按照我們的優先級,是最后向左移動,我們的入口在最右邊……
不過這個也不是問題,因為我們的迷宮周圍是用圍墻圍起來的,所以,向右就是墻,不會出現左邊進,迷宮右側出來的情況,好,先瞧瞧效果……