掃雷遊戲的C語言實現

2021-10-18 02:33:31 字數 4579 閱讀 7440

掃雷遊戲要著重考慮以下幾點:雷盤的初始化、埋雷、掃雷、輸入乙個座標,旁邊沒有雷的地方全部變為空地。

我們設計兩個二維陣列,乙個展示給玩家,乙個則是程式設計師自己看到的真實埋雷情況。

而程式設計師自己的雷盤,以字元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()

由於有兩個二維陣列需要初始化,因此我們不必用兩個函式來進行初始化,而是使用乙個函式。

void

initboard

(char board[rows]

[cols]

,int rows,

int cols,

char set)

//初始化雷盤

}}

為了便於對不同陣列的初始化,傳參時設定乙個 char set引數,表示傳進去的字元。因此們對於兩個陣列的初始化分別如下:

initboard

(mine, rows, cols,

'0')

;//初始化時,所有的區域都不埋雷,不埋雷表示0,埋雷表示1

initboard

(show, rows, cols,

'*')

;//使用者最開始看到的雷盤均為 *,隨著掃雷過程,* 減少

我們希望對於雷盤的列印效果如下圖所示:

為了便於掃雷時玩家能夠很好區分橫縱座標,我們需要標註好行號與列號,其**如下

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");

}}

埋雷需要每一盤隨機進行,因此我們將橫縱座標都置為隨機數。為了防止開始時每一盤的雷一樣,我們需要在進入main函式前加入如下一句**

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)

//雷的個數等於未排查區域的個數,代表已經排查完畢,未排查區域即為雷

}

最後的完善就是給遊戲設計乙個簡單的選單,玩家能根據需求來進行進入遊戲或者退出遊戲。此部分較為簡單,選單設計如**如下:

void

menu()

test()函式**如下:

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.如果未踩雷,判...