蟲子 掃雷 眾神起步,萬語之基,軟硬橋梁,帝國大廈

      網友投稿 694 2025-03-31

      掃雷

      test.c

      main

      Meun菜單函數

      game游戲函數

      game.c文件

      InitBoard初始化棋盤函數

      DisplayBoard打印棋盤參數

      SetMine放置雷函數

      GetMineCount得到雷數函數

      PutOneMine放單雷函數

      ShowSpread顯示展開函數

      FindBoard排查雷函數

      game.h

      函數聲明

      測試圖

      次數限制

      炸死

      第一步開始連續踩雷,泉水無敵效應坐標2 3是有雷的

      遞歸展開

      贏了

      掃雷

      還是那個熟悉的味道,優化的掃雷,無限接近真正的掃雷。

      test.c

      還是從main入手,本人不太喜歡直接上代碼,感覺那樣的話博友會看不懂,我喜歡分開來講解。廢話不多說,直接上代碼(哈哈開個玩笑)。

      main

      int main() { int input = 0; int num = 3;//不可連續選錯的次數 int flag = 1;//這個我不想說了,三子棋里面有,就是次數標記 srand((unsigned)time(NULL));//隨機數起點,與rand()搭配使用 /*別的不說,這游戲不管你玩不玩,總之你得玩一把,先和你說一聲30個雷*/ do { Meun(); printf("請選擇:>"); scanf("%d", &input); switch (input) { case 1: if (flag == 0) { flag = 1; //標記取反 num = 3; //次數充滿 } game(); //玩游戲 break; case 0: printf("退出游戲\n"); break; default: if (flag == 1) { flag = 0; //標記警告 } num--; if (num == 0) //到這里你就沒機會了 { printf("你已經沒有機會了。\n"); break; } printf("選錯了,你還有%d次機會\n", num); break; } } while (input&&num); //輸入0或次數沒了就退出游戲 return 0; }

      Meun菜單函數

      void Meun() { printf("****************************\n"); printf("****1.play 0.exit*****\n"); printf("****************************\n"); }

      game游戲函數

      void game() { char mine[ROWS][COLS];//地雷數組 char show[ROWS][COLS];//排查雷數組 InitBoard(mine, ROWS, COLS,'0');//初始化放雷棋盤 InitBoard(show,ROWS,COLS,'*'); //初始化排查雷棋盤 //DisplayBoard(mine, ROW, COL);//打印放雷棋盤 DisplayBoard(show, ROW, COL);//打印排雷棋盤 SetMine(mine, ROW, COL); //布置雷 //DisplayBoard(mine, ROW, COL);//打印放雷棋盤 FindBoard(mine,show, ROW, COL); //排查雷 }

      game.c文件

      InitBoard初始化棋盤函數

      棋盤初始化,這里到底初始化是么樣的字符呢?寫死’0’,show數組不行。寫死’*’,mine數組也不行,那怎么辦呢?所以我這里全都不要,我用一個參數set來承接,你要初始化什么樣,你傳給我的參數,然后再操作。

      void InitBoard(char board[ROWS][COLS], int rows, int cols,char set) { int i = 0; for (i = 0; i < rows; i++) { int j = 0; for (j = 0; j < cols; j++) { board[i][j] = set;//set參數,你來啥我接啥 } } }

      DisplayBoard打印棋盤參數

      打印棋盤,這里打印就是我們所見的棋盤,那個為了防止數組溢出的外面一圈就不需要了。雖然我們這里雖然操作的是99的數組,但是我們傳數組的時候還是1111的數組,所以用board這個11*11的數組來接收

      void DisplayBoard(char board[ROWS][COLS], int row, int col) { int i = 0; printf("---------------------------------------\n"); /*這個循環是在打印列之前把序號打印出來*/ for (i = 0; i <= col; i++) { printf("%2d ", i);//為了看的方便,格式對齊所以用%2d } printf("\n"); for (i = 0; i <= col; i++) { if (0 == i) printf(" "); else printf("---"); } printf("\n"); for (i = 1; i <= row; i++) { int j = 0; printf("%2d|",i);//打印行之前把序號打印出來 for (j = 1; j <= col; j++) { printf(" %c ",board[i][j]); } printf("|");//行結束后打印個|分割線 printf("\n"); } for (i = 0; i <= col; i++)//列結束后打印分割線--- { if (0 == i) printf(" ");//0下面不需要分割線 else printf("---"); } printf("\n"); printf("---------------------------------------\n"); }

      SetMine放置雷函數

      布置雷,把雷放到mine數組里面

      void SetMine(char board[ROWS][COLS], int row, int col) { int count = EASY_COUNT; while (count) { //布置雷生成隨機下標(1-9) int x = rand() % row + 1; int y = rand() % col + 1; //如果board[x][y]不是雷才能把雷放進去,不然會少雷 if (board[x][y] != '*') { board[x][y] = '*'; count--; } } }

      GetMineCount得到雷數函數

      得到雷個數函數,因為我們放雷數組初始化是’0’,雷是’’,但我們從排查雷及其周圍是定死33的數組,所以我們用循環把9個字符加起來再減9個’0’就能得到總共’*’-'0’的整數了,再除以它就可以得到count

      int GetMineCount(char board[ROWS][COLS], int x, int y) { int i = 0; int sum = 0; int count = 0; for (i = x - 1; i <= x + 1; i++) { int j = 0; for (j = y - 1; j <= y + 1; j++) { sum = sum + (board[i][j] - '0'); } } return count = sum / ('*' - '0');//我們要靈活運用字符型和整型之間的切換 }

      蟲子 掃雷 眾神起步,萬語之基,軟硬橋梁,帝國大廈

      PutOneMine放單雷函數

      放一個雷,防止第一步及之后連續踩雷就被炸死,這個代碼就是保護那些臉黑的,怕他們沒有游戲體驗

      void PutOneMine(char board[ROWS][COLS]) { while (1) { int x = rand() % ROW + 1; int y = rand() % COL + 1; if (board[x][y] != '*') { board[x][y] = '*';//把雷放進去就跳出 break; } } }

      ShowSpread顯示展開函數

      顯示展開函數,也就是遞歸展開排雷,這個函數大大增加了游戲的可玩性,我欲八面來風層層遞歸

      void ShowSpread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y) { int count = 0;//計算雷個數 count = GetMineCount(mine, x, y); if (count == 0) { /*這里非常重要不然會死遞歸,很像對沖擊波那樣*/ show[x][y] = ' '; if ((x - 1) > 0 && (y - 1) > 0 && show[x - 1][y - 1] == '*') ShowSpread(mine, show, x - 1, y - 1); if((y-1)>0&&show[x][y-1] == '*') ShowSpread(mine, show, x , y - 1); if ((x + 1) <= ROW && (y - 1) > 0 && show[x - 1][y - 1] == '*') ShowSpread(mine, show, x + 1, y - 1); if ((x - 1) > 0&& show[x - 1][y] == '*') ShowSpread(mine, show, x - 1, y); if ((x + 1) <= ROW&& show[x + 1][y] == '*') ShowSpread(mine, show, x + 1, y); if ((x - 1) > 0 && (y + 1) <= COL && show[x - 1][y + 1] == '*') ShowSpread(mine, show, x - 1, y + 1); if ((y + 1) <= COL && show[x][y + 1] == '*') ShowSpread(mine, show, x, y + 1); if ((x + 1) <= ROW && (y + 1) <= COL && show[x + 1][y + 1] == '*') ShowSpread(mine, show, x + 1, y + 1); } else { show[x][y] = count + '0'; } }

      FindBoard排查雷函數

      排查雷,我們是通過排查mine數組,然后把信息傳到show數組里面,我們還是操作99數組,但mine show一直都是1111的數組,為了防止查雷是溢出

      void FindBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int num = 3; int flag = 1; int mine_flag = 1; int win = 0; while (num&&(win"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (flag == 0) { flag = 1; num = 3; } if (mine[x][y] == '*') { if (mine_flag == 1) { mine[x][y] = '0'; PutOneMine(mine); //DisplayBoard(mine, ROW, COL); /*這步是更新周圍雷數的*/ int count = GetMineCount(mine, x, y); show[x][y] = count + '0';//把得到的數給show數組,但count是整型,所以轉成字符型(字符型-'0'=整型) DisplayBoard(show, ROW, COL); } else { printf("很遺憾,你被炸死了\n"); DisplayBoard(mine, ROW, COL); break; } } else {/*如果不是雷,我們就搜索該位置周圍8個位置的雷的情況*/ win++; mine_flag = 0;//到了這里雷標記就沒有了 if (mine[x][y] == '0' && show[x][y] == '*') { ShowSpread(mine, show, x, y);//顯示展開 DisplayBoard(show, ROW, COL); } //int count = GetMineCount(mine,x,y); //show[x][y] = count + '0';//把得到的數給show數組,但count是整型,所以轉成字符型(字符型-'0'=整型) //DisplayBoard(show, ROW, COL); } } else { if (flag == 1) { flag = 0; } num--; if (num == 0) { printf("你已經沒有機會了"); break; } printf("輸入坐標錯誤,你還有%d的輸入機會", num); } } if (win == row * col - EASY_COUNT) printf("恭喜你排雷成功。\n"); }

      game.h

      上面的講解是簡易棋盤9乘9的,這里我就直接來個中等難度的15乘15的

      #define ROW 15 #define COL 15 #define ROWS ROW+2 #define COLS COL+2 #define EASY_COUNT 30 //簡單版本的地雷數

      函數聲明

      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 board[ROWS][COLS], int row, int col); void FindBoard(char mine[ROWS][COLS], char show[ROWS][COLS],int row, int col); int GetMineCount(char board[ROWS][COLS], int x, int y); void PutOneMine(char board[ROWS][COLS]); void ShowSpread(char mine[ROWS][COLS],char show[ROWS][COLS], int x, int y);

      測試圖

      次數限制

      炸死

      第一步開始連續踩雷,泉水無敵效應坐標2 3是有雷的

      但為了防止剛開始就死,看兩幅圖2 3雷被移走了,之后只要不是連續踩雷就不會出現這個情況

      遞歸展開

      贏了

      9 2是唯一一個沒有雷的

      5G游戲 數據結構

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

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

      上一篇:漢字轉換拼音(wps漢字轉換拼音)
      下一篇:【華為人故事】從特種兵到華為人
      相關文章
      亚洲日韩欧洲乱码AV夜夜摸| 国产亚洲精品久久久久秋霞| 亚洲AV无码成人精品区蜜桃 | 国产成人 亚洲欧洲| 亚洲最大成人网色香蕉| 亚洲国产精品成人精品软件 | 亚洲第一视频在线观看免费| 噜噜综合亚洲AV中文无码| 久久精品国产亚洲av品善| 激情无码亚洲一区二区三区 | 国产精品亚洲二区在线| 精品国产亚洲一区二区三区在线观看 | 亚洲精品国产精品国自产网站| 亚洲国产人成在线观看| 亚洲无吗在线视频| 亚洲人成网站色7799| 亚洲av无码成人影院一区| 精品国产日韩亚洲一区91| 亚洲精品一级无码中文字幕| 亚洲美女在线国产| 国产AV无码专区亚洲AWWW| 国产亚洲精品a在线观看app| 久久青青成人亚洲精品| 久久精品国产亚洲AV高清热| 亚洲一卡二卡三卡| 亚洲日韩一区二区一无码| 亚洲av成人一区二区三区在线播放| 国产尤物在线视精品在亚洲| 亚洲AV无码一区二区三区国产| 亚洲日韩国产精品乱| 中文字幕人成人乱码亚洲电影| 亚洲人成人网站色www| 亚洲a在线视频视频| 亚洲理论片在线观看| 久久国产亚洲精品| 无码专区一va亚洲v专区在线| 精品亚洲成α人无码成α在线观看 | 亚洲 欧洲 自拍 另类 校园| 亚洲JLZZJLZZ少妇| 亚洲精品线路一在线观看 | 亚洲色精品三区二区一区|