C語(yǔ)言掃雷游戲的實(shí)現(xiàn)代碼
這是一個(gè)用C語(yǔ)言實(shí)現(xiàn)的控制臺(tái)掃雷小游戲,實(shí)現(xiàn)了隨機(jī)布置炸彈、掃描炸彈、標(biāo)記炸彈、百分百第一次不被炸死等功能。
編譯器:vs2015
功能模塊圖
源代碼
#include<stdio.h> #include<stdlib.h> #include<time.h> void show(int cbd[10][10],int u[10][10]) //界面輸出函數(shù) { int i, j; //for (i = 0; i < 10; i++) //輸出全部炸彈信息(上帝視角,調(diào)試用) //{ // for (j = 0; j < 10; j++) // { // printf("%2d ", cbd[i][j]); // } // printf("\n"); //} printf(" 1 2 3 4 5 6 7 8 9 10\n"); //行標(biāo) printf(" --------------------\n"); for (i = 0; i<10; i++) //根據(jù)u數(shù)組和cbd數(shù)組的值選擇輸出 { //■:未掃描,□:周圍無(wú)炸彈,◇:炸彈標(biāo)記 for (j = 0; j<10; j++) { if (j == 0)printf("%2d║ ", i+1); if (u[i][j] == 0)printf("■"); else if (u[i][j] == 1) { if (cbd[i][j] == 0)printf("□"); else printf("%2d", cbd[i][j]); } else if (u[i][j] == -1) { printf("◇"); } } printf("\n"); } } int find(int cbd[10][10], int i, int j) //掃描周圍炸彈數(shù)目 { int l, c,lmin,cmin, lmax, cmax, num = 0; l = lmin = (i - 1) >= 0 ? (i - 1) : 0; //計(jì)算行、列起點(diǎn) c = cmin = (j - 1) >= 0 ? (j - 1) : 0; lmax = ((i + 1) < 10 ? (i + 1) : 9); //計(jì)算行、列終點(diǎn) cmax = ((j + 1) < 10 ? (j + 1) : 9); for (l = lmin; l <= lmax; l++) { for (c = cmin; c <= cmax; c++) { if (l == i&&c == j)continue; //跳過(guò)自身 if (cbd[l][c] == -1)num++; //炸彈計(jì)數(shù) } } return num; } void init(int cbd[10][10]) //cbd數(shù)組初始化(隨機(jī)布置炸彈并填充各個(gè)格子的數(shù)目) { int n = 10, l, c, i, j; srand(time(NULL)); //隨機(jī)數(shù)種子設(shè)置 for (i = 0; i< 10; i++) { for (j = 0; j< 10; j++) { cbd[i][j] = 0; //全0填充 } } while (n--) //隨機(jī)行列放置炸彈 { l = rand() % 10; c = rand() % 10; if (cbd[l][c] != -1)cbd[l][c] = -1; //炸彈重復(fù)處理 else n++; } for (i = 0; i< 10; i++) { for (j = 0; j< 10; j++) { if (cbd[i][j] != -1) { cbd[i][j] = find(cbd, i, j); //炸彈數(shù)目填充 } } } } void open(int cbd[10][10],int u[10][10], int i, int j) //周圍無(wú)炸彈時(shí)的展開(kāi)函數(shù)(遞歸展開(kāi)) { u[i][j] = 1; if (cbd[i][j] == 0) { if(i - 1 >= 0 && u[i - 1][j] != 1)open(cbd, u, i - 1, j); //上 if(j - 1 >= 0 && u[i][j - 1] != 1)open(cbd, u, i, j - 1); //左 if (i + 1 <= 9 && u[i + 1][j] != 1)open(cbd, u, i + 1, j); //下 if (j + 1 <= 9 && u[i][j + 1] != 1)open(cbd, u, i, j + 1); //右 } } int judge(int u[10][10]) //判斷游戲是否通關(guān) { int i, j, num = 0; for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { if (u[i][j] == 0 || u[i][j] == -1)num++; } } if (num == 10)return 1; else return 0; } void fail(int cbd[10][10], int u[10][10]) //游戲失敗函數(shù) { int i, j; for (i = 0; i < 10; i++) //輸出全部炸彈信息 { for (j = 0; j < 10; j++) { if (cbd[i][j] == 0)printf(" "); else if (cbd[i][j] != -1)printf("%2d", cbd[i][j]); else printf("●"); } printf("\n"); } printf("請(qǐng)大俠重新來(lái)過(guò)~\n"); } void menu(int cbd[10][10],int u[10][10]) //菜單函數(shù) { int chs,i,j; int boom = 10; //剩余炸彈數(shù) int num = 0; //步數(shù) while (1) { system("cls"); show(cbd,u); printf("還有%d個(gè)炸彈\n",boom); printf("1.掃描 2.標(biāo)記 3.取消標(biāo)記\n"); printf("請(qǐng)輸入選項(xiàng):>"); scanf("%d", &chs); if (chs > 3 || chs < 1) { printf("請(qǐng)輸入正確選項(xiàng)!\n"); system("pause"); continue; } printf("請(qǐng)輸入坐標(biāo):>"); scanf("%d %d", &i, &j); if (i < 1 || i>10) { printf("請(qǐng)輸入正確坐標(biāo)!\n"); system("pause"); continue; } i--; //輸入行列數(shù)處理(適用數(shù)組下標(biāo)) j--; if (chs == 1) { if (cbd[i][j] == -1) { if (num == 0) { //若第一步掃描到炸彈,就重新初始化棋盤 init(cbd); show(cbd, u); open(cbd, u, i, j); num++; continue; } else { fail(cbd, u); //否則游戲失敗,循環(huán)跳出 break; } } if (u[i][j] == 1) //重復(fù)掃描時(shí)的處理 { printf("該位置已經(jīng)掃描過(guò)了!\n"); system("pause"); continue; } open(cbd, u, i, j); num++; } else if(chs == 2) { if (u[i][j] == 1) { printf("該位置已經(jīng)掃描過(guò)了!\n"); //只能標(biāo)記未掃描到的 system("pause"); continue; } u[i][j] = -1; boom --; } else if (chs == 3) { if (u[i][j] != -1) { printf("該位置沒(méi)有標(biāo)記!\n"); //只能取消標(biāo)記過(guò)的 system("pause"); continue; } u[i][j] = 0; boom++; } if (judge(u)) //判斷游戲是否通關(guān) { printf("Old Fe 666!\n"); //老鐵666!,循環(huán)跳出 break; } } } int main() { int cbd[10][10] = { 0 }; //保存炸彈信息的二維數(shù)組 int u[10][10] = { 0 }; //保存是否翻開(kāi)信息的二維數(shù)組 init(cbd); //數(shù)組初始化 menu(cbd, u); //進(jìn)入菜單 return 0; }
Tips:在掃描到周圍無(wú)炸彈的格子時(shí),要將此格子周圍的部分依次打開(kāi),直到上下左右都出現(xiàn)炸彈數(shù)字為止,這里要用到遞歸的方法,我的順序?yàn)橐来芜f歸處理上、左、下、右的格子,這里順序可以任意。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版掃雷小游戲
- C語(yǔ)言實(shí)現(xiàn)掃雷小游戲(適合初學(xué)者)
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷游戲
- C語(yǔ)言代碼實(shí)現(xiàn)掃雷游戲
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷游戲
- C語(yǔ)言代碼實(shí)現(xiàn)掃雷小游戲
- C語(yǔ)言實(shí)現(xiàn)掃雷游戲
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷小程序
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲
- C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)掃雷小游戲
相關(guān)文章
C/C++實(shí)現(xiàn)Windows注冊(cè)表的基本操作
Windows注冊(cè)表(Registry)是Windows操作系統(tǒng)中用于存儲(chǔ)系統(tǒng)配置信息、用戶設(shè)置和應(yīng)用程序數(shù)據(jù)的一個(gè)集中式數(shù)據(jù)庫(kù),本文主要為大家介紹了C++對(duì)注冊(cè)表的基本操作,感興趣的小伙伴可以了解下2023-11-11C++讀取訪問(wèn)權(quán)限沖突引發(fā)異常問(wèn)題的原因分析
C語(yǔ)言是一門通用計(jì)算機(jī)編程語(yǔ)言,廣泛應(yīng)用于底層開(kāi)發(fā),最近在用C++寫代碼時(shí)經(jīng)常會(huì)遇到“引發(fā)了異常: 讀取訪問(wèn)權(quán)限沖突,所以這篇文章主要給大家介紹了關(guān)于C++讀取訪問(wèn)權(quán)限沖突引發(fā)異常問(wèn)題的相關(guān)資料,需要的朋友可以參考下2021-07-07淺談在函數(shù)中返回動(dòng)態(tài)的內(nèi)存
下面小編就為大家?guī)?lái)一篇淺談在函數(shù)中返回動(dòng)態(tài)的內(nèi)存。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12C++的cout.tellp()和cout.seekp()語(yǔ)法介紹
無(wú)論是使用 cout 輸出普通數(shù)據(jù),用 cout.put() 輸出指定字符,還是用 cout.write() 輸出指定字符串,數(shù)據(jù)都會(huì)先放到輸出流緩沖區(qū),待緩沖區(qū)刷新,數(shù)據(jù)才會(huì)輸出到指定位置,本文給大家介紹一下C++的cout.tellp()和cout.seekp()語(yǔ)法,需要的朋友可以參考下2023-09-09理解C++編程中的std::function函數(shù)封裝
這篇文章主要介紹了理解C++編程中的std::function函數(shù)封裝,std::function是C++11標(biāo)準(zhǔn)中的新特性,需要的朋友可以參考下2016-04-04C++設(shè)計(jì)模式中的觀察者模式一起來(lái)看看
這篇文章主要為大家詳細(xì)介紹了C++觀察者模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03C語(yǔ)言函數(shù)傳遞數(shù)組和傳遞地址的區(qū)別你知道嗎
這篇文章主要介紹了C語(yǔ)言中數(shù)組作為函數(shù)的參數(shù)以及返回值的使用簡(jiǎn)單入門,這里以一維數(shù)組作為基本條件進(jìn)行例子講解,需要的朋友可以參考下2021-09-09Cocos2d-x學(xué)習(xí)筆記之CCLayerColor層的使用實(shí)例
這篇文章主要介紹了Cocos2d-x學(xué)習(xí)筆記之CCLayerColor層的使用實(shí)例,CCLayerColor是一個(gè)顏色布景層類,本文依然使用Hello World作為例子講解,需要的朋友可以參考下2014-09-09