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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

扫雷游戏(实现了网页版的扫雷游戏的所有逻辑)

發(fā)布時間:2023/12/10 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 扫雷游戏(实现了网页版的扫雷游戏的所有逻辑) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 掃雷游戲的邏輯
    • game.h
    • test.c
      • 游戲菜單
      • 游戲邏輯
      • 主函數(shù)
    • game.c
      • 初始化棋盤
      • 打印棋盤
      • 設(shè)置雷
      • 計算該坐標(biāo)周圍有幾個雷
      • 排雷
        • 簡易版
      • 進階版
        • 1.實現(xiàn)標(biāo)記功能
        • 2.實現(xiàn)游戲剛開始炸一片功能和輸入坐標(biāo)周圍沒有雷也炸一下
          • 炸一片功能的實現(xiàn)

掃雷游戲的邏輯

今天我們要實現(xiàn)的是掃雷游戲,實現(xiàn)9X9的棋盤,

但是值得注意的一點是,當(dāng)排雷坐標(biāo)在1 1 的時候該如何知道這個坐標(biāo)旁邊有幾個雷呢?(當(dāng)選擇這個坐標(biāo)時,看其周圍8給坐標(biāo)是否有雷——>(排雷))
為了使在邊緣的坐標(biāo)也可以檢測周圍8個坐標(biāo)是否有雷的時候,所以我們的棋盤需要是11X11

game.h

這里放的是我們的頭文件

#include<stdio.h> #include<time.h> #include<stdlib.h>#define ROW 9 #define COL 9#define ROWS ROW+2 #define COLS COL+2 //這里定義的是我的10個雷 #define Easy_count 10 //初始化棋盤 void Initboard(char board[ROWS][COLS], int row, int col,char set); //打印棋盤 void Displayboard(char board[ROWS][COLS], int row, int col); //設(shè)置雷 void Setmine(char board[ROWS][COLS], int row, int col); //排雷 void Changemine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col);

test.c

游戲菜單

void meum() {printf("***************************\n");printf("******* 1.Play *******\n");printf("******* 0.Exit *******\n");printf("***************************\n"); }

游戲邏輯

