C語言二維數(shù)組應用之掃雷游戲
本文實例為大家分享了C語言實現(xiàn)掃雷游戲的具體代碼,供大家參考,具體內容如下
上次用數(shù)組完成了一個井字棋,接下來用數(shù)組完成一個簡易版掃雷。
《掃雷》是一款大眾類的益智小游戲,于1992年發(fā)行。游戲目標是在短的時間內根據(jù)格子出現(xiàn)的數(shù)字找出所有非雷格子,同時避免踩雷,踩到一個雷即全盤皆輸。
根據(jù)上述定義,我們可知,游戲勝利的要求是:找出所有非雷的格子。
現(xiàn)在我們簡單梳理一下完成游戲的思路
一、變量定義
1、首次要定義地圖變量,這里注意要定義兩個二維數(shù)組,一個用來存放地雷的分布情況,另一個存放玩家看見的地圖。
這里以9*9的地圖為例
char playerMap[9][9];
char mineMap[9]9];
剩下的操作都在這兩個地圖上進行
二、游戲步驟
1、初始化兩張地圖,即
將玩家所見的地圖初始化為全為草地的樣子(這里用*代表草地);
將地雷分布地圖用隨機數(shù)生成10個地雷,有雷的位置用 '1' 表示,沒有雷的位置用 '0' 表示;
需注意 (1)、隨機生成的地雷位置不能超出地圖邊界;
(2)、生成地雷的位置在生成前必須沒有地雷;
2、打印地圖給玩家看,這里打印的是玩家地圖 playerMap ;
3、玩家操作,輸入所要揭開的位置坐標;
需注意 (1)、需要判斷玩家所輸入的坐標是否超界;
(2)、需要判斷玩家所輸入的坐標是否已經(jīng)被揭開;
4、判斷玩家選擇位置是否是雷,
若是,則輸出"你輸了",跳到6;
若不是,更改玩家看見地圖的信息,即顯示玩家所選位置的周圍有幾個雷,進入下一步;
5、打印玩家地圖,即將剛才地圖的更新情況告知玩家;
5、判斷玩家是否勝利(未被揭開的位置的個數(shù)是否和雷的個數(shù)一致,一致代表玩家已經(jīng)找出了所有不是雷的位置,玩家勝利);
若還未勝利,回到3;
若勝利,則輸入"你贏了",進入下一步;
6、打印地雷的分布地圖;
7、游戲結束。
三、代碼實現(xiàn)
#define _CRT_SECURE_NO_WARNINGS #define MAX_ROW 9 #define MAX_COL 9 #define MAX_MINE_NUM 10 #include <stdio.h> #include <stdlib.h> #include <time.h> ? //菜單函數(shù) int menu(){ ?? ?printf("--------------\n"); ?? ?printf("1.開始游戲\n"); ?? ?printf("2.退出游戲\n"); ?? ?printf("--------------\n"); ?? ?int choice = 0; ?? ?scanf("%d", &choice); ?? ?return choice; } ? //初始化兩張地圖 void initMap(char playerMap[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++){ ?? ??? ??? ?playerMap[row][col] = '*'; ?? ??? ?} ?? ?} ?? ?for (int row = 0; row < MAX_ROW; row++){ ?? ??? ?for (int col = 0; col < MAX_COL; col++){ ?? ??? ??? ?mineMap[row][col] = '0'; ?? ??? ?} ?? ?} ?? ?//隨機生成10個雷 ?? ?int mineNum = 0; ?? ?while (mineNum<MAX_MINE_NUM){ ?? ??? ?int row = rand() % 9; ?? ??? ?int col = rand() % 9; ? ?? ??? ?if (mineMap[row][col] == '0'){ ?? ??? ??? ?mineMap[row][col] = '1'; ?? ??? ??? ?mineNum++; ?? ??? ?} ?? ?} } ? //打印地圖 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); ?? ??? ?printf("|"); ?? ??? ?for (int col = 0; col < MAX_COL; col++){ ?? ??? ??? ?printf("%c |", theMap[row][col]); ?? ??? ?} ?? ??? ?printf("\n"); ?? ??? ?printf("--+--+--+--+--+--+--+--+--+--+\n"); ?? ?} } ? ? //改變玩家所見地圖信息 void updateMapInfor(char playerMap[MAX_ROW][MAX_COL], char mineMap[MAX_ROW][MAX_COL],int row, int col){ ?? ?//定義所選位置周圍的地雷的個數(shù) ?? ?int numOfMine = 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 ?? ??? ??? ??? ?&&mineMap[r][c] == '1'){ ?? ??? ??? ??? ?numOfMine++; ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?playerMap[row][col] = numOfMine + '0'; } ? ? //玩家操作, //返回值代表玩家所選位置是否是雷 //是雷返回1,不是雷返回0 int playDo(char playerMap[MAX_ROW][MAX_COL], char mineMap[MAX_ROW][MAX_COL]) { ?? ?printf("輸入橫縱坐標選擇沒有雷的位置,(橫 縱)\n"); ?? ?int row = 0; ?? ?int col = 0; ?? ?while (1){ ?? ??? ?scanf("%d %d", &row, &col); ?? ??? ?if (playerMap[row][col] == '*' ?? ??? ??? ?&&row >= 0 && row < MAX_ROW ?? ??? ??? ?&&col >= 0 && col < MAX_COL) { ?? ??? ??? ?//被選位置未被揭開,且被選位置沒有越界 ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?printf("您的位置輸入有誤,可能存在如下問題\n"); ?? ??? ?printf("1.位置選擇越界\n2.所選位置已經(jīng)被揭開\n"); ?? ??? ?printf("請您重新輸入位置\n"); ?? ?} ?? ?//判斷是不是雷,如果是 ?? ?if (mineMap[row][col] == '1'){ ?? ??? ?return 1; ?? ?} ?? ?else{//否則(不是雷)更新地圖信息 ?? ??? ?updateMapInfor(playerMap, mineMap, row, col); ?? ??? ?return 0; ?? ?} ?? ? } ? //判斷玩家是否勝利(所有雷是否已經(jīng)被找完),返回值為1代表勝利,0代表還未勝利 //判斷方法為,檢查玩家地圖上未揭起的位置是否和雷的個數(shù)相等 //(可揭起的一定不是雷,未揭起的可能是雷) //若未揭起的個數(shù)大于雷的個數(shù)說明游戲還未結束 int isWin(char playerMap[MAX_ROW][MAX_COL]){ ?? ?//玩家地圖中草坪的個數(shù),也就是未揭起位置的個數(shù),初始化為0 ?? ?int numOfGrass = 0; ?? ?for (int row = 0; row < MAX_ROW; row++){ ?? ??? ?for (int col = 0; col < MAX_COL; col++){ ?? ??? ??? ?if (playerMap[row][col] == '*'){ ?? ??? ??? ??? ?numOfGrass++; ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?if (numOfGrass == MAX_MINE_NUM){ ?? ??? ?return 1; ?? ?} ?? ?return 0; } ? void game(){ ?? ?//玩家看見的地圖 ?? ?char playerMap[MAX_ROW][MAX_COL]; ?? ?//埋雷地圖 ?? ?char mineMap[MAX_ROW][MAX_COL]; ?? ?//1.初始化兩張地圖, ?? ?//一張玩家看見的map1,草地全用*表示 ?? ?//一張地雷地圖map2,地雷的位置隨機生成,有雷為1,沒雷為0 ?? ?initMap(playerMap, mineMap); ?? ?//2.打印map1 ?? ?printMap(playerMap); ?? ?//TODO ?? ?//printMap(mineMap); ?? ?while (1){ ?? ??? ?//3.玩家操作,輸入坐標 ?? ??? ?//判斷玩家選擇的位置是否是雷 ?? ??? ?//若是則跳出循環(huán)結束 ?? ??? ?if (playDo(playerMap, mineMap) == 1){ ?? ??? ??? ?printf("你輸了\n"); ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?//判斷所有雷是否已經(jīng)被找完 ?? ??? ?//是,則游戲勝利 ?? ??? ?if (isWin(playerMap)==1){ ?? ??? ??? ?printf("你贏了\n"); ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?//否,則繼續(xù)游戲 ?? ??? ?//4.打印map1 ?? ??? ?printMap(playerMap); ?? ?} ?? ?//5.判斷游戲是否結束,否回到3 ?? ?//6.是,游戲結束,打印地雷位置圖 ?? ?printMap(mineMap); } ? int main(){ ?? ?//菜單,1.開始游戲 ? 2.退出游戲 ?? ?int choice = 0; ?? ?srand((unsigned int)time(0)); ?? ?while (1){ ?? ??? ?choice = menu(); ?? ??? ?if (choice == 1){ ?? ??? ??? ?game(); ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?else if (choice == 2){ ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?else{ ?? ??? ??? ?printf("您的輸入有誤,請重新輸入\n"); ?? ??? ?} ?? ?} ?? ?system("pause"); ?? ?return 0; }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C++簡單實現(xiàn)RPC網(wǎng)絡通訊的示例詳解
RPC是遠程調用系統(tǒng)簡稱,它允許程序調用運行在另一臺計算機上的過程,就像調用本地的過程一樣。本文將用C++簡單實現(xiàn)RPC網(wǎng)絡通訊,感興趣的可以了解一下2023-04-04C++數(shù)據(jù)結構與算法之哈夫曼樹的實現(xiàn)方法
這篇文章主要介紹了C++數(shù)據(jù)結構與算法之哈夫曼樹的實現(xiàn)方法,簡單說明了哈夫曼樹的原理,并結合具體實例形式分析了C++實現(xiàn)哈夫曼樹的相關操作技巧,需要的朋友可以參考下2017-11-11