日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

经典游戏扫雷详解--你也可以写出扫雷和玩好扫雷

發(fā)布時(shí)間:2023/12/10 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 经典游戏扫雷详解--你也可以写出扫雷和玩好扫雷 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

掃雷小游戲

經(jīng)典游戲掃雷,在學(xué)習(xí)C語言基礎(chǔ)后,今天試著用C語言去實(shí)現(xiàn)這個(gè)經(jīng)典小游戲。

1.游戲介紹

掃雷想必大家都不陌生,但是,是不是還有很多人不知道怎么掃雷呢?是不是一點(diǎn)就踩雷被呢?別看了,說的就是你!那么,下面就給大家介紹一下這個(gè)游戲的玩法。

注意:(改圖截自掃雷游戲網(wǎng)頁版)
圖例:
左上角的數(shù)字 10–表示雷的個(gè)數(shù)(此時(shí)為8由于我已經(jīng)手動(dòng)標(biāo)了兩處旗,表明我已經(jīng)排除兩個(gè)雷了)
右上角的數(shù)字目前為 002–表示的是排查出雷的個(gè)數(shù)(圖中的兩個(gè)小旗)

游戲規(guī)則:我們看序號(hào) 1 ,以我們畫圈的哪個(gè)數(shù)字 1為中心畫一個(gè)九宮格,此時(shí)九宮格內(nèi)只有一個(gè)方塊,而我們這個(gè)中心數(shù)字又是 1,表明以這個(gè)數(shù)字為中心的九宮格內(nèi)的八個(gè)方塊里有一個(gè)雷,并且,此時(shí)這個(gè)九宮格內(nèi)只有一個(gè)方塊還沒有點(diǎn)開,其他地方都點(diǎn)開了并且顯示了數(shù)字說明不是雷,因此這一個(gè)方塊里一定是雷,我們插上小旗表明已經(jīng)排除此處是雷。我們再來看序號(hào) 2,同樣以我們畫圈的那個(gè)數(shù)字 1 為中心畫一個(gè)九宮格,但由于九宮格最底下那一行已經(jīng)超出了游戲范圍,因此在邊界線上的數(shù)字為中心畫九宮格只需要考慮九宮格邊界線以內(nèi)的情況就可以。同理,此時(shí)中心數(shù)字是 1 表明現(xiàn)在這個(gè)九宮格內(nèi)的八個(gè)方塊有一個(gè)一定是雷,由于只有一個(gè)方塊沒有排除,其他均已排除并顯示數(shù)字表明不是雷,只有這最有一個(gè)方塊沒排除,因此一定是雷。 最后,如果中心數(shù)字是 2 哪以中心數(shù)字 2 為九宮格內(nèi)的八個(gè)方塊內(nèi)一定有兩個(gè)雷,其他數(shù)字同理。現(xiàn)在,應(yīng)該沒有人不會(huì)了吧。

2.掃雷代碼邏輯

1.創(chuàng)建數(shù)組

由上面玩游戲的過程可以體會(huì)到,我們需要兩個(gè)二維素組來分別存放雷和展示雷

2.初始化素組

我們看到,一開始點(diǎn)開這個(gè)游戲界面的時(shí)候,只有小方塊,因此我們也需要將它進(jìn)行一個(gè)初始化

3.展示(打印)數(shù)組

存放好后的信息都已經(jīng)放在了數(shù)組里,玩家進(jìn)行游戲時(shí),需要根據(jù)我們展示的信息來完成掃雷,因此我們需要將這個(gè)數(shù)組打印出來給玩家觀察

4.設(shè)置雷(埋雷)

在進(jìn)行掃雷之前,需要規(guī)定多大的棋盤里一共需要埋下多少顆雷來讓玩家進(jìn)行掃雷

5.掃雷

當(dāng)上述準(zhǔn)備過程都已經(jīng)完成后,那接下來就是掃雷的過程啦,根據(jù)我們的玩法規(guī)則,結(jié) 合展示的信息完成掃雷

6.展開該坐標(biāo)周圍沒有雷的全部方塊

掃雷展開過程 效果展示

(該視頻錄制掃雷網(wǎng)頁版)

