2.解題思路掃雷是一款經(jīng)典的小游戲,讓我們用C語言來實(shí)現(xiàn)一遍吧!
如下圖所示,當(dāng)我們點(diǎn)擊一個(gè)方塊時(shí),如果該方塊下方不是雷,那么它就會顯示該方塊四周有幾個(gè)雷
如果是雷的話,游戲結(jié)束
直到玩家找出所有不是雷的方塊,游戲勝利
3.2設(shè)置游戲界面為了養(yǎng)成良好的編程習(xí)慣,方便代碼的管理,創(chuàng)建三個(gè)文件
掃雷的實(shí)現(xiàn)需要多個(gè)模塊的功能相互串聯(lián),多個(gè)文件可以分別處理各自模塊的功能,能更好處理各個(gè)模塊之間的邏輯并且便于后期調(diào)試,也使得代碼的可讀性提高
void menu()
{printf("************************************\n");
printf("*****1.Play 0.exit ******\n");
printf("************************************\n");
}
int main()
{srand((unsigned int)time(NULL));
int input = 0;
do
{menu();
printf("請選擇:");
scanf("%d", &input);
switch (input)
{case 1:game();
break;
case 0:printf("退出\n");
break;
default:
printf("選擇錯誤,請重新選擇:\n");
break;
}
} while (input);
return 0;
}
在game()函數(shù)中,調(diào)用各個(gè)功能
void game()
{char mine[ROWS][COLS] = {'0'};//存放布置好的雷的信息
char show[ROWS][COLS] = {'*'};//存放排查的雷的信息
//初始化
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//打印
DisPlayBoard(show, ROW, COL);
//DisPlayBoard(mine, ROW, COL);
//布雷
setMine(mine, ROW, COL);
//DisPlayBoard(mine, ROW, COL);
//排查雷
FindMine(mine,show,ROW,COL);
}
3.3雷盤的初始化在此,設(shè)置兩個(gè)雷盤
mine雷盤:只存放雷的信息在未埋雷之前,雷盤中所有位置均為‘0’
show雷盤:存放排查的雷的信息在未排查之前,雷盤中所有位置均為‘*’
//board:傳過來的雷盤
//set:雷盤中放的元素
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;
int j = 0;
for (i = 0; i< rows; i++)
{for (j = 0; j< cols; j++)
{ board[i][j] = set;
}
}
}
3.4打印雷盤為了玩家方便選擇位置,在雷盤中也要標(biāo)記出行、列號
void DisPlayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;
int j = 0;
printf("----------掃雷------------\n");
//打印行號
for (i = 0; i<=col; i++)
{printf("%d ", i);
}
printf("\n");
for (i = 1; i<= row; i++)
{//打印列號
printf("%d ", i);
//打印內(nèi)容
for (j = 1; j<= col; j++)
{ printf("%c ", board[i][j]);
}
printf("\n");
}
printf("-------------------------\n");
}
3.5布雷雷的布置是隨機(jī)的,因此采用rand()函數(shù)產(chǎn)生1-9的隨機(jī)數(shù),來實(shí)現(xiàn)隨機(jī)坐標(biāo)布雷
雷的布置均在wine雷盤中
void setMine(char mine[ROWS][COLS], int row, int col)
{int count = easy_count;//布置10個(gè)雷
while (count)
{int x = rand() % row + 1;
int y = rand() % col + 1;
//判斷該位置是否有雷
if (mine[x][y] == '0')
{ mine[x][y] = '1';
count--;
}
//若該位置已有雷,則重新生成隨機(jī)坐標(biāo)
3.6排查雷雷的排查首先檢查該位置是不是雷
如果是雷:被炸死,游戲結(jié)束
如果不是雷:顯示該坐標(biāo)周圍雷的個(gè)數(shù)
//統(tǒng)計(jì)周圍雷的個(gè)數(shù)
static int get_mine_count(char mine[ROWS][COLS], int x, int y)
{return
mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +
mine[x][y - 1] + mine[x][y + 1] +
mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]
- 8 * '0';
}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{//1.輸入排查的坐標(biāo),檢查坐標(biāo)
//2.判斷是不是雷
//是,很遺憾你被炸了,游戲結(jié)束,打印一下所有雷的位置
//不是,統(tǒng)計(jì)該坐標(biāo)周圍有幾個(gè)雷,然后將雷的數(shù)量顯示在該坐標(biāo)上
int x = 0;
int y = 0;
int win = 0;
//判斷排完的位置的個(gè)數(shù) 與雷盤中安全位置的關(guān)系
while (winprintf("請輸入你要排查的坐標(biāo):");
scanf("%d%d", &x, &y);
//判斷坐標(biāo)合法性
if ((x >= 1 && x<= row) && (y >= 1 && y<= col))
{ if (mine[x][y] == '1')
{ printf("很遺憾,你被炸死了\n");
//讓你死的明白,打印一下雷區(qū)
DisPlayBoard(mine, row, col);
break;
}
else
{ //不是雷,統(tǒng)計(jì)周圍幾個(gè)雷
int count = get_mine_count(mine, x, y);
//由于數(shù)組中放的是字符,所以要加上‘0’
show[x][y] = count + '0';
DisPlayBoard(show, row, col);
win++;
}
}
else
{ printf("坐標(biāo)不合法,請重新輸入!\n");
}
}
//安全位置全部找到
if (win == row*col - easy_count)
{printf("恭喜你,排雷成功!\n");
printf("雷區(qū)分布如下:\n");
DisPlayBoard(mine, row, col);
}
}
4.完整代碼
4.1game.h文件#include//顯示雷盤的大小
#define ROW 9
#define COL 9
//實(shí)際雷盤的大小
#define ROWS ROW+2
#define COLS COL+2
//雷的數(shù)量
#define easy_count 79
//初始化雷盤
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//打印雷盤
void DisPlayBoard(char board[ROWS][COLS], int row, int col);
//布雷
void setMine(char board[ROWS][COLS], int row, int col);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
4.2game.c文件#include"game.h"
//初始化雷盤
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;
int j = 0;
for (i = 0; i< rows; i++)
{for (j = 0; j< cols; j++)
{ board[i][j] = set;
}
}
}
//打印雷盤
void DisPlayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;
int j = 0;
printf("----------掃雷------------\n");
//打印行號
for (i = 0; i<=col; i++)
{printf("%d ", i);
}
printf("\n");
for (i = 1; i<= row; i++)
{//打印列號
printf("%d ", i);
//打印內(nèi)容
for (j = 1; j<= col; j++)
{ printf("%c ", board[i][j]);
}
printf("\n");
}
printf("-------------------------\n");
}
void setMine(char mine[ROWS][COLS], int row, int col)
{int count = easy_count;//布置10個(gè)雷
while (count)
{int x = rand() % row + 1;
int y = rand() % col + 1;
//判斷該位置是否有雷
if (mine[x][y] == '0')
{ mine[x][y] = '1';
count--;
}
//若該位置已有雷,則重新生成隨機(jī)坐標(biāo)
}
}
//統(tǒng)計(jì)周圍雷的個(gè)數(shù)
static int get_mine_count(char mine[ROWS][COLS], int x, int y)
{return
mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +
mine[x][y - 1] + mine[x][y + 1] +
mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]
- 8 * '0';
}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{//1.輸入排查的坐標(biāo),檢查坐標(biāo)
//2.判斷是不是雷
//是,很遺憾你被炸了,游戲結(jié)束,打印一下所有雷的位置
//不是,統(tǒng)計(jì)該坐標(biāo)周圍有幾個(gè)雷,然后將雷的數(shù)量顯示在該坐標(biāo)上
int x = 0;
int y = 0;
int win = 0;
//判斷排完的位置的個(gè)數(shù) 與雷盤中安全位置的關(guān)系
while (winprintf("請輸入你要排查的坐標(biāo):");
scanf("%d%d", &x, &y);
//判斷坐標(biāo)合法性
if ((x >= 1 && x<= row) && (y >= 1 && y<= col))
{ if (mine[x][y] == '1')
{ printf("很遺憾,你被炸死了\n");
//讓你死的明白,打印一下雷區(qū)
DisPlayBoard(mine, row, col);
break;
}
else
{ //不是雷,統(tǒng)計(jì)周圍幾個(gè)雷
int count = get_mine_count(mine, x, y);
//由于數(shù)組中放的是字符,所以要加上‘0’
show[x][y] = count + '0';
DisPlayBoard(show, row, col);
win++;
}
}
else
{ printf("坐標(biāo)不合法,請重新輸入!\n");
}
}
//安全位置全部找到
if (win == row*col - easy_count)
{printf("恭喜你,排雷成功!\n");
printf("雷區(qū)分布如下:\n");
DisPlayBoard(mine, row, col);
}
}
4.3test.c文件#include"game.h"
#include#includevoid menu()
{printf("************************************\n");
printf("*****1.Play 0.exit ******\n");
printf("************************************\n");
}
void game()
{char mine[ROWS][COLS] = {'0'};//存放布置好的雷的信息
char show[ROWS][COLS] = {'*'};//存放排查的雷的信息
//初始化
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//打印
DisPlayBoard(show, ROW, COL);
//DisPlayBoard(mine, ROW, COL);
//布雷
setMine(mine, ROW, COL);
//DisPlayBoard(mine, ROW, COL);
//排查雷
FindMine(mine,show,ROW,COL);
}
int main()
{srand((unsigned int)time(NULL));
int input = 0;
do
{menu();
printf("請選擇:");
scanf("%d", &input);
switch (input)
{case 1:game();
break;
case 0:printf("退出\n");
break;
default:
printf("選擇錯誤,請重新選擇:\n");
break;
}
} while (input);
return 0;
}
歡迎大家批評指正
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站欄目:掃雷小游戲(C語言版)-創(chuàng)新互聯(lián)
URL地址:http://www.rwnh.cn/article16/eppdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、企業(yè)建站、網(wǎng)站收錄、域名注冊、全網(wǎng)營銷推廣、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容