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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

扫雷-空白展开算法(优化)-详解

發(fā)布時間:2024/1/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 扫雷-空白展开算法(优化)-详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

掃雷是電腦上很經(jīng)典的游戲,雖然我沒玩過。為了寫這個博客,我特意去網(wǎng)上玩了一會。
幾次調(diào)試之后,我覺得這個比三子棋要復(fù)雜一些,尤其是空白展開算法上和堵截玩家有的一拼。這個與實際游戲差別較大,不能使用光標(biāo)。
接下來。我會很詳細(xì)的講解每一步分析。

掃雷

  • 寫代碼前,掃雷需要什么
    • 進(jìn)行主函數(shù)文件的代碼
      • game文件以及函數(shù)步驟
    • 在主函數(shù)文件中使用game函數(shù)
      • 布值棋盤(雷盤和玩家棋盤)
      • 打印棋盤函數(shù)
      • 玩家排雷
      • 計算雷數(shù)的函數(shù)
      • 空白遞歸算法

寫代碼前,掃雷需要什么

1,游戲需要初始選擇菜單
2,需要布置兩個棋盤,一個布置雷,一個展示給玩家看
3,打印棋盤
4,玩家要輸入選擇的坐標(biāo),并且可以多次輸入游戲坐標(biāo)
5,每次輸入后打印棋盤,同時判斷是否繼續(xù)還是輸贏。
6,玩家每次輸入坐標(biāo),都進(jìn)行一次遞歸展開。

進(jìn)行主函數(shù)文件的代碼

void option(int input) {switch (input)//分支語句{case 1:game();//掃雷開始break;case 0:printf("Logon out the game\n");break;default:printf("Input error,please input again\n");break;} } void menu(void) {printf("Welcome to game\n");printf("\n");printf("****************\n");printf("*----1.play----*\n");printf("*----0.exit----*\n");printf("****************\n"); } int main(void) {int input;srand((unsigned int)time(NULL));do{menu();//打印游戲菜單printf("please input option(1/0):>");scanf("%d", &input);option(input);//選項判斷} while (input);}

game文件以及函數(shù)步驟

#include <time.h> #define ROW 9 #define COL 9 #define _CRT_SECURE_NO_WARNINGS #define ROWS ROW+2 #define COLS COL+2 #define LEVEL 10 #include <stdio.h> #include <stdio.h> void game(void);//掃雷游戲 void setboard(char board[ROWS][COLS], int rows, int cols,char ret);//初始布置棋盤內(nèi)容 void showboard(char board[ROWS][COLS], int rows, int cols);//負(fù)責(zé)打印棋盤 //void player(char board[ROWS][COLS]);//玩家輸入 void setmine(char mine[ROWS][COLS], int row, int col);//布置地雷 int cleanmine(char board[ROWS][COLS], char mine[ROWS][COLS], int row, int col); void space(char board[ROWS][COLS], char mine[ROWS][COLS], int x,int y);//空白遞歸算法 int test(char mine[ROWS][COLS], int x, int y);//計算周圍雷數(shù)

在主函數(shù)文件中使用game函數(shù)

void game() {char board[ROWS][COLS];char mine[ROWS][COLS];setboard(mine, ROWS, COLS,'0');//創(chuàng)建初始棋盤setmine(mine, ROW, COL);//布雷要在一次游戲開始時就布好雷,只布一次雷setboard(board, ROWS, COLS, '*');//給玩家看的棋盤while (1){int ret;showboard(mine, ROW, COL);//打印布雷圖showboard(board, ROW, COL);//打印玩家棋盤//player(board);ret=cleanmine(board,mine,ROW,COL);//掃雷//showboard(board, ROW, COL);int count = 0;//可以用一個函數(shù)進(jìn)行封裝for (int i = 1; i <= ROW; i++){for (int j = 1; j <= COL; j++){if (board[i][j] == '*')count++;}}if (count == LEVEL){printf("you win\n");break;}if (ret == 0)break;system("cls");}}

布值棋盤(雷盤和玩家棋盤)

void setboard(char board[ROWS][COLS], int rows, int cols,char ret) {int i;//主要靠ret決定是布雷還是布置玩家棋盤for (i = 0; i < rows; i++){int j;for (j = 0; j < cols; j++){board[i][j] = ret;}}}

打印棋盤函數(shù)

每次將棋盤重新定義后就可以打印,但是我們設(shè)置的棋盤要比打印的大兩行,為了保證之后計算雷數(shù)的循環(huán)成立。

void showboard(char board[ROWS][COLS], int rows, int cols) {for (int a = 0; a <= cols; a++)printf("%d ",a);printf("\n");int i;int a = 1;for (i = 1; i <= rows; i++){printf("%d ", a++);int j;for (j = 1; j <= cols; j++){printf("%c|", board[i][j]);}printf("\n");} }

玩家排雷

int cleanmine(char board[ROWS][COLS],char mine[ROWS][COLS],int row,int col) {int x, y;while (1){printf("please input the coordinate:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '0'){board[x][y] = test(mine, x, y) + '0';//空白遞歸算法space(board, mine, x, y);//showboard(board, ROW, COL);break;}else if (mine[x][y] == '1'){printf("You died\n");return 0;break;}}elseprintf("Coordinate is illegal,please input again\n");}printf("player\n");//showboard(board, ROW, COL);return 1; }

計算雷數(shù)的函數(shù)

int test(char mine[ROWS][COLS], int x, int y) {int count = 0;for (int i = x - 1; i <= x + 1; i++){for (int j = y - 1; j <= y + 1; j++){if (mine[i][j] == '1')count++;}}return count;//count就代表返回的雷數(shù) }

空白遞歸算法

void space(char board[ROWS][COLS], char mine[ROWS][COLS], int x, int y) {int i;if(test(mine, x, y)==0){board[x][y] = ' ';for (i = x-1; i <=x+1; i++){int j;for (j = y-1; j <=y+1; j++){if (i > 0 && i <= ROW && j > 0 && j <= COL && mine[i][j] != '1'&&board[i][j]=='*'){space(board, mine, i, j);}}} }elseboard[x][y] = '0' + test(mine, x, y);}

要使用test函數(shù)去測試某個元素周圍8個元素是不是雷,如果不是,就進(jìn)入函數(shù)進(jìn)行遞歸,里面用來循環(huán)來表示各個方向的元素

如果檢測出來test不為0,就代表周圍有雷,就else玩家棋盤定義為周圍雷數(shù),同時返回上一級函數(shù)。每一次遞歸都有兩個for循環(huán)來遞歸檢查各個方向上的元素。
就這些,如有問題,煩請大佬指點一二

總結(jié)

以上是生活随笔為你收集整理的扫雷-空白展开算法(优化)-详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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