下面我們一起來觀察一下這個(gè)展開效果。視頻中可以觀察到,前幾次我點(diǎn)開的每一個(gè)方塊都只有這一個(gè)方塊沒了并且顯示了數(shù)字,根據(jù)我們的規(guī)則,以這個(gè)數(shù)字為中心的九宮格是有該數(shù)字個(gè)雷的,因此他的周圍沒有展開我的最后一步,點(diǎn)開了右下角的一個(gè)方塊,一下子周圍很多方塊都消失了,這就是展開的效果,根據(jù)規(guī)則我們可以知道,展開是需要一定前提的:1.這個(gè)坐標(biāo)本身不是雷2.這個(gè)坐標(biāo)九宮格內(nèi)的其他坐標(biāo)不能是雷

7. 判斷輸贏

到最后,如果玩家找到了所有的雷,那么意味著排雷成功,若是中途觸雷,則直接判定失敗

3.詳細(xì)步驟實(shí)現(xiàn)

1.創(chuàng)建數(shù)組

采取分模塊寫法:
1.test.c的主源文件中寫主體步驟
2.game.h 中申明掃雷游戲模塊相關(guān)的函數(shù)申明,自定義等
3.game.c 中實(shí)現(xiàn)函數(shù)定義

test.c 中代碼如下:

void game()//游戲函數(shù)實(shí)現(xiàn) {char mine[ROWS][COLS] = { 0 };//存放雷的數(shù)組char show_mine[ROWS][COLS] = { 0 };//存放展示掃雷的素組}void menu() //菜單函數(shù)實(shí)現(xiàn) {printf("****************\n");printf("**** 1.play ****\n");printf("**** 0.exit ****\n");printf("****************\n"); }int main() {int input = 0;srand((unsigned)time(NULL));do{menu(); //菜單printf("請選擇: \n");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("即將退出游戲\n");break;default:printf("選擇錯(cuò)誤,請重新選擇\n");break;}} while (input);//玩家輸入的值來進(jìn)行循環(huán)的判斷,可達(dá)到循環(huán)玩游戲的效果return 0; }

game.h 中代碼如下:

#define ROW 9 //操作的行 #define COL 9 //操作的列 #define COLS COL+2 //防止數(shù)組越界 #define ROWS ROW+2 //防止素組越界

由于我們看到的掃雷的棋盤是一個(gè)9*9的棋盤,因此我們操作的棋盤應(yīng)該就是這個(gè)大小,但是當(dāng)判斷內(nèi)容時(shí),我們是以一個(gè)數(shù)字為中心的九宮格,那么,在邊界上的數(shù)字(如上圖所示)的九宮格就會(huì)超過需要的棋盤大小,為了防止越界,我們將棋盤的行列均擴(kuò)大,上下左右均需要擴(kuò)大,因此行列擴(kuò)大兩行。

2.初始化素組

test.c 中代碼如下:

