相信大家一定都玩過掃雷小游戲,今天我就帶大家來用C語言實(shí)現(xiàn)一個簡易版的掃雷小游戲。
這里我們還是需要三個文件來封裝我們的寫的代碼:
- test.c ----- 用于我們代碼的測試,以及游戲整體框架的實(shí)現(xiàn)。
- game .c ------ 用來封裝實(shí)現(xiàn)我們游戲的相關(guān)函數(shù)。
- game.h ------ 主要用來聲明游戲的相關(guān)的函數(shù)。
游戲整體框架的實(shí)現(xiàn)
整個框架和我們的三子棋非常的相似,我們玩家再玩完一局后,還可以再來一局,也可以退出游戲,所以i我們還是要使用do…while循環(huán)來實(shí)現(xiàn),當(dāng)然菜單也是不能少的,用來提醒用戶的輸入。我們還是先把整體的框架搭建起來:
#include"game.h"
void mnue()
{
printf("*****************************\n");
printf("****** 1. play ********\n");
printf("****** 0. exit ********\n");
printf("*****************************\n");
}
void game(){}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//用于設(shè)置隨機(jī)數(shù)的起點(diǎn),后面設(shè)置雷時要使用
do
{
mnue();
printf("請輸入你的選擇:>");
scanf("%d", &input);
switch (input)
{
case 1 :
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("選擇錯誤,請重新選擇?。n");
break;
}
} while (input);
return 0;
}
我們游戲的整體框架搭建好以后,現(xiàn)在就只剩下一個game函數(shù)的實(shí)現(xiàn)了,這時我們的代碼就可以跑起來了,只不過還不能玩游戲。接下來我?guī)Т蠹襾韺?shí)現(xiàn)游戲的相關(guān)邏輯。
游戲邏輯的實(shí)現(xiàn)
我們掃雷游戲假設(shè)我們用的是9*9的格子,我們需要一個棋盤存放雷的信息
字符 0 代表非雷
字符 1 代表雷
這里為什么要這樣設(shè)計,后面給大家講??!
所以我們就需要一個9×9的二維字符數(shù)組來存放雷的信息。大家都知道我們在排查一次雷以后那個位置不是雷的話,就會顯示那個位置周圍有多少雷,這時如果那個位置旁邊有1個雷的話,就會生成歧義,那個1代表的到底是雷,還是周圍雷的個數(shù),針對這種情況,我們干脆直接在來一 個9×9的二維數(shù)組,專門來存放周圍雷的個數(shù)。
我們在排查雷的時候,在排查邊界是,很容易出現(xiàn)越界的情況,所以我們直接將我們的數(shù)組擴(kuò)大一圈,但是在打印給玩家是還是中間的9×9的棋盤。
在這里我們不能直接把9寫死,應(yīng)該定義宏來表示棋盤的大小,這樣以后方便來擴(kuò)大棋盤!如下:
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
我可以定義兩個二維字符數(shù)組來表示布置雷的信息,以及排查雷的信息
char mine[ROWS][COLS]; // 雷的信息
char show[ROWS][COLS]; // 排查后的信息
初始化函數(shù)
有了兩個數(shù)組后我們需要一個函數(shù)來初始化兩個數(shù)組,但由于初始化的內(nèi)容不同,所以我們需要把初始化的內(nèi)容傳進(jìn)去,所以就多需要一個參數(shù)。
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
打印函數(shù)
初始化以后我們要能講棋盤給打印出來給我們玩家來看,當(dāng)然我們打印的是show數(shù)組,不能給玩家看雷的信息。所以就需要一個打印棋盤的函數(shù)(我們給用戶看的是9×9的):
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
printf("--------掃雷游戲----------\n");
// 給每一列加上序號,方便用戶排雷
for (int i = 0; i <= row; i++)
{
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <= row; i++)
{
printf("%d ", i); // 給每一行加上序號,方便用戶排雷
for (int j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
布雷
我們有了打印函數(shù)以后就要布置雷的信息了,所以我們還需要一個布置雷的函數(shù):
void SetMine(char mine[ROWS][COLS], int rows, int cols);
void SetMine(char board[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT; // EASY_COUNT是自己定義的一個宏,來設(shè)置游戲難度的
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] == '0') //不能在重復(fù)的位置布雷
{
board[x][y] = '1';
count--;
}
}
}
排雷
當(dāng)我們布置好雷以后就剩一個排雷的函數(shù)了,我們在排查完雷后,要將信息放如show數(shù)組中打印給玩家,所以這里需要將兩個數(shù)組都傳過來。
void FindMine(char mine[ROWS][ROWS], char show[ROWS][COLS], int rows,int cols);
void FindMine(char mine[ROWS][ROWS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win<row*col-EASY_COUNT)
{
printf("請輸入你要排查的坐標(biāo):>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("你被炸死了!\n");
break;
}
else
{
int count = GetMineCount(mine, x, y);
show[x][y] = count + '0';
//每次排完后給用戶打印棋盤
DisplayBoard(show, ROW, COL);
win++;
}
}
else
{
printf("坐標(biāo)非法,重新輸入?。n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("玩家贏!\n");
}
}
這里的win是一個計數(shù)器,如過我們用戶講非雷位置都排查過了,那win 就會 等于row * col - EASY_COUNT,這是我們就可以判斷玩家贏了,如果踩到雷了就會跳出循環(huán),結(jié)束游戲。
這里我們就需要一個GetMineCount來獲得排查位置周圍雷的個數(shù)。
獲取周圍雷的個數(shù)
我們前面設(shè)置的雷為字符 1 ,非雷為字符 0,所以我們值需要將周圍的8個坐標(biāo)相加,再減去8個0字符,就可以獲取周圍雷的個數(shù)。
int GetMineCount(char mine[ROWS][COLS],int x, int y)
{
return (mine[x + 1][y + 1] + mine[x + 1][y] + mine[x - 1][y] + mine[x][y + 1] +
mine[x + 1][y - 1] + mine[x - 1][y + 1] + mine[x - 1][y - 1] + mine[x][y - 1] -8*'0');
}
game函數(shù)的實(shí)現(xiàn)
我們有了相關(guān)游戲的函數(shù)了以后,game就很容易實(shí)現(xiàn)了。
void game()
{
char mine[ROWS][COLS]; // 雷的信息
char show[ROWS][COLS]; // 排查后的信息
InitBoard(mine, ROWS, COLS, '0');
//初始化棋盤
InitBoard(show, ROWS, COLS, '*');
//初始化棋盤
DisplayBoard(show, ROW, COL);
// 布置雷
SetMine(mine, ROW, COL);
//掃雷
FindMine(mine, show, ROW, COL);
}
這時我們整個邏輯就通了,就可以玩我們的簡易版掃雷了。文章來源:http://www.zghlxwxcb.cn/news/detail-512405.html
今天的分享就到這里了,想要完整代碼的私信我,感謝大家的關(guān)注和支持??!文章來源地址http://www.zghlxwxcb.cn/news/detail-512405.html
到了這里,關(guān)于【C】C語言實(shí)現(xiàn)掃雷小游戲的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!