扫雷游戏(实现了网页版的扫雷游戏的所有逻辑)
文章目錄
- 掃雷游戲的邏輯
- 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 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的棋盤,所以只能用ROWS,COLS,來接收
那我們想在9*9的棋盤放地雷怎么辦呢?
解決方法就是在調(diào)用函數(shù)的時候傳ROW,COL,這是我們在頭文件定義的。
計算該坐標(biāo)周圍有幾個雷
字符‘1’表示雷 ‘0’不是雷
字符‘1’在內(nèi)存中存放的是Ascii碼,它的Ascii碼是49
字符‘0’Ascii是48
排雷
簡易版
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)周圍沒有雷也炸一下
炸一片功能的實現(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)篩選好的,如果遞歸里面再有這個(紅色),肯定死遞歸
至于win這個變量,就是為了保持當(dāng)炸一片的時候,步數(shù)也要+1,不然雷排完了,步數(shù)對不上,就不會顯示獲勝
至此掃雷邏輯已經(jīng)全部實現(xiàn),
各位觀眾老爺們,點個贊唄!
總結(jié)
以上是生活随笔為你收集整理的扫雷游戏(实现了网页版的扫雷游戏的所有逻辑)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 部署和调优 3.4 腾讯企业邮箱免费版
- 下一篇: 正点原子STM32