

掃雷游戲本題設定了四個規則:
1,如果一個地雷('M')被挖出,游戲就結束了- 把它改為 'X' ,
2,如果一個 沒有相鄰地雷 的空方塊('E')被挖出,修改它為('B'),并且所有和其相鄰的 未挖出 方塊都應該被遞回地揭露,
3,如果一個 至少與一個地雷相鄰 的空方塊('E')被挖出,修改它為數字('1' 到 '8' ),表示相鄰地雷的數量,
4,如果在此次點擊中,若無更多方塊可被揭露,則回傳盤面,
解題思路:
1,從給出的點出發,如果該點很不幸就是雷,置為'X',game over,匹配規則1,
2,不是雷的情況,采用深度搜索演算法(dfs),對于當前點,如果為'E'說明沒有被涉足,我們掃描以該點為中心的九宮格,統計雷的個數count(即字符'M'的個數)

3,如果count為0,說明沒有雷,將'E'置為'B',匹配規則2;
4,如果count不為0,說明有雷,置為count數,并且從該點出發搜索九宮格,匹配規則3
代碼如下:
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
void dfs(char** board, int x, int y, int boardSize, int boardColSize)
{
if(x<0 || x>=boardSize || y<0 || y>=boardColSize || board[x][y] != 'E') //首先對當前搜索的點(x,y)做合法性檢查,保證在搜索的區域內
return;
int count = 0;
int i,dx,dy;
int x_dir[8] = {-1,0,1,-1,1,-1,0,1};//八個方向搜索
int y_dir[8] = {1,1,1,0,0,-1,-1,-1};
for(i=0; i<8; i++)
{
dx = x + x_dir[i];
dy = y + y_dir[i];
if(dx<0 || dx>=boardSize || dy<0 || dy>=boardColSize)
continue;
else if(board[dx][dy] == 'M') //如果是雷,則統計雷的個數
count++;
}
if(count != 0) //如果count不為0,說明周邊有雷,匹配規則3后回傳
board[x][y] = count + '0';
else
{ //如果count為0,說明周邊沒有雷,匹配規則2,以該點為中心繼續搜索,八個方向搜索完后回傳
board[x][y] = 'B';
for(i=0; i<8; i++)
{
dx = x + x_dir[i];
dy = y + y_dir[i];
dfs(board,dx,dy,boardSize,boardColSize);
}
}
return;
}
char** updateBoard(char** board, int boardSize, int* boardColSize, int* click, int clickSize, int* returnSize, int** returnColumnSizes)
{
int click_x = click[0];
int click_y = click[1];
if(board[click_x][click_y] == 'M') //匹配規則1
board[click_x][click_y] = 'X';
else
dfs(board,click_x,click_y,boardSize,boardColSize[0]);
*returnSize = boardSize;
(*returnColumnSizes) = (int*)malloc(sizeof(int)*boardSize);
for(int i=0; i < boardSize; ++i)
(*returnColumnSizes)[i] = boardColSize[0];
return board;
}
運行結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/388020.html
標籤:其他
上一篇:見縫插針小游戲
下一篇:實驗二:貪吃蛇的實作