void game() {//mine是放雷的棋盤char mine[ROWS][COLS] = { 0 };//show是展示給我們看的棋盤char show[ROWS][COLS] = { 0 };//初始化掃雷棋盤Initboard(mine, ROWS, COLS,'0');//放炸彈的棋盤Initboard(show, ROWS, COLS,'*');//展示的棋盤//打印棋盤Displayboard(show, ROW, COL);//埋雷Setmine(mine, ROW, COL);Displayboard(mine, ROW, COL);//排雷Changemine(mine,show, ROW, COL);}

主函數(shù)

int main() {int input = 0;//生成隨機數(shù),等會在Setmine()隨機放雷srand((unsigned int)time(NULL));do{meum();printf("請選擇數(shù)字:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戲\n");break;default:printf("選擇錯誤,請重新選擇\n");break;}} while (input);return 0; }

game.c

初始化棋盤

這里為什么傳給一個“set”?
注意因為我們要初始兩個棋盤
第一個:放雷的棋盤 (初始的時候不設(shè)置雷,所以棋盤全都是字符‘0’)
第二個:展示個我們自己看的棋盤 (初始的時候設(shè)置成字符‘*’

void Initboard(char board[ROWS][COLS], int row, int col,char set) {int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = set;}}}

打印棋盤

void Displayboard(char board[ROWS][COLS], int row, int col) {int i = 0;int j = 0;printf("——————掃雷游戲——————\n");for (j = 0; j <= col; j++){printf("%d ", j);}printf("\n");printf("--------------------\n");for (i = 1; i <= row; i++){printf("%d|", i);for (j = 1; j <= col; j++){printf(" %c", board[i][j]);}printf("\n");}printf("——————掃雷游戲——————\n");}

設(shè)置雷

Easy_count是前面我們在game.h定義的雷的數(shù)量,
至于為什么不在while()括號里面使用Easy_count,是因為#define 定義的是一個常量,不能修改

這里有個特殊說明為什么我們明明是想在9*9里放雷,可我們這里是board[ROWS][COLS]而不是board[ROW][COL]

需要注意的是我們初始化
是11*11的棋盤,所以只能用ROWSCOLS,來接收

那我們想在9*9的棋盤放地雷怎么辦呢?
解決方法就是在調(diào)用函數(shù)的時候傳ROWCOL,這是我們在頭文件定義的。

void Setmine(char board[ROWS][COLS], int row, int col) {int count = Easy_count;while (count){int x = rand() % row + 1;int y = rand() % row + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}}

計算該坐標(biāo)周圍有幾個雷

字符‘1’表示雷 ‘0’不是雷
字符‘1’在內(nèi)存中存放的是Ascii碼,它的Ascii碼是49
字符‘0’Ascii是48

int getmine(char board[ROWS][COLS], int row, int col,int x,int y) {int i = 0;int j = 0;int ret = 0;//這里共加了9個坐標(biāo)//把本身也加上了for (i = -1; i <= 1; i++){for (j = -1; j <= 1; j++){ret += board[x + i][y + j];}}//所以需要減去該坐標(biāo)的Ascii碼return ret -board[x][y]-8 * '0';}

排雷

簡易版

void Changemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {int x = 0;int y = 0;//win表示//棋盤是9*9的總共81格//假如放10個雷,還剩下70格也表示我們可以走70步//當(dāng)70步走完還沒有碰見雷,游戲勝利int win = 0;while (win < row * col - Easy_count){printf("請輸入要排查的坐標(biāo):>");scanf("%d %d", &x, &y);//判斷屬于坐標(biāo)是否在9*9的范圍if (x >= 1 && x <= row && y >= 1 && y <= col){//檢查輸入坐標(biāo)是否重復(fù)if (show[x][y] != '*'){printf("坐標(biāo)重復(fù)輸入,請重新輸入坐標(biāo)\n");}else{//遇見雷if (mine[x][y] == '1'){printf("抱歉,你被炸死了,排雷失敗,游戲結(jié)束\n");Displayboard(mine, ROW, COL);break;}else{//當(dāng)該坐標(biāo)不是雷//查看該坐標(biāo)周圍有幾個雷int count=getmine(mine,row,col,x,y)//因為show[][]初始化的時候放的是字符‘*’//所以為了使該坐標(biāo)周圍雷的數(shù)量——>變成字符‘1’/'2'/'3'數(shù)量等等show[x][y]=count+'0';Displayboard(show, ROW, COL);//標(biāo)記雷的位置int input = 0;int i = 0;int j = 0;printf("是否標(biāo)記雷的位置 1.標(biāo)記 0.不標(biāo)記 :>");scanf("%d", &input);while (input){printf("請輸入要標(biāo)記的坐標(biāo):>");scanf("%d %d", &i, &j);show[i][j] = '!';Displayboard(show, ROW, COL);printf("繼續(xù)標(biāo)記雷的位置,請按'1',否則,請按‘0’:>");scanf("%d", &input);}}}}//坐標(biāo)范圍不合法else{printf("坐標(biāo)不合法,請重新輸入:>\n");}//游戲勝利if (win == row * col - Easy_count){printf("恭喜你,獲得游戲勝利\n");Displayboard(mine, ROW, COL);}}}

實現(xiàn)的邏輯,棋盤現(xiàn)在可以不用看

進階版

1.實現(xiàn)標(biāo)記功能

上面已給出

2.實現(xiàn)游戲剛開始炸一片功能和輸入坐標(biāo)周圍沒有雷也炸一下


void Changemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {int x = 0;int y = 0;int win = 0;//進階版代碼//生成隨機坐標(biāo),在游戲剛開始的時候,就炸一片while (1){int x = rand() % row + 1;int y = rand() % col + 1;//為了剛開始該坐標(biāo)不是雷//并且周圍也沒有雷//如果少了這個“周圍也沒有雷”的判斷條件,//那就checkmine()只會執(zhí)行一次,不會遞歸,讀者可以減去這個條件看一下效果if (mine[x][y] != '1'&&(mine[x - 1][y - 1] + mine[x - 1][y] +mine[x - 1][y + 1] +mine[x][y - 1] + mine[x][y + 1] +mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0' == 0)){//遞歸實現(xiàn)win=checkmine(mine, show, x, y, win ,row, col);break;}}Displayboard(show, ROW, COL);while (win < row * col - Easy_count){printf("請輸入要排查的坐標(biāo):>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("坐標(biāo)重復(fù)輸入,請重新輸入坐標(biāo)\n");}else{//遇見雷if (mine[x][y] == '1'){printf("抱歉,你被炸死了,排雷失敗,游戲結(jié)束\n");Displayboard(mine, ROW, COL);break;}else{//這里實現(xiàn)了輸入坐標(biāo)且該坐標(biāo)周圍沒有雷也炸一下//如果有雷就會顯示該坐標(biāo)周圍有多少雷win=checkmine(mine, show, x, y, win, row, col);Displayboard(show, ROW, COL);//標(biāo)記雷的位置int input = 0;int i = 0;int j = 0;printf("是否標(biāo)記雷的位置 1.標(biāo)記 0.不標(biāo)記 :>");scanf("%d", &input);while (input){printf("請輸入要標(biāo)記的坐標(biāo):>");scanf("%d %d", &i, &j);show[i][j] = '!';Displayboard(show, ROW, COL);printf("繼續(xù)標(biāo)記雷的位置,請按'1',否則,請按‘0’:>");scanf("%d", &input);}}}}else{printf("坐標(biāo)不合法,請重新輸入:>\n");}if (win == row * col - Easy_count){printf("恭喜你,獲得游戲勝利\n");Displayboard(mine, ROW, COL);}}}
炸一片功能的實現(xiàn)

//遞歸實現(xiàn)
//該坐標(biāo)不是雷
//該坐標(biāo)旁邊沒有雷
//該坐標(biāo)沒有被排查
//是該坐標(biāo)變成‘ ’(show[x][y]= ’ ')
從紅色開始,因為我們首先進行了判斷

所以第一個坐標(biāo)100%符合條件,
然后在x-1,y-1坐標(biāo)開始遞歸(也就是黃色)
注意這個坐標(biāo)里面包括了(紅色),也就是我們已經(jīng)篩選好的,如果遞歸里面再有這個(紅色),肯定死遞歸

int checkmine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int win, int row, int col) {//只在9*9棋盤遞歸,if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x - 1][y - 1] + mine[x - 1][y] +mine[x - 1][y + 1] +mine[x][y - 1] + mine[x][y + 1] +mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]-8*'0' == 0){win++;show[x][y] = ' ';//循環(huán)該坐標(biāo)周圍8個坐標(biāo)int i = 0;int j = 0;for (i = -1; i <= 1; i++){for (j = -1; j <= 1; j++){//這里是排除已經(jīng)檢驗過坐標(biāo),防止死遞歸if ((show[x + i][y + j] == '*')){checkmine(mine, show, x + i, y + j, win, row, col);}}}} else{win++;int count = getmine(mine, row, col, x , y );show[x][y] = count + '0';}}return win; }

至于win這個變量,就是為了保持當(dāng)炸一片的時候,步數(shù)也要+1,不然雷排完了,步數(shù)對不上,就不會顯示獲勝


至此掃雷邏輯已經(jīng)全部實現(xiàn),
各位觀眾老爺們,點個贊唄!

總結(jié)

以上是生活随笔為你收集整理的扫雷游戏(实现了网页版的扫雷游戏的所有逻辑)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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