C語言實戰項目【二】經典小游戲【掃雷】
目錄
掃雷游戲效果對比總覽
實現的操作:
玩家須知:
游戲準備
1.棋盤格式
2.初始化棋盤
3.打印棋盤
4.隨機布置雷(會用rand生成隨機)
6.排查雷
7.統計雷數量
完整代碼
掃雷游戲效果對比總覽
編輯 編輯
實現的操作:
顯示周圍的雷數量
隨機布雷
第一次下子,不炸死
坐標周圍沒雷,可以實現展開
游戲結束后展示給玩家
玩家須知:
數字n代表有n個雷
雷的總數量設置為10
編輯
游戲準備
我們使用坐標的方式進行排雷,一次坐標查看一個格子,總共有81個格子,分別為9行9列;9行9列?聽著好耳熟,對啦,就是我們學過的二維數組;既然是數組,那坐標(0,0)不就是第一行的第一列嗎?真聰明!不過這是聰明的程序員使用的方式,而外行認為第一行第一列那就是(1,1)呀;所以,我們在打印棋盤的時候要多打兩行;不應該存儲[9][9],因為我們排查雷都以9*9的格式,而如果在四個角落的話,就會受限,會越界;那時就要設置四個角落排查信息為3格子,比較麻煩。
為防止訪問越界,所以我們給他擴充兩行兩列,一律9*9排查,所以得11*11格式(輔助作用)
1.棋盤格式
這里解釋為什么定義ROWS,COLS,ROW,COL這四個宏。
mine數組中,除了雷是用1表示,其他的元素都是用0表示,計算雷數時,把周圍八個元素的值相加,得到的數剛好就是雷數。但是我們對邊界上的元素進行排雷時,會出先數組的越界訪問,產生意想不到的結果,這當然不是我們想要的。所以,對數組增加兩行與兩列(假設二維數組是9 * 9的,增加后變為11 * 11),對11 * 11的數組初始化,但我們使用的是9 * 9 的數組,在計算雷數時就不會出現錯誤了
#define EASY_COUNT 10//雷的總數量 #define ROW 9 //行 #define COL 9 //列 //為使用方便,這里區分格式的使用,本質還是9*9 #define ROWS ROW+2 #define COLS COL+2 char mine[ROWS][COLS]={0};//存放布置好的雷的信息 char show[ROWS][COLS]={0};//存放排查除的雷的信息
2.初始化棋盤
我們打印設計者棋盤要用數組real_mine,打印玩家棋盤要用數組show_mine,兩個數組在開始必須要初始化,在設計者棋盤中字符0代表不是雷,字符1代表雷,先初始化兩個數組
代碼如下
//初始化棋盤 InitBoard(mine,ROWS,COLS,'0');//‘0’ InitBoard(show,ROWS,COLS,'*');//‘*’
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set) { int i = 0; int j = 0; for(i=0;i 3.打印棋盤 DisplayBoard(show,ROW,COL);//打印棋盤 //打印棋盤 void DisplayBoard(char board[ROWS][COLS],int row,int col ) { int i = 0; int j = 0; printf("-------------掃雷游戲----------------\n"); //打印列號 for(i=0;i<=col;i++) { printf("%d ",i); } printf("\n"); for(i=1;i<=row;i++) { printf("%d ",i); for(j=1;j<=col;j++) { printf("%c ",board[i][j]); } printf("\n"); } printf("-------------掃雷游戲----------------\n"); } 4.隨機布置雷(會用rand生成隨機) //布置雷 SetMine(mine,ROW,COL); void SetMine(char mine[ROWS][COLS],int row,int col) { //布置雷 int count = 10; while(count) { //生產隨機的下標 int x = rand()%row+1; int y= rand()%col+1; if(mine[x][y]=='0') { mine[x][y]='1'; count--; } } } 6.排查雷 接著就到了玩家進行排雷了,通過玩家輸入坐標,程序把對應的數組元素賦值成周圍一圈的雷數,要是踩到雷了,提示玩家玩得太菜 游戲結束。但這又有一個細節,我們創建的數組是字符數組,放置的是字符,把字符相加得到的是對應的ASCII碼值。所以我們把相加后的值減去八個字符0的ASCII碼值,得到的就是雷數了。我寫了一個get_mine_num函數來計算雷數。 //排查雷 FindMine(mine,show,ROW,COL); //排查雷 void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col) { //1.輸入排查坐標 //2.檢查坐標是不是雷 //(1)是雷 - 很遺憾炸死了,游戲結束 // (2)不是雷 - 統計坐標周圍有幾個雷 - 存儲排查雷的信息到show數組,游戲繼續 int x = 0; int y = 0; int win = 0; while(win 7.統計雷數量 編輯 //統計雷 static int get_mine_count(char mine[ROWS][COLS],int x,int y) { return mine[x-1][y]+ mine[x-1][y-1]+ mine[x][y-1]+ mine[x+1][y-1]+ mine[x+1][y]+ mine[x+1][y+1]+ mine[x][y+1]+ mine[x-1][y+1]-8*'0'; } 完整代碼 #include 5G游戲 C 語言 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。