C語言實戰項目【二】經典小游戲【掃雷】

      網友投稿 945 2022-05-28

      目錄

      掃雷游戲效果對比總覽

      實現的操作:

      玩家須知:

      游戲準備

      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代表雷,先初始化兩個數組

      代碼如下

      C語言實戰項目【二】經典小游戲【掃雷】

      //初始化棋盤 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"); scanf("%d %d",&x,&y);//x-(1-9),y-(1-9) //判斷坐標合法性 if(x>=1&&x<=row&&y>=1&&y<=col) { if(mine[x][y]=='1') { printf("很遺憾 ,你被炸死了\n"); DisplayBoard(mine,row,col); break; } else { //不是雷的話,統計x,y坐標周圍有幾個雷 int count = get_mine_count(mine,x,y); show[x][y]=count+'0'; //顯示排查出的信息 DisplayBoard(show,row,col); win++; } } else printf("坐標不合法,請重新輸入!"); } if(win==row*col-EASY_COUNT) { printf("排雷成功!\n"); DisplayBoard(show,row,col); } }

      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 #include #include #define EASY_COUNT 10//雷的總數量 #define ROW 9 //行 #define COL 9 //列 //為使用方便,這里區分格式的使用,本質還是9*9 #define ROWS ROW+2 #define COLS COL+2 //初始化棋盤 void InitBoard(char board[ROWS][COLS],int rows,int cols,char set); //打印棋盤 void DisplayBoard(char board[ROWS][COLS],int row,int col ); //布置雷 void SetMine(char mine[ROWS][COLS],int row,int col); //排查雷 void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col); void menu() { printf("***********************\n"); printf("****** 1.play ********\n"); printf("****** 0.exit *******\n"); printf("***********************\n"); } void game() { /*不應該存儲[9][9],因為我們排查雷都以9*9的格式,而如果在四個角落的話, 就會受限,會越界;那時就要設置四個角落排查信息為3格子,比較麻煩。 為防止訪問越界,所以我們給他擴充兩行兩列,一律9*9排查,所以得11*11格式(輔助作用)*/ char mine[ROWS][COLS]={0};//存放布置好的雷的信息 char show[ROWS][COLS]={0};//存放排查除的雷的信息 //初始化棋盤 InitBoard(mine,ROWS,COLS,'0');//‘0’ InitBoard(show,ROWS,COLS,'*');//‘*’ //打印棋盤 DisplayBoard(show,ROW,COL); //布置雷 SetMine(mine,ROW,COL); //DisplayBoard(mine,ROW,COL); //排查雷 FindMine(mine,show,ROW,COL); } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("請選擇:>"); scanf("%d",&input); switch(input) { case 1: game();//掃雷游戲 break; case 0: printf("退出游戲\n"); break; default : printf("選擇錯誤,重新選擇! \n"); break; } }while(input); return 0; } void InitBoard(char board[ROWS][COLS],int rows,int cols,char set) { int i = 0; int j = 0; for(i=0;i"); scanf("%d %d",&x,&y);//x-(1-9),y-(1-9) //判斷坐標合法性 if(x>=1&&x<=row&&y>=1&&y<=col) { if(mine[x][y]=='1') { printf("很遺憾 ,你被炸死了\n"); DisplayBoard(mine,row,col); break; } else { //不是雷的話,統計x,y坐標周圍有幾個雷 int count = get_mine_count(mine,x,y); show[x][y]=count+'0'; //顯示排查出的信息 DisplayBoard(show,row,col); win++; } } else printf("坐標不合法,請重新輸入!"); } if(win==row*col-EASY_COUNT) { printf("排雷成功!\n"); DisplayBoard(show,row,col); } }

      5G游戲 C 語言 數據結構

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:MapTask,ReduceTask,MapReduce運行機制詳解
      下一篇:Java接口實現多態 -- 筆記本電腦綜合實例
      相關文章
      久久精品国产亚洲AV高清热| 亚洲国产午夜福利在线播放| 综合亚洲伊人午夜网| 国产亚洲精品VA片在线播放| 亚洲欧洲中文日产| 久久久亚洲欧洲日产国码是AV| 中文字幕第一页亚洲| 亚洲午夜av影院| 久久精品国产精品亚洲艾草网美妙 | 亚洲综合色区中文字幕| 亚洲人成电影网站| 亚洲神级电影国语版| 亚洲欧洲精品一区二区三区| 亚洲国产视频一区| 67194在线午夜亚洲| 亚洲熟女精品中文字幕| 亚洲欧美日韩中文字幕一区二区三区| 亚洲熟女乱色一区二区三区| 亚洲av无码偷拍在线观看| 在线观看亚洲免费| 亚洲中文字幕无码爆乳av中文| 亚洲色无码一区二区三区| 亚洲av无码无在线观看红杏| 香蕉视频在线观看亚洲| 亚洲国产精品yw在线观看| 亚洲精品国产国语| 久久久久亚洲国产AV麻豆 | 亚洲AV综合色区无码一二三区| 国产成人精品久久亚洲高清不卡| 一区国严二区亚洲三区| 久久亚洲国产精品123区| 国产亚洲精品无码成人| 色婷婷六月亚洲婷婷丁香| 亚洲国产福利精品一区二区| 亚洲欧美aⅴ在线资源| 五月天婷亚洲天综合网精品偷| 久久亚洲高清综合| 亚洲综合成人网在线观看| 亚洲一区二区三区免费观看| 亚洲国产AV一区二区三区四区 | 亚洲国产人成在线观看69网站|