C語言編程之掃雷小游戲空白展開算法優(yōu)化
寫代碼前,掃雷需要什么
1,游戲需要初始選擇菜單
2,需要布置兩個棋盤,一個布置雷,一個展示給玩家看
3,打印棋盤
4,玩家要輸入選擇的坐標,并且可以多次輸入游戲坐標
5,每次輸入后打印棋盤,同時判斷是否繼續(xù)還是輸贏。
6,玩家每次輸入坐標,都進行一次遞歸展開。
進行主函數(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);//負責打印棋盤 //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ù)進行封裝 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ù)的循環(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; } } else printf("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); } } } } else board[x][y] = '0' + test(mine, x, y); }
要使用test函數(shù)去測試某個元素周圍8個元素是不是雷,如果不是,就進入函數(shù)進行遞歸,里面用來循環(huán)來表示各個方向的元素
如果檢測出來test不為0,就代表周圍有雷,就else玩家棋盤定義為周圍雷數(shù),同時返回上一級函數(shù)。每一次遞歸都有兩個for循環(huán)來遞歸檢查各個方向上的元素。
就這些,如有問題,煩請大佬指點一二
以上就是C語言編程之掃雷小游戲空白展開算法優(yōu)化的詳細內(nèi)容,更多關(guān)于C語言空白展開算法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Qt股票組件之自選股列表拖拽、右鍵常用菜單功能的實現(xiàn)
這篇文章主要介紹了Qt股票組件之自選股列表拖拽、右鍵常用菜單功能的實現(xiàn)方法,本文通過實例文字相結(jié)合的形式給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07C++繼承中的對象構(gòu)造與析構(gòu)和賦值重載詳解
這篇文章主要為大家詳細介紹了C++繼承中的對象構(gòu)造與析構(gòu)和賦值重載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03