void game() {char mine[ROWS][COLS] = { 0 };//存放雷的數(shù)組char show_mine[ROWS][COLS] = { 0 };//展示掃雷的素組--給玩家觀察的數(shù)組Initboard(mine, ROWS, COLS, '0'); //初始化為字符‘0’ Initboard(show_mine, ROWS, COLS, '*');//初始化為字符‘*’}

game.h 中代碼如下:

//初始化數(shù)組中的內(nèi)容 void Initboard(char board[ROWS][COLS], int rows, int cols ,char sz);

game.c 中代碼如下:

game.c 中實(shí)現(xiàn)函數(shù)時(shí)所涉及的頭文件我們放在game.h中,可以防止重復(fù)引用

#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"//用了game.h 中 ROWS COLS 等自定義的變量須應(yīng)用頭文件 void Initboard(char board[ROWS][COLS], int rows, int cols,char sz) { //**傳入 sz 這個(gè)字符參數(shù) 方便我們一個(gè)函數(shù)可以解決 雷的棋盤和展示棋盤的初始化**int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = sz;}} }

3.展示(打印)數(shù)組

test.c 中代碼如下:

void game() {char mine[ROWS][COLS] = { 0 };//存放雷的數(shù)組char show_mine[ROWS][COLS] = { 0 };//展示掃雷的數(shù)組--給玩家觀察的數(shù)組Initboard(mine, ROWS, COLS, '0'); //初始化為字符‘0’ Initboard(show_mine, ROWS, COLS, '*');//初始化為字符‘*’print_board(show_mine, ROW, COL);//展示掃雷的數(shù)組 //注意的是,我們操作的是展示的9*9的棋盤,因此我們傳入的棋盤行列大小也是9*9,即ROW,COL }

game.h 中代碼如下:

#include<stdio.h>//打印初始化后的內(nèi)容 void print_board(char board[ROWS][COLS], int row, int col);我們傳入的是show_mine 這個(gè)數(shù)組,因此這里的【ROWS】【COLS】也應(yīng)當(dāng)是和 show_mine創(chuàng)建的時(shí)候保持一直,但我們展示的卻是9*9的棋盤,因此傳入的行列是 row和col

game.c 中代碼如下:

void print_board(char board[ROWS][COLS], int row, int col) {printf("--------掃雷-------\n");//上分割線int i = 0;int j = 0;//打印橫坐標(biāo)for (i = 0; i <= row; i++) {if (i == 0)printf(" ");elseprintf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);// 打印縱坐標(biāo)for (j = 1; j <= col; j++){printf("%c ", board[i][j]); //展示坐標(biāo)上存儲(chǔ)的內(nèi)容}printf("\n");}printf("--------掃雷-------\n");下分割線 }

效果展示:

4. 設(shè)置雷(埋雷)

test.c 中代碼如下:

void game() {char mine[ROWS][COLS] = { 0 };//存放雷的數(shù)組char show_mine[ROWS][COLS] = { 0 };//展示掃雷的數(shù)組--給玩家觀察的數(shù)組Initboard(mine, ROWS, COLS, '0'); //初始化為字符‘0’ Initboard(show_mine, ROWS, COLS, '*');//初始化為字符‘*’print_board(show_mine, ROW, COL);//展示掃雷的數(shù)組Set_mine(mine, ROW, COL);//埋雷的過程,只操作我們存放雷的數(shù)組//print_board(mine, ROW, COL);//可以觀察設(shè)置的雷是否正確 }

game.h 中代碼如下:

#define junior_mine 10 //雷的數(shù)目 #include<stdlib.h>//srand,rand 的頭文件 #include<time.h> //time 的頭文件 //設(shè)置雷 void Set_mine(char board[ROWS][COLS], int row, int col); 同上面展示雷的數(shù)組一樣,埋雷的這個(gè)數(shù)組操作的是創(chuàng)建的 mine這個(gè)數(shù)組 【ROWS】【COLS】需要保持一直,由于掃雷的方塊是9*9大小,所以我們傳 入的棋盤大小任然是row 和 col

game.c 中代碼如下:

void Set_mine(char board[ROWS][COLS], int row, int col) {int x = 0;int y = 0;int count = junior_mine;while (count) //雷的數(shù)量為0時(shí)跳出循環(huán)說明雷已經(jīng)布置完了{//隨機(jī)產(chǎn)生雷的坐標(biāo)在 1~9的范圍內(nèi)x = rand() % row + 1;y = rand() % col + 1;if (board[x][y] == '0') //說明該坐標(biāo)處沒有雷并且可以設(shè)置雷{board[x][y] = '1'; //埋雷成功 用 字符 1表示count--;}} }

5.掃雷

test.c 中代碼如下:

void game() {char mine[ROWS][COLS] = { 0 };//存放雷的數(shù)組char show_mine[ROWS][COLS] = { 0 };//展示掃雷的數(shù)組--給玩家觀察的數(shù)組Initboard(mine, ROWS, COLS, '0'); //初始化為字符‘0’ Initboard(show_mine, ROWS, COLS, '*');//初始化為字符‘*’print_board(show_mine, ROW, COL);//展示掃雷的數(shù)組Set_mine(mine, ROW, COL);Find_mine(mine, show_mine, ROW, COL);}

game.h 中代碼如下:

//排雷 void Find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c 中代碼如下:

//統(tǒng)計(jì)該坐標(biāo)周圍雷的個(gè)數(shù) int sum_mine(char board[ROWS][COLS], int x, int y) {int sum = 0;int i = 0;int j = 0;for (i = x - 1; i <= x + 1; i++) {//產(chǎn)生以該坐標(biāo)為中心的九宮格內(nèi)的八個(gè)坐標(biāo)for (j = y - 1; j <= y + 1; j++){sum+=board[i][j] - '0'; //注意數(shù)字和字符之間的轉(zhuǎn)換}}return sum; }void Find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {printf("請輸入坐標(biāo)進(jìn)行排查:\n");int x = 0;int y = 0;//IsWin函數(shù)用于判斷是否勝利 下在一步具體實(shí)現(xiàn)while (IsWin(show,row,col)==0) {scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col)//判斷坐標(biāo)合法性{if (mine[x][y] == '1'){printf("踩雷!\n");print_board(mine, ROW, COL);//踩雷后給玩家展示踩雷在哪里//和雷的全部坐標(biāo)break;}else //沒有踩雷{int count = sum_mine(mine, x, y);//先統(tǒng)計(jì)該做標(biāo)的周圍的雷show[x][y] = count + '0';//注意int類型和字符類型轉(zhuǎn)換Open_Not_mine(mine, show, x, y);//展開該坐標(biāo)周圍沒有雷的方塊print_board(show, ROW, COL);//展示完以及雷的個(gè)數(shù)統(tǒng)計(jì)后,展示給玩家觀察}}elseprintf("輸入錯(cuò)誤,請重新輸入\n");}

6.展開該坐標(biāo)周圍沒有雷的全部方塊

由于展開周圍坐標(biāo)沒有雷的方塊這個(gè)函數(shù)不屬于游戲模塊test.c 中的game()里的函數(shù),因此不需要寫在game.h中聲明

game.c 中代碼如下:

void Open_Not_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y) {int i = 0;int j = 0;int count = 0;//判斷坐標(biāo)是否合法if (x >= 1 && x <= 9 && y >= 1 && y <= 9){ for (i = -1; i<= 1; i++){ //該坐標(biāo)為中心的八個(gè)坐標(biāo)的循環(huán)寫法for (j = -1; j<= 1; j++){//如果這個(gè)坐標(biāo)不是雷的情況下if (mine[x + i][y + j] == '0'){ // 注意是 [x+i]和[y+i] 是改坐標(biāo)周圍其他坐標(biāo)//統(tǒng)計(jì)這個(gè)坐標(biāo)周圍的雷count = sum_mine(mine, x + i, y + j);if (count == 0) //坐標(biāo)周圍沒有雷,說明可以展開{if (show[x + i][y + j] == '*'){show[x + i][y + j] = ' ';Open_Not_mine(mine, show, x + i, y + j); //回去遞歸調(diào)用周圍坐標(biāo)判斷}}else //周圍有雷 則這個(gè)坐標(biāo)軸為中心的九宮格將不展開{show[i + x][j + y] = count + '0'; //統(tǒng)計(jì)這個(gè)坐標(biāo)周圍有幾個(gè)雷并顯示在改坐標(biāo)處}}}}} }

7.判斷輸贏

同展開函數(shù) Open_Not_mine 一樣, 判斷輸贏這個(gè)函數(shù)也不需要在game.h中進(jìn)行聲明

game.c中代碼如下:

int IsWin(char show[ROWS][COLS], int row, int col) {int i = 0;int j = 0;int count = 0;for (i = 1; i <= row;i++){//判斷坐標(biāo)范圍for (j = 1; j <= col; j++){if (show[i][j] == '*'){count++; //統(tǒng)計(jì)show數(shù)組在9*9中棋盤上一共有多少個(gè)不是雷的個(gè)數(shù)}}} //雷的個(gè)數(shù)return count == junior_mine;//相等返回1 不想動(dòng)返回0//相等時(shí)說明 沒有雷的方塊都已經(jīng)找到了,其余的位置都為雷--勝利//不相等的時(shí)候表明,不是雷的方塊還沒有全部找出來--未勝利 }

總結(jié)

以上是生活随笔為你收集整理的经典游戏扫雷详解--你也可以写出扫雷和玩好扫雷的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。