C語(yǔ)言編程之掃雷小游戲空白展開算法優(yōu)化
寫代碼前,掃雷需要什么
1,游戲需要初始選擇菜單
2,需要布置兩個(gè)棋盤,一個(gè)布置雷,一個(gè)展示給玩家看
3,打印棋盤
4,玩家要輸入選擇的坐標(biāo),并且可以多次輸入游戲坐標(biāo)
5,每次輸入后打印棋盤,同時(shí)判斷是否繼續(xù)還是輸贏。
6,玩家每次輸入坐標(biāo),都進(jìn)行一次遞歸展開。
進(jìn)行主函數(shù)文件的代碼
void option(int input)
{
switch (input)//分支語(yǔ)句
{
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);//選項(xiàng)判斷
} 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);//計(jì)算周圍雷數(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);//布雷要在一次游戲開始時(shí)就布好雷,只布一次雷
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;//可以用一個(gè)函數(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ù)
每次將棋盤重新定義后就可以打印,但是我們?cè)O(shè)置的棋盤要比打印的大兩行,為了保證之后計(jì)算雷數(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;
}
計(jì)算雷數(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ù)去測(cè)試某個(gè)元素周圍8個(gè)元素是不是雷,如果不是,就進(jìn)入函數(shù)進(jìn)行遞歸,里面用來循環(huán)來表示各個(gè)方向的元素

如果檢測(cè)出來test不為0,就代表周圍有雷,就else玩家棋盤定義為周圍雷數(shù),同時(shí)返回上一級(jí)函數(shù)。每一次遞歸都有兩個(gè)for循環(huán)來遞歸檢查各個(gè)方向上的元素。
就這些,如有問題,煩請(qǐng)大佬指點(diǎn)一二
以上就是C語(yǔ)言編程之掃雷小游戲空白展開算法優(yōu)化的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言空白展開算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)的順序表功能完整實(shí)例
C語(yǔ)言實(shí)現(xiàn)單鏈表逆序與逆序輸出實(shí)例
Visual Studio 2019配置qt開發(fā)環(huán)境的搭建過程
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之隊(duì)列算法詳解
基礎(chǔ)C語(yǔ)言編程時(shí)易犯錯(cuò)誤有哪些

