C語言二維數(shù)組應(yīng)用之掃雷游戲
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下
上次用數(shù)組完成了一個(gè)井字棋,接下來用數(shù)組完成一個(gè)簡(jiǎn)易版掃雷。
《掃雷》是一款大眾類的益智小游戲,于1992年發(fā)行。游戲目標(biāo)是在短的時(shí)間內(nèi)根據(jù)格子出現(xiàn)的數(shù)字找出所有非雷格子,同時(shí)避免踩雷,踩到一個(gè)雷即全盤皆輸。
根據(jù)上述定義,我們可知,游戲勝利的要求是:找出所有非雷的格子。
現(xiàn)在我們簡(jiǎn)單梳理一下完成游戲的思路
一、變量定義
1、首次要定義地圖變量,這里注意要定義兩個(gè)二維數(shù)組,一個(gè)用來存放地雷的分布情況,另一個(gè)存放玩家看見的地圖。
這里以9*9的地圖為例
char playerMap[9][9];
char mineMap[9]9];
剩下的操作都在這兩個(gè)地圖上進(jìn)行
二、游戲步驟
1、初始化兩張地圖,即
將玩家所見的地圖初始化為全為草地的樣子(這里用*代表草地);
將地雷分布地圖用隨機(jī)數(shù)生成10個(gè)地雷,有雷的位置用 '1' 表示,沒有雷的位置用 '0' 表示;
需注意 (1)、隨機(jī)生成的地雷位置不能超出地圖邊界;
(2)、生成地雷的位置在生成前必須沒有地雷;
2、打印地圖給玩家看,這里打印的是玩家地圖 playerMap ;
3、玩家操作,輸入所要揭開的位置坐標(biāo);
需注意 (1)、需要判斷玩家所輸入的坐標(biāo)是否超界;
(2)、需要判斷玩家所輸入的坐標(biāo)是否已經(jīng)被揭開;
4、判斷玩家選擇位置是否是雷,
若是,則輸出"你輸了",跳到6;
若不是,更改玩家看見地圖的信息,即顯示玩家所選位置的周圍有幾個(gè)雷,進(jìn)入下一步;
5、打印玩家地圖,即將剛才地圖的更新情況告知玩家;
5、判斷玩家是否勝利(未被揭開的位置的個(gè)數(shù)是否和雷的個(gè)數(shù)一致,一致代表玩家已經(jīng)找出了所有不是雷的位置,玩家勝利);
若還未勝利,回到3;
若勝利,則輸入"你贏了",進(jìn)入下一步;
6、打印地雷的分布地圖;
7、游戲結(jié)束。
三、代碼實(shí)現(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'; ?? ??? ?} ?? ?} ?? ?//隨機(jī)生成10個(gè)雷 ?? ?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){ ?? ?//定義所選位置周圍的地雷的個(gè)數(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("輸入橫縱坐標(biāo)選擇沒有雷的位置,(橫 縱)\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("請(qǐng)您重新輸入位置\n"); ?? ?} ?? ?//判斷是不是雷,如果是 ?? ?if (mineMap[row][col] == '1'){ ?? ??? ?return 1; ?? ?} ?? ?else{//否則(不是雷)更新地圖信息 ?? ??? ?updateMapInfor(playerMap, mineMap, row, col); ?? ??? ?return 0; ?? ?} ?? ? } ? //判斷玩家是否勝利(所有雷是否已經(jīng)被找完),返回值為1代表勝利,0代表還未勝利 //判斷方法為,檢查玩家地圖上未揭起的位置是否和雷的個(gè)數(shù)相等 //(可揭起的一定不是雷,未揭起的可能是雷) //若未揭起的個(gè)數(shù)大于雷的個(gè)數(shù)說明游戲還未結(jié)束 int isWin(char playerMap[MAX_ROW][MAX_COL]){ ?? ?//玩家地圖中草坪的個(gè)數(shù),也就是未揭起位置的個(gè)數(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,地雷的位置隨機(jī)生成,有雷為1,沒雷為0 ?? ?initMap(playerMap, mineMap); ?? ?//2.打印map1 ?? ?printMap(playerMap); ?? ?//TODO ?? ?//printMap(mineMap); ?? ?while (1){ ?? ??? ?//3.玩家操作,輸入坐標(biāo) ?? ??? ?//判斷玩家選擇的位置是否是雷 ?? ??? ?//若是則跳出循環(huán)結(jié)束 ?? ??? ?if (playDo(playerMap, mineMap) == 1){ ?? ??? ??? ?printf("你輸了\n"); ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?//判斷所有雷是否已經(jīng)被找完 ?? ??? ?//是,則游戲勝利 ?? ??? ?if (isWin(playerMap)==1){ ?? ??? ??? ?printf("你贏了\n"); ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?//否,則繼續(xù)游戲 ?? ??? ?//4.打印map1 ?? ??? ?printMap(playerMap); ?? ?} ?? ?//5.判斷游戲是否結(jié)束,否回到3 ?? ?//6.是,游戲結(jié)束,打印地雷位置圖 ?? ?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("您的輸入有誤,請(qǐng)重新輸入\n"); ?? ??? ?} ?? ?} ?? ?system("pause"); ?? ?return 0; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++簡(jiǎn)單實(shí)現(xiàn)RPC網(wǎng)絡(luò)通訊的示例詳解
RPC是遠(yuǎn)程調(diào)用系統(tǒng)簡(jiǎn)稱,它允許程序調(diào)用運(yùn)行在另一臺(tái)計(jì)算機(jī)上的過程,就像調(diào)用本地的過程一樣。本文將用C++簡(jiǎn)單實(shí)現(xiàn)RPC網(wǎng)絡(luò)通訊,感興趣的可以了解一下2023-04-04C++ txt 文件讀取,并寫入結(jié)構(gòu)體中的操作
這篇文章主要介紹了C++ txt 文件讀取,并寫入結(jié)構(gòu)體中的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12Qt實(shí)現(xiàn)網(wǎng)易云音樂進(jìn)度條效果
這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)網(wǎng)易云音樂進(jìn)度條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08常用的C++標(biāo)準(zhǔn)庫頭文件小結(jié)
C++標(biāo)準(zhǔn)庫定義了一系列函數(shù)、宏和對(duì)象,以實(shí)現(xiàn)跨團(tuán)隊(duì)、跨平臺(tái)的高效且具有卓越性能的標(biāo)準(zhǔn)化 C++ 代碼, 本文介紹常用的C++標(biāo)準(zhǔn)庫頭文件,需要的朋友可以參考下2023-11-11C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹的實(shí)現(xiàn)方法
這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹的實(shí)現(xiàn)方法,簡(jiǎn)單說明了哈夫曼樹的原理,并結(jié)合具體實(shí)例形式分析了C++實(shí)現(xiàn)哈夫曼樹的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11