1. 程式人生 > 程式設計 >C語言實現控制檯掃雷小遊戲

C語言實現控制檯掃雷小遊戲

C語言實現控制檯“掃雷”小遊戲

C語言實現控制檯掃雷小遊戲

根據以往的遊戲經驗,我們能首先可以確定掃雷遊戲勝利的規則是:翻開所有不是雷的區域才能算是勝利。

接下來我們需要確定整個程式的設計思路:

1.首先,我們定義兩個9*9的二維數還是未翻開的狀態組。第一個陣列用來表示雷區地圖的展開情況,即每個素組元素的位置的狀態是處於展開狀態還是未展開狀態,我們命名為showMap()。第二個陣列我們用來表示地雷的分佈情況,素組中的每個元素位置都被標記為是否為地雷,我們命名為minMap()。
2.初始化兩個地圖,並將地圖打印出來。
3.玩家通過輸入二維陣列的座標進行位置輸入,翻開地圖位置。
4.判斷玩家輸入的位置是否合法。
5.判斷玩家輸入的位置是否有地雷,如果有地雷則直接宣佈遊戲結束;若果沒有地雷則繼續進行遊戲。

6.如果繼續遊戲,則玩家輸入的位置處會顯示附近地雷的個數。

第一步,此處通過構造menu()函式搭建一個簡單的互動選單和玩家互動,用來判斷是否開始進行一局遊戲。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//巨集定義
#define MAX_ROW 9
#define MAX_COL 9
#define DEFAULT_MINE_COUNT 10

int menu() {
 printf("======================\n");
 printf(" 1. 開始遊戲\n");
 printf(" 0. 結束遊戲\n");
 printf("======================\n");
 printf(" 請輸入您的選擇: ");
 int choice = 0;
 scanf("%d",&choice);
 return choice;
}

int main() {
 srand((unsigned int)time(0));
 while (1) {
 int choice = menu();
 if (choice == 1) {
 game();//此處呼叫了game()函式.
 }
 else if (choice == 0) {
 printf("Goodbye!\n");
 break;
 }
 else {
 printf("您的輸入有誤!\n");
 }
 }
 system("pause");
 return 0;
}

第二步,對第一步中呼叫的game()函式進行構造。game()函式為核心功能函式,其主要任務是完成基本流程。

1.構建init()函式,對兩個二維陣列進行初始化操作。初始化 showMap,將陣列所有元素全都設為 * 。初始化 mineMap,先全設為 ‘0',然後隨機生成 N 個 ‘1' ,此處的'1'就代表地雷, N 的值就是 DEFAULT_MINE_COUNT,也就是地雷的數量。

void init(char showMap[MAX_ROW][MAX_COL],char mineMap[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
 for (int col = 0; col < MAX_COL; col++) {
 showMap[row][col] = '*';
 }
 }
 for (int row = 0; row < MAX_ROW; row++) {
 for (int col = 0; col < MAX_COL; col++) {
 mineMap[row][col] = '0';
 }
 }
 int n = DEFAULT_MINE_COUNT;
 while (n > 0) {
 // 生成雷的隨機位置. 
 int row = rand() % MAX_ROW;
 int col = rand() % MAX_COL;
 if (mineMap[row][col] == '1') {
 // 如果當前位置已經有雷了,就直接進入下次迴圈,重新
 // 產生隨機位置. 
 continue;
 }
 mineMap[row][col] = '1';
 n--;
 }
}

2.構建printMap()函式,該函式負責列印顯示地圖,需要注意的是,大部分情況下列印的都是 showMap, 但是在 GameOver 的時候,就需要列印 mineMap。

void printMap(char theMap[MAX_ROW][MAX_COL]) {
 // 先打印出第一行,第一行就是包含所有的列號。
 // 然後在列印下面的每一行的時候再列印行號。
 printf(" |");
 for (int col = 0; col < MAX_COL; col++) {
 printf("%d ",col);
 }
 printf("\n");
 printf("--+------------------\n");
 for (int row = 0; row < MAX_ROW; row++) {
 printf(" %d|",row);
 for (int col = 0; col < MAX_COL; col++) {
 printf("%c ",theMap[row][col]);
 }
 printf("\n");
 }
}

3.構建updateShowMap()函式,用於根據當前 輸入的(row,col) 的位置,計算出當前位置周圍有幾個雷, 並且更新顯示到 showMap 中。

void updateShowMap(char showMap[MAX_ROW][MAX_COL],char mineMap[MAX_ROW][MAX_COL],int row,int col) {
 int count = 0;
 for (int r = row - 1; r <= row + 1; r++) {
 for (int c = col - 1; c <= col + 1; c++) {
 if (r < 0 || r >= MAX_ROW
 || c < 0 || c >= MAX_COL) {
 // 如果(row,col) 下標越界,就直接跳過。
 continue;
 }
 if (mineMap[r][c] == '1') {
 count++;
 }
 }
 }
 // 此時 count 裡面就已經存好了 (row,col )周圍八個格子裡的雷的個數。
 // 把這個結果寫到 showMap 中即可。
 // 需要把數字 count 轉成對應的字元,例如: count 為 2,就需要轉成 '2' (ASCII 50)
 showMap[row][col] = count + '0';
}

最後,我們整合以下功能函式就得到了我們的game()函式。

void game() {
 // 1. 建立地圖並初始化。(兩個地圖)。
 char showMap[MAX_ROW][MAX_COL] = { 0 };
 char mineMap[MAX_ROW][MAX_COL] = { 0 };
 init(showMap,mineMap);
 int openedBlockCount = 0;
 while (1) {
 printMap(mineMap);
 printf("=================================\n");
 printMap(showMap);
 // 2. 程式讀取玩家輸入的要翻開位置的座標,並校驗。
 int row = 0;
 int col = 0;
 printf("請輸入要翻開的座標(row col): ");
 scanf("%d %d",&row,&col);
 if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
 printf("您輸入的座標有誤!\n");
 continue;
 }
 if (showMap[row][col] != '*') {
 printf("當前位置已經翻開了!\n");
 continue;
 }
 // 3. 判定該位置的座標是否是地雷. 如果是地雷,直接 GameOver。
 if (mineMap[row][col] == '1') {
 printf("GameOver!\n");
 // 遊戲結束的時候最好再列印一遍地雷的地圖,讓玩家死的明白。
 printMap(mineMap);
 break;
 }
 // 4. 如果不是地雷,統計當前位置周圍雷的個數,並顯示到地圖上。 
 updateShowMap(showMap,mineMap,row,col);
 // 5. 判定遊戲是否勝利,核心邏輯應該是判斷當前是不是把所有不是雷的位置都翻開了
 //此處可以記錄翻開的格子的個數。
 openedBlockCount++;
 if (openedBlockCount == MAX_ROW * MAX_COL - DEFAULT_MINE_COUNT) {
 printf("遊戲勝利!\n");
 printMap(mineMap);
 break;
 }
 }
}

執行截圖:

1.遊戲啟動:

C語言實現控制檯掃雷小遊戲

2.輸入座標非法提示:

C語言實現控制檯掃雷小遊戲

3.輸入座標位置已翻開。

C語言實現控制檯掃雷小遊戲

4.遊戲結束。

C語言實現控制檯掃雷小遊戲

更多有趣的經典小遊戲實現專題,分享給大家:

C++經典小遊戲彙總

python經典小遊戲彙總

python俄羅斯方塊遊戲集合

JavaScript經典遊戲 玩不停

java經典小遊戲彙總

javascript經典小遊戲彙總

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。