C語(yǔ)言開發(fā)實(shí)現(xiàn)掃雷游戲
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下
簡(jiǎn)單描述:
輸入要要掃的位置.
如果是雷,則游戲失敗.
如果將所有不是雷的位置都掃了一遍,則游戲勝利.
主要細(xì)節(jié)
1、初始化(玩家掃雷圖,地雷布局圖)
展示出來的地圖(玩家能看到的地圖)showMap
for (int row = 0; row < ROW; row++){ for (int col = 0; col < COL; col++){ showMap[row][col] = '*'; } }
地雷的布局地圖(玩家看不到的地圖)mineMap
for (int row = 0; row < ROW; row++){ for (int col = 0; col < COL; col++){ mineMap[row][col] = '*'; } } int count = 0; while (count<MINECOUNT){ int row = rand() % 9; int col = rand() % 9; mineMap[row][col] = 'L'; count++; } }
3、打印地圖
void print(char Map[ROW][COL]){ printf(" |0|1|2|3|4|5|6|7|8|\n"); for (int row = 0; row < ROW; row++){ printf("%d |", row); for (int col = 0; col < COL; col++){ printf("%c ", Map[row][col]); } printf("\n"); } }
5、玩家輸入要掃的位置信息(9*9格子中某一特定位置)
void Input(char showMap[ROW][COL], char mineMap[ROW][COL], int* row, int* col){ while (1){ printf("請(qǐng)輸入您要點(diǎn)的位置坐標(biāo):"); scanf("%d %d", row, col); if (((*row) < 0) || ((*row) >= ROW) || ((*col) < 0) || ((*col) >= COL)){ printf("輸入有誤 "); continue; } if (showMap[*row][*col] == '*'){ showMap[*row][*col] = ' '; break; } } }
7、判斷某一位置是不是地雷
//返回1表示雷;返回0表示不是雷 int isMine(char mineMap[ROW][COL], int row, int col){ if (mineMap[row][col] == 'L'){ return 1; } return 0; }
9、某一位置附近地雷的個(gè)數(shù)
int MineNerborhood(char mineMap[ROW][COL], int row, int col){ if (row < 0 || row >= ROW || col < 0 || col >= COL){ return '0'; } int count = 0; for (int r = row - 1; r <= row + 1; r++){ for (int c = col - 1; c <= col + 1; c++){ if (mineMap[r][c] == 'L'){ count++; } } } return count + '0'; }
源代碼:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<math.h> #define ROW 9 #define COL 9 #define MINECOUNT 10 void Input(char showMap[ROW][COL], char mineMap[ROW][COL], int* row, int* col){ while (1){ printf("請(qǐng)輸入您要點(diǎn)的位置坐標(biāo):"); scanf("%d %d", row, col); if (((*row) < 0) || ((*row) >= ROW) || ((*col) < 0) || ((*col) >= COL)){ printf("輸入有誤 "); continue; } if (showMap[*row][*col] == '*'){ showMap[*row][*col] = ' '; break; } } } //返回1表示雷;返回0表示不是雷 int isMine(char mineMap[ROW][COL], int row, int col){ if (mineMap[row][col] == 'L'){ return 1; } return 0; } // void init(char showMap[ROW][COL], char mineMap[ROW][COL]){ for (int row = 0; row < ROW; row++){ for (int col = 0; col < COL; col++){ showMap[row][col] = '*'; } } for (int row = 0; row < ROW; row++){ for (int col = 0; col < COL; col++){ mineMap[row][col] = '*'; } } int count = 0; while (count<MINECOUNT){ int row = rand() % 9; int col = rand() % 9; mineMap[row][col] = 'L'; count++; } } void print(char Map[ROW][COL]){ printf(" |0|1|2|3|4|5|6|7|8|\n"); for (int row = 0; row < ROW; row++){ printf("%d |", row); for (int col = 0; col < COL; col++){ printf("%c ", Map[row][col]); } printf("\n"); } } //(row,col)附近格子地雷的個(gè)數(shù) int MineNerborhood(char mineMap[ROW][COL], int row, int col){ if (row < 0 || row >= ROW || col < 0 || col >= COL){ return '0'; } int count = 0; for (int r = row - 1; r <= row + 1; r++){ for (int c = col - 1; c <= col + 1; c++){ if (mineMap[r][c] == 'L'){ count++; } } } return count + '0'; } //一局游戲 void game(){ srand(time(0)); //展示給玩家的地圖 char showMap[ROW][COL]; //雷的布局圖 char mineMap[ROW][COL]; //對(duì)兩個(gè)地圖進(jìn)行初始化 init(showMap, mineMap); //print(mineMap); //玩家已經(jīng)掃到的不是雷的格子的數(shù)目 int notMineCount = 0; printf("掃雷游戲開始啦!\n"); while (1){ //打印地圖 print(showMap); //輸入地點(diǎn) int row, col; Input(showMap, mineMap, &row, &col); //判斷是否是雷區(qū) if (isMine(mineMap, row, col) == 1){ printf(" 大兄弟,踩雷咧!\n給您看看雷的布局\n"); print(mineMap); break; } //判斷附近雷的情況 showMap[row][col]=MineNerborhood(mineMap, row, col); notMineCount++; //判斷是否贏了 if (notMineCount == ROW*COL - MINECOUNT){ print(mineMap); printf("恭喜您贏啦!\n"); break; } } } int menu(){ printf("===================\n"); printf("1.開始游戲\n"); printf("0.結(jié)束游戲\n"); printf("===================\n"); printf("請(qǐng)輸入您的選擇:"); int choice; scanf("%d", &choice); return choice; } int main(){ while (1){ int choice = menu(); if (choice == 1){ game(); }else if (choice==0){ break; }else{ printf("輸入有誤,請(qǐng)重新輸入\n"); } } system("pause"); return 0; }
運(yùn)行結(jié)果:
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言變長(zhǎng)數(shù)組 struct中char data[0]的用法詳解
下面小編就為大家?guī)硪黄狢語(yǔ)言變長(zhǎng)數(shù)組 struct中char data[0]的用法詳解。小編覺得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01Qt中關(guān)聯(lián)容器QMap,QMultiMap,QHash,QMultiHash的使用
本文主要介紹了Qt中關(guān)聯(lián)容器QMap,QMultiMap,QHash,QMultiHash的使用,這些關(guān)聯(lián)容器在Qt中提供了靈活而強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)選項(xiàng),根據(jù)具體的需求和使用場(chǎng)景,您可以選擇適合的容器來存儲(chǔ)和管理數(shù)據(jù),感興趣的可以了解一下2023-09-09C語(yǔ)言FlappyBird飛揚(yáng)的小鳥實(shí)現(xiàn)開發(fā)流程
因?yàn)樵诩艺撕枚嗵?,隨手玩了下自己以前做的一些小游戲,說真的,有幾個(gè)游戲做的是真的劣質(zhì),譬如 flappybird 真的讓我難以忍受,于是重做了一波分享給大家2022-11-11C語(yǔ)言實(shí)現(xiàn)一個(gè)文件版動(dòng)態(tài)通訊錄流程詳解
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)一個(gè)文件版動(dòng)態(tài)通訊錄流程,希望大家能從這篇文章中收獲到許多,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01C++?數(shù)據(jù)結(jié)構(gòu)超詳細(xì)講解單鏈表
這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之單鏈表,鏈表是由一個(gè)個(gè)結(jié)點(diǎn)鏈結(jié)成的。結(jié)點(diǎn)包括數(shù)據(jù)域和指針域兩部分,數(shù)據(jù)域用來存儲(chǔ)數(shù)據(jù)元素的信息,指針域用來存儲(chǔ)下一個(gè)結(jié)點(diǎn)的地址,更詳細(xì)內(nèi)容請(qǐng)需要的小伙伴參考下面文章內(nèi)容2022-03-03