C語言實作簡化版掃雷
如果代碼有問題,希望大家能指出來!
先簡單說一下掃雷的游戲規則吧!
《掃雷》是一款大眾類的益智小游戲,游戲規則是在最短的時間內,根據點擊格子出現的數字找出所有非雷格子,同時避免踩雷,踩到一個雷即全盤皆輸,但許多玩過掃雷的人卻仍然有一些規則不明白,
聽說點贊評論的人以后工資能過萬,

比如在掃雷的時候棋盤上出現的數字是什么意思?很多人可能現在都搞不懂,所以一直在用運氣掃雷

比如這里的數字2,就是說明它周圍與它相鄰的8個位置有2個雷,同樣如果是數字8那它周圍全是雷,
然后就來看一下C語言實作簡化版掃雷的步驟吧!
1.首先需要一個游戲選單讓玩家選擇
2.需要生成掃雷的棋盤,字符‘0’非雷,字符‘1’則是雷
3.再到棋盤上布置雷
4.然后就是掃雷
首先理清游戲思路,一進入游戲肯定是列印游戲選單然后讓用戶選擇,當然游戲不可能只玩一把,所以用do,while回圈可以讓游戲一直玩,
void menu()
{
printf("***************************\n");
printf("******** 1.玩游戲 *******\n");
printf("******** 0.退出 *******\n");
printf("***************************\n");
int main()
{
int inpute = 0;
srand((unsigned int)time(NULL));
do
{
menu();//游戲選單
printf("請選擇(1/0)>");
scanf("%d", &inpute);
switch (inpute)
{
case 1://玩游戲
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("選擇錯誤,重新選擇\n");
break;
}
} while (inpute);
return 0;
}
當用戶選擇1開始玩游戲,注意這里的do,while回圈的條件是用戶選擇的時輸入的數字,也就是說只有當用戶選擇0的時候游戲才會退出,不然就是一直玩,哈哈!
然后就到了生成棋盤,這里我們需要生成兩個棋盤,一個是用來存放布置好的雷的資訊,另一個用來存放排查出雷的資訊
這里#define定義了棋盤的行和列方便修改
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define THUNDER 10//雷的個數
這里的ROW行和COL列可以理解,為什么還要定一個+2的行和列呢?
因為我們排雷的時候如果排的是邊界上的位置,要統計雷的個數是不好統計的所以要多出兩行兩列方便統計雷的個數,當然最邊界的兩行兩列不會布置雷用戶也看不到

我們在定義的game函式里生成兩個二維陣列棋盤,再初始化它,定義一個InitBoard函式初始化棋盤,分別把兩個二維陣列棋盤傳過去,生成兩個棋盤,這里字符‘0’代表非雷字符,當然最后只有*號是看得見得,生成棋盤我們把兩個陣列的行列和要放得字符分別傳過去,用回圈初始化兩個棋盤,
void InitBoard(char mine[ROWS][COLS], int rows, int cols, char ret)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
mine[i][j] = ret;
}
}
}
void game()
{
//創建對應的二維陣列
char mine[ROWS][COLS];//存放布置好雷的資訊
char check[ROWS][COLS];//存放排查出雷的資訊
//初始化棋盤
InitBoard(mine, ROWS, COLS, '0');
InitBoard(check, ROWS, COLS, '*');
//列印棋盤
//DisplayBoard(mine, ROW, COL);測驗查看布置好的雷的
DisplayBoard(check, ROW, COL);
}
初始化棋盤后可以先用定義的DisplayBoard函式列印出棋盤看看效果,這些屏蔽的代碼是測驗用的,也就是看看棋盤的效果,注意列印棋盤傳的是ROW和COL也就是9x9,和初始化不一樣,因為9x9才是給用戶看的,11x11是我們用來實作掃雷統計個數的
void DisplayBoard(char mine[ROWS][COLS], int row, int col)
{
printf("------掃雷游戲------\n");
int i = 0;
int j = 0;
for (i = 0; i <=col; i++)//列印行號
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);//列印列號
for (j = 1; j <= col; j++)
{
printf("%c ", mine[i][j]);
}
printf("\n");
}
printf("--------------------\n");
}
這里的列印行號就是方便用戶找到行和列不然,鬼知道是幾行幾列,費眼,

棋盤生成好了,就到了布置雷了,
void SetMine(char mine[ROWS][COLS], int row, int col, int lei)
{
while (lei)
{
//1-9的亂數
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';//坐標沒有雷的話就布置一顆雷
lei--;//每布置成功一顆雷就就減一
}
}
void game()
{
//創建對應的二維陣列
char mine[ROWS][COLS];//存放布置好雷的資訊
char check[ROWS][COLS];//存放排查出雷的資訊
//初始化棋盤
InitBoard(mine, ROWS, COLS, '0');
InitBoard(check, ROWS, COLS, '*');
//列印棋盤
//DisplayBoard(mine, ROW, COL);測驗查看布置好的雷的
DisplayBoard(check, ROW, COL);
SetMine(mine,ROW,COL,THUNDER);//布置雷
//DisplayBoard(mine, ROW, COL);便于查看自己布置的雷
FineMine(mine, check, ROW, COL);//排查雷
}
雷是隨機布置的,布置雷的函式傳過去的我們已經用#define定義的雷的個數
#define THUNDER 10//雷的個數
這里可能不知道rand函式是什么意思,它和main函式的這條代碼是一起用的.因為亂數一個工程只需要生成一次所以放在main函式里
srand((unsigned int)time(NULL));
是用來生成亂數的,我這條博客有詳細介紹>亂數,這里我們對行和列取余加1是生成1到9的亂數,用到while回圈,當棋盤上是字符‘0’也就是沒有布置雷的時候我們就布置一個雷,每布置成功一顆雷就減一,10顆雷布置完后回圈結束
while (lei)
{
//1-9的亂數
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';//坐標沒有雷的話就布置一顆雷
lei--;//每布置成功一顆雷就就減一
}
}
讓后就到了排雷了,排雷兩個二維陣列都會用到,布置好的雷和排查出的雷,排查出的雷是要被列印查來的
void game()
{
//創建對應的二維陣列
char mine[ROWS][COLS];//存放布置好雷的資訊
char check[ROWS][COLS];//存放排查出雷的資訊
FineMine(mine, check, ROW, COL);//排查雷
排雷也是個回圈,先定義個變數用來記錄排查的次數,棋盤一共row*col-10個位置不是雷,也就是說有71個地方不是雷,每排查一次win就加一,當win等于71時說明排雷成功
用戶輸入坐標只能1-9所以要判斷是否違規,如果輸入正確則需要判斷是不是雷,是的話游戲結束把布置好雷的資訊列印出來給用戶看,不是的話就要統計雷的個數,這里定義了一個函式來統計坐標周圍的個數
//計算mine陣列周圍8個坐標有幾個雷
int GeMinelei(char mine[ROWS][COLS],int x ,int y)
{
return mine[x-1][y-1] +
mine[x][y-1] +
mine[x+1][y-1] +
mine[x-1][y] +
mine[x+1][y] +
mine[x-1][y+1]+
mine[x][y+1] +
mine[x+1][y+1] - 8 * '0';
}
因為棋盤上放的時字符‘0’和‘1’,所以只要把它周圍的8個位置相加就知道了雷的個數,但這里時字符里而不是數字,所以在最后減去了8*‘0’,因為字符1減去字符0等于1,字符0減去字符0等于0.
‘1’-‘0’=1
‘0’-‘0’=0
計算完后再把排查出雷的資訊棋盤列印出來
void FineMine(char mine[ROWS][COLS], char check[ROWS][COLS], int row, int col)
{
int win = 0;
//9*9-10=71
while (win<row*col - THUNDER)
{
int x = 0;
int y = 0;
printf("請輸入要排查的x,y坐標>");
scanf("%d%d", &x, &y);
//判斷坐標合法性
if (x >= 1 && x <= row&&y >=1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("你被炸死了\n");
DisplayBoard(mine, row, col);
break;
}
else
{
//該坐標是不是雷不是雷,統計周圍雷的個數
int lei= GeMinelei(mine, x, y);
check[x][y] = lei + '0';//存放的是數字字符
DisplayBoard(check, row, col);
win++;
}
}
else
{
printf("違規坐標,請重新輸入!\n");
}
if (win == row*col - THUNDER)
{
printf("恭喜你,排雷成功\n");
DisplayBoard(mine, row, col);
}
}
}
完整代碼有點多,我是分3個模塊來寫的,完整代碼在我的倉庫掃雷完整代碼鏈接
記得點贊,評論哦,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255302.html
標籤:其他
