用C語言寫一個掃雷程式
阿新 • • 發佈:2018-12-17
執行環境:win10 vs2013
本程式所有設計思路均已註釋行為標記在程式中,為了方便起見,將不在部落格中進行書寫,想要學的朋友複製下面的原始碼可進行學習,也可將程式進行修改獲取不同的遊戲體驗
程式原始截圖
執行結果:
附上原始碼
#include<stdint.h> #include<stdlib.h> #include<string.h> int Menu(){ printf("1.開始遊戲\n"); printf("0.結束遊戲\n"); printf("請輸入您的選擇!: 0-1\n"); int choice = 0; scanf("%d", &choice); return choice; } #define MINE_COUNT 10 #define ROW 9 //設定為巨集後期可直接修改此處來改變地圖大下 #define COL 9 //使用二維陣列來表示掃雷的地圖,此處需要使用兩個二維陣列 //第一個二維陣列表示地雷的雷陣 //第二個二維陣列表示使用者看到的地圖 //掃雷的地圖大小是9x9,但是我們準備把這個二維陣列定義成11x11 //此時,我們的地圖有效範圍[1,ROW]和[1,COL] //對於mine_map.使用'0'表示不是地雷,使用'1'表示地雷 char mine_map[ROW + 2][COL + 2]; //對於show_map使用'*'表示未開啟的方塊,對於開啟的方塊就用具體的數字表示 char show_map[ROW + 2][COL + 2]; void Init(char mine_map[ROW + 2][COL + 2], char show_map[ROW + 2][COL + 2]){ //1.那陣列進行初始化 //對於mine_map,先把裡面所有的元素都設定為'0' memset(mine_map,'0',(ROW+2)*(COL+2)); //對於show_map,先把所有的元素都設定成'*' memset(show_map, '*', (ROW + 2)*(COL + 2)); //2.隨機佈置雷陣 srand(time(0)); //取隨機種子 int mine_count = MINE_COUNT; while (mine_count > 0){ //在這個迴圈中隨機設定地雷,沒次設定完成一個地雷,mine_count-- int row = rand()%9+1; //模9得到數字0-8 int col = rand() % 9 + 1; if (mine_map[row][col] == '0'){ mine_map[row][col] = '1'; --mine_count; } } } void DisplayMap(char map[ROW+2][COL+2]){ printf(" "); //列印第一行的內容 .列的座標 for (int col = 1; col <= COL; ++col){ printf("%d ", col); } printf("\n"); //列印具體的地圖 //列印第二行,地圖的上邊框 for (int col = 1; col <= COL; ++col){ printf("---"); } printf("\n"); //按行列印地圖中的具體內容 for (int row = 1; row <= ROW; ++row){ //先列印行號 printf("%02d| ",row); for (int col = 1; col <= COL; ++col){ printf("%c ", map[row][col]); } printf("\n"); } } void UpdateShowMap(char show_map[ROW + 2][COL + 2],char mine_map[ROW+2][COL+2] ,int row,int col ){ int mine_count = 0; mine_count = (mine_map[row - 1][col - 1] - '0') + (mine_map[row - 1][col] - '0') + (mine_map[row - 1][col + 1] - '0') + (mine_map[row][col - 1] - '0') + (mine_map[row][col + 1] - '0') + (mine_map[row + 1][col - 1] - '0') + (mine_map[row + 1][col] - '0') + (mine_map[row + 1][col + 1] - '0'); show_map[row][col] = '0' + mine_count; //為了使結果為字元型+'0' //需要統計row,col位置的元素周圍有幾個雷,並且把結果更新到show_map中 } void Game(){ //1.初始化地圖(mine_map,show_map),佈置雷陣 int not_mine_count = 0; //不是地雷的個數 Init(mine_map, show_map); //2.先列印show_map DisplayMap(show_map); while (1){ //3.提示使用者進行輸入座標[1,ROW][1,COL] int row = 0; int col = 0; printf("請輸入要翻開的方塊座標(row,col):"); scanf("%d %d", &row, &col); //4.對使用者輸入的合法性進行判定,如果不合理提示使用者重新輸入 if (row <= 0 || row > ROW || col <= 0 || col > COL){ printf("輸入不合法!請重新輸入\n"); continue; } //5.判定玩家當前是否踩雷,如果踩雷,遊戲結束,並且列印 if (mine_map[row][col] == '1'){ printf("遊戲結束!\n"); DisplayMap(mine_map); break; } //6/如果沒踩雷,判斷玩家是否勝利(條件,已經翻開的方塊數達到了 地圖方塊總數-地雷的個數) ++not_mine_count; if (not_mine_count == ROW*COL - MINE_COUNT){ printf("掃雷成功!\n"); DisplayMap(mine_map); break; } //7.如果遊戲沒有勝利,就需要統計當前位置有幾個雷,列印show_map,回到第三步 UpdateShowMap(show_map,mine_map,row,col); DisplayMap(show_map); } } void Start(){ while (1){ int choice = Menu(); if (choice == 0){ printf("退出遊戲!\n"); } Game(); } } int main(){ Start(); system("pause"); return 0; }