掃雷遊戲要著重考慮以下幾點:雷盤的初始化、埋雷、掃雷、輸入乙個座標,旁邊沒有雷的地方全部變為空地。
我們設計兩個二維陣列,乙個展示給玩家,乙個則是程式設計師自己看到的真實埋雷情況。
而程式設計師自己的雷盤,以字元0和1區分,0表示此時沒有雷,1表示次數為雷。
展示給玩家的雷盤,開始時全部都是以『 * 』星號來展示,當玩家輸入其中乙個星號座標時,若此時其周圍有雷,則使用程式設計師的雷盤統計其周圍雷的個數,若沒有雷,則將其置為空,並且遞迴擴充套件空地。
為了便於控制遊戲難度,我們使用巨集來定義陣列大小。掃雷時,為了統計乙個區域周圍雷的個數,我們需要遍歷其周圍8個區域,但是對於處於四個邊的區域,我們其周圍區域不足8個。比如玩家要玩乙個9×9的雷盤,我們可以設計實際雷盤大小為11×11,列印時列印中間的9×9的部分。而在計算四邊區域雷的個數時,在11×11的陣列中,其四個邊的雷均置為0,表示沒有雷。這樣在遍歷時,9×9區域的四個邊也可以按照遍歷周圍八個區域的方式來進行遍歷。
因此,game.**件主要包含以下內容
#include
#include
#include
#define easy_count 10
//盤上的雷的個數
#define row 9
#define col 9
#define rows row+2
#define cols col+2
//遊戲
void
game()
;//列印選單
void
menu()
;//初始化陣列
void
initboard
(char board[rows]
[cols]
,int rows,
int cols,
char set)
;//列印陣列
void
displayboard
(char board[rows]
[cols]
,int row,
int col)
;//布置雷
void
setboard
(char board[rows]
[cols]
,int row,
int col,
int count)
;//count為布置的雷的個數
//掃雷函式
void
findmine
(char mine[rows]
[cols]
,char show[rows]
[cols]
,int row,
int col,
int count)
;//統計乙個區域周圍雷的個數
intgetminecount
(char board[rows]
[cols]
,int x,
int y)
;//遞迴實現掃雷的擴充套件
void
extend
(char show[rows]
[cols]
,char mine[rows]
[cols]
,int x,
int y)
;//檢驗此時剩餘的未檢驗區域的個數
intcheckwin
(char show[rows]
[cols]
,int row,
int col,
int count)
;
由於有兩個二維陣列需要初始化,因此我們不必用兩個函式來進行初始化,而是使用乙個函式。void
game()
為了便於對不同陣列的初始化,傳參時設定乙個 char set引數,表示傳進去的字元。因此們對於兩個陣列的初始化分別如下:void
initboard
(char board[rows]
[cols]
,int rows,
int cols,
char set)
//初始化雷盤
}}
我們希望對於雷盤的列印效果如下圖所示:initboard
(mine, rows, cols,
'0')
;//初始化時,所有的區域都不埋雷,不埋雷表示0,埋雷表示1
initboard
(show, rows, cols,
'*')
;//使用者最開始看到的雷盤均為 *,隨著掃雷過程,* 減少
為了便於掃雷時玩家能夠很好區分橫縱座標,我們需要標註好行號與列號,其**如下
埋雷需要每一盤隨機進行,因此我們將橫縱座標都置為隨機數。為了防止開始時每一盤的雷一樣,我們需要在進入main函式前加入如下一句**void
displayboard
(char board[rows]
[cols]
,int row,
int col)
printf
("\n\n");
for(
int i =
1; i <= row; i++)}
printf
("\n");
printf
(" ");
for(
int j =
1; j <= col; j++)if
(i <= col -
1&& j <= col -1)
}printf
("\n");
}}
從而保證埋雷是隨機的。srand((
unsigned
int)
time
(null))
;
該模組**如下:
**void
setboard
(char board[rows]
[cols]
,int row,
int col,
int count)
}}
遍歷周邊八個區域,**如下:
空地的擴充套件為遊戲設計的難點,但當我們了解遊戲規則後,不難想出用遞迴來實現。int
getminecount
(char board[rows]
[cols]
,int x,
int y)
}return count;
}
當輸入座標不是雷,且其周圍八個區域均不是雷的時候,需要向此地置為空格,並向外擴充套件。此時需要檢查其周圍的區域有沒有被訪問國,若訪問過則跳過,若沒有訪問則進行訪問。其**如下:
排雷是本遊戲設計的核心。//遞迴實現掃雷的擴充套件
void
extend
(char show[rows]
[cols]
,char mine[rows]
[cols]
,int x,
int y)}}
}else
}
如果所輸入座標剛好是雷,則告知玩家被炸死,跳出遊戲,並向玩家展示埋雷的真實情況。
如果不是雷,則展示該區域周圍的雷的個數。當該區域周圍的雷的個數為0時,則置為空格,並進行空地的擴充套件。知道周圍不是0為止。
當剩餘的『*』星號剛好等於埋雷的個數時,證明玩家已經排雷成功,向玩家告知並跳出遊戲
其**如下
最後的完善就是給遊戲設計乙個簡單的選單,玩家能根據需求來進行進入遊戲或者退出遊戲。此部分較為簡單,選單設計如**如下:void
findmine
(char mine[rows]
[cols]
,char show[rows]
[cols]
,int row,
int col,
int count)
else
if(mine[x]
[y]==
'0')
}else}if
(win == count)
//雷的個數等於未排查區域的個數,代表已經排查完畢,未排查區域即為雷
}
test()函式**如下:void
menu()
至此,掃雷遊戲設計完成。此設計依然可以進行進一步改進,如第一次所點區域不能是雷,感興趣的可以自行嘗試。int
main()
}while
(input)
;return0;
}
掃雷遊戲是對二維陣列的一次應用,需要掌握對二維陣列的遍歷。同時,其中空地的擴充套件,也涉及到了遞迴條件的判斷,需要掌握遞迴的方法。
C語言實現掃雷遊戲
game.h define crt secure no warnings 1 include include include include define sum 10 define row 11 define col 11 void print void init char mine row co...
C語言實現掃雷遊戲
今天我們來用c語言實現另乙個眾所周知的小遊戲 掃雷 首先,與五子棋不同的是,為了不讓雷被玩家直接看到,我們需要建立兩個棋盤。乙個用於儲存雷,我們將其命名為mine盤,乙個能直觀的展現給玩家,我們將其命名為show盤 其次,為了算清玩家選擇的座標周圍有多少雷,我們無可避免的要訪問mine盤對應座標周圍...
掃雷遊戲 C語言實現
1.使用兩個二維陣列表示地圖 a show map char 表示翻開 數字 和未翻開 的狀態 b mine map char 表示地雷 1 和不是地雷 0 的狀態 2.對陣列進行初始化 3.列印地圖 show map 4.提示玩家輸入乙個座標表示要翻開乙個位置 5.判定是否踩雷 6.如果未踩雷,判...