C語(yǔ)言掃雷游戲?qū)崿F(xiàn)方法詳解(包含遞歸,變色,記錄時(shí)間等)
前言:
本期需要用到大量自定義函數(shù)
可以很好的練習(xí)函數(shù)
代碼內(nèi)均有注釋可查看
最終代碼放在結(jié)尾
一、掃雷游戲簡(jiǎn)介
勝利條件:
你需要在不點(diǎn)錯(cuò)雷的情況下盡可能快的將所有的雷都標(biāo)記出來(lái),
如果你點(diǎn)錯(cuò),就得重新開(kāi)始,所以掃雷也有一定的運(yùn)氣成分。
如何操作:
可翻開(kāi)這一格,也可標(biāo)記地雷
你點(diǎn)出了一個(gè)數(shù)字,
是1,就說(shuō)明它周圍的8的格子里有1個(gè)雷,
是2就有兩個(gè)雷,是3就有三個(gè)雷···以此類推。
但如果你標(biāo)記錯(cuò)了雷,那就會(huì)"boom!"一切重新開(kāi)始。

OK,知道了游戲規(guī)則,那么該如何設(shè)計(jì)游戲呢?
二、掃雷游戲的設(shè)計(jì)思路
1.創(chuàng)建游戲菜單。
2.初始化棋盤(pán)。
3.隨機(jī)布置雷。
4.打印出棋盤(pán)。
5.操作:排查雷,標(biāo)記雷,或取消標(biāo)記雷。
7.循環(huán),直到游戲結(jié)束。
8.當(dāng)然其中的細(xì)節(jié)處還有很多,帶著你一步一步實(shí)現(xiàn)。
三、代碼的逐步實(shí)現(xiàn)
1.創(chuàng)建頭文件以及源文件
在我們寫(xiě)代碼時(shí),若代碼很長(zhǎng)很復(fù)雜
可以設(shè)置多個(gè)文件來(lái)拆分代碼
我這里創(chuàng)造了三個(gè)文件:
頭文件—game.h
用來(lái)放函數(shù)的聲明和一些庫(kù)函數(shù)的頭文件
源文件–game.c
用來(lái)放函數(shù)的定義
(游戲代碼的主體)
源文件–main.c
用來(lái)放主函數(shù)
這樣條理就很清晰也不會(huì)亂

當(dāng)然,當(dāng)聲明寫(xiě)在game.h中時(shí),不要忘記在源文件調(diào)用game.h
在源文件頂部寫(xiě)上#include“game.h"就行啦
如下
#include"game.h"
2.創(chuàng)建主函數(shù)main
寫(xiě)出創(chuàng)建游戲主體
這里我用了一個(gè)do while循環(huán)來(lái)判斷是否繼續(xù)游戲
int main()
{
do
{
char x = 0;
menu();
//打印菜單
scanf("%d", &g);
switch (g)
{
case 1:
game();
//進(jìn)入游戲
break;
case 0:
printf("退出\n");
//退出游戲
break;
default:
printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
break;
}
} while (g);
return 0;
}
3.創(chuàng)建游戲菜單
這沒(méi)什么好說(shuō)的,創(chuàng)建一個(gè)菜單
當(dāng)然大家也可以設(shè)計(jì)出更好看的菜單
void menu()//打印菜單
{
printf("**********************\n");
printf("****** 掃 雷 ******\n");
printf("**********************\n");
printf("***** 1.開(kāi) 始 *****\n");
printf("***** 0.退 出 *****\n");
printf("**********************\n");
printf("請(qǐng)輸入 1 或 2 \n\n");
printf("請(qǐng)輸入:>> ");
}
4、初始化棋盤(pán)
首先,掃雷是一個(gè)9*9的矩形
那我們可以想到用二維數(shù)組來(lái)放置雷
用” * “來(lái)表示雷,用” 0 “來(lái)表示非雷
排查雷的時(shí)候就判斷周圍有幾個(gè)雷就顯示數(shù)字幾
但是有一個(gè)問(wèn)題,如果我要排查邊框的雷的時(shí)候,如下:
此時(shí)就會(huì)出現(xiàn)數(shù)組的越界訪問(wèn)的問(wèn)題
故為了防止越界,我們?cè)谠O(shè)計(jì)的時(shí)候,需給數(shù)組擴(kuò)大一圈
雷布置在中間的9 * 9的格子內(nèi),但是周圍擴(kuò)大一圈,這樣就解決了越界的問(wèn)題。
所以我們將存放數(shù)據(jù)的數(shù)組創(chuàng)建成11 * 11最合適

還有,我們需要將排查出的雷的數(shù)量信息記錄存儲(chǔ),并打印出來(lái)作為排雷的重要參考信息。但是雷的個(gè)數(shù)信息存放在哪里呢?如果存放在布置雷的數(shù)組中,這樣雷的信息和雷的個(gè)數(shù)信息就會(huì)產(chǎn)生混淆和打印上的困難。
所以,我們需要設(shè)置兩個(gè)棋盤(pán),給?個(gè)棋盤(pán)(mine)存放布置好的雷的信息,再給另外?個(gè)棋盤(pán)(show)存放排查出的雷的信息。這樣就互不干擾了,把雷布置到mine數(shù)組,在mine數(shù)組中排查雷,排查出雷的數(shù)據(jù)存放在show數(shù)組,并且打印出來(lái)。
還有一點(diǎn),這兩個(gè)數(shù)組既要存放字符" * ",又要存放數(shù)字
故我們可以設(shè)置字符數(shù)組來(lái)存放信息
OK,現(xiàn)在就可以開(kāi)始寫(xiě)代碼了
在game.h頭文件寫(xiě)到:
#define ROW 9 #define COL 9 //定義9*9小邊框 #define ROWS ROW+2 #define COLS COL+2 //定義11*11大邊框 void SetBoard(char board[ROWS][COLS], int rows, int cols, char set); //聲明SetBoard函數(shù)(初始化棋盤(pán))
在game.c源文件中寫(xiě)到:
void SetBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
在main.c源文件中寫(xiě)到:
char mine[ROWS][COLS];//放置雷 char show[ROWS][COLS];//展示信息 //定義數(shù)組大小 SetBoard(mine, ROWS, COLS, '0');//放置雷 SetBoard(show, ROWS, COLS, '*');//展示信息 //初始化數(shù)組,傳入要初始化的值
5、放置雷(隨機(jī)數(shù)的應(yīng)用)
這里需要注意,每一把游戲的雷位置是隨機(jī)的
故我們要在這里設(shè)置一個(gè)隨機(jī)數(shù)來(lái)隨機(jī)擺放雷
要使用到rand函數(shù),頭文件為<stdlib.d>
rand的具體使用方法詳見(jiàn)【C語(yǔ)言】rand函數(shù)的應(yīng)用(隨機(jī)數(shù)的生成)
還可以去c++官網(wǎng)查看:https://legacy.cplusplus.com/
因?yàn)槭窃?9 * 9 的框中放置雷
故我們將 i 和 j 設(shè)置成0到8的隨機(jī)數(shù)就可以了
還要注意,已經(jīng)放置雷的格子就不能放雷了
創(chuàng)建自定義函數(shù)SetMine來(lái)放置雷
在game.h頭文件寫(xiě)到:
#define EASY_COUNT 10 //設(shè)置雷的個(gè)數(shù)(10個(gè)) void SetMine(char mine[ROWS][COLS], int row, int col); //聲明SetMine函數(shù)(放置雷)
在game.c源文件中寫(xiě)到:
void SetMine(char mine[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
//規(guī)定放置雷的個(gè)數(shù)
srand((unsigned int)time(NULL));
//生成隨機(jī)數(shù)
while (count)
{
int i = rand() % row + 1;//生成1-9隨機(jī)數(shù)
int j = rand() % col + 1;//生成1-9隨機(jī)數(shù)
if (mine[i][j] != '*')//若此處沒(méi)雷就放置雷
{
mine[i][j] = '*';
count--;
}
}
}
在main.c源文件中寫(xiě)到:
SetMine(mine, ROW, COL); //放置雷
6、打印棋盤(pán)(設(shè)置多彩顏色)
為了使棋盤(pán)更加美觀,我們還可以增加顏色元素
如下,1,2,3,4的顏色各不相同
創(chuàng)建自定義函數(shù)DisplayBoard來(lái)打印棋盤(pán)

這里我們用到了顏色定義函數(shù):
這樣可以同時(shí)設(shè)置多種顏色
對(duì)于不同數(shù)字展現(xiàn)不同顏色
void setColor(int color)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, color);
}
void red() { setColor(12); }
void green() { setColor(10); }
void yellow() { setColor(14); }
void blue() { setColor(9); }
void purple() { setColor(13); }
void cyan() { setColor(11); }
void white() { setColor(15); }
void reset() { setColor(7); }
在game.h頭文件寫(xiě)到:
void DisplayBoard(char board[ROWS][COLS], int row, int col); //聲明DisplayBoard函數(shù)(打印棋盤(pán))
在game.c源文件中寫(xiě)到:
void setColor(int color)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, color);
}
void red() { setColor(12); }
void green() { setColor(10); }
void yellow() { setColor(14); }
void blue() { setColor(9); }
void purple() { setColor(13); }
void cyan() { setColor(11); }
void white() { setColor(15); }
void reset() { setColor(7); }
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
printf("-------掃雷--------\n");
printf(" ");
int i = 1;
for (i = 1; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
int j = 1;
for (j = 1; j <= col; j++)
{
switch (board[i][j])
{
case '0':
cyan();
break;
case '1':
blue();
break;
case '2':
yellow();
break;
case '3':
purple();
break;
case '4':
case '5':
case '6':
case '7':
case '8':
case 'F':
red();
break;
}
printf("%c ", board[i][j]);
reset();
}
printf("\n");
}
}
在main.c源文件中寫(xiě)到:
DisplayBoard(show, ROW, COL); //打印棋盤(pán)
打印顏色后的運(yùn)行結(jié)果:
這樣就有了多種顏色,使棋盤(pán)更加美觀

7、正式開(kāi)始掃雷游戲
( 1 ) 規(guī)則
首先我們要打印出我們的規(guī)則,讓玩家能更好的操作
可以排查雷,可以標(biāo)記雷,也可以取消標(biāo)記雷
如下:
printf("1·排查地雷:請(qǐng)輸入要排查的坐標(biāo)例如‘2 4',第二行第四列\(zhòng)n");
printf("2·標(biāo)記地雷:輸入要標(biāo)記雷的坐標(biāo)例如‘2+4',注意要加'+'\n");
printf("3·取消標(biāo)記:輸入要取消標(biāo)記雷的坐標(biāo)例如‘2-4',注意要加'-'\n");
printf("請(qǐng)輸入:");
( 2 ) 踩雷時(shí)
當(dāng)排雷時(shí),若踩雷了,要退出游戲,
并且打印出雷的位置,至少讓玩家知道自己是怎么死的
創(chuàng)建自定義函數(shù)DisplayBoard2來(lái)打印死亡后的棋盤(pán)
if (mine[x][y] == '*')
{
printf("\a很遺憾,\a您踩雷了,\a游戲結(jié)束\a\n");
DisplayBoard2(mine, ROW, COL);
break;
}
而且,為了更好區(qū)分出雷,雷我用了紅色顏色
void DisplayBoard2(char board[ROWS][COLS], int row, int col)
{
printf("-------掃雷--------\n");
printf(" ");
int i = 1;
for (i = 1; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
int j = 1;
for (j = 1; j <= col; j++)
{
if (board[i][j] == '*')
{
red();
}
printf("%c ", board[i][j]);
reset();
}
printf("\n");
}
}
運(yùn)行結(jié)果:

( 3 ) 沒(méi)踩雷時(shí)
若沒(méi)踩雷,就在格子上統(tǒng)計(jì)出周圍雷的個(gè)數(shù)
這里我用到了暴力統(tǒng)計(jì)
發(fā)現(xiàn)一個(gè)雷就+1
并且在棋盤(pán)上打印出信息
創(chuàng)建自定義函數(shù)GetMineCount來(lái)獲取周圍雷的個(gè)數(shù)
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
int i, j;
int count = 0;
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
if (mine[i][j] == '*')
{
count++;
}
}
}
return count;
}
int count = GetMineCount(mine, x, y); show[x][y] = count + '0';
( 4 ) 四周沒(méi)雷時(shí)(函數(shù)遞歸)
在我們排雷時(shí),若周圍9格均沒(méi)雷
就會(huì)返回0,但是此時(shí)周圍可以確定沒(méi)雷
再一一輸入排查就太浪費(fèi)時(shí)間了
而在傳統(tǒng)掃雷中,周圍沒(méi)雷就會(huì) ” 炸 “ 開(kāi)一片
如下:

為了達(dá)到這種效果,我們可以用到函數(shù)歸遞
周圍沒(méi)雷時(shí),自動(dòng)排除周圍,若周圍還是0(沒(méi)雷),就再自動(dòng)排除周圍
以此往復(fù),知道沒(méi)有可以自動(dòng)排除的區(qū)塊
創(chuàng)建自定義函數(shù)Chain來(lái)炸開(kāi)周圍格子
代碼實(shí)現(xiàn):
if (count == 0) Chain(mine, show, x, y, ROWS); //歸遞ROWS(邊長(zhǎng))次
void Chain(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y,int g)
{
int i = x - 1, j = y - 1;
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
if (show[i][j] == '*' && i >= 1 && i <= ROW && j >= 1 && j <= COL)
//1.當(dāng)show[i][j]=="*"時(shí)再進(jìn)入防止死循環(huán) 2.設(shè)置邊界防止越界訪問(wèn)
{
show[i][j] = GetMineCount(mine, i, j) + '0';
if (show[i][j] == '0' && g)//當(dāng)g==0時(shí)退出
{
g--;
Chain(mine, show, i, j, g);
//設(shè)置歸遞g次,這里設(shè)置成棋盤(pán)邊長(zhǎng)
}
}
}
}
}
最后再打印出操作完后的棋盤(pán)
(上面提到了就不贅述了)
( 5 ) 標(biāo)記和取消標(biāo)記
我這里用 x + y 表示標(biāo)記雷,用 x - y 表示取消標(biāo)記雷
標(biāo)記就把格子改成紅色F,取消就復(fù)原就行了
創(chuàng)建自定義函數(shù)Sign來(lái)標(biāo)記雷
創(chuàng)建自定義函數(shù)Unsign來(lái)取消標(biāo)記雷
else if (s == '+' && x >= 1 && x <= row && y >= 1 && y <= col) Sign(show, x, y); else if (s == '-' && x >= 1 && x <= row && y >= 1 && y <= col) Unsign(show, x, y);
void Sign(char show[ROWS][COLS], int x, int y)
{
if (show[x][y] == '*')
show[x][y] = 'F';
DisplayBoard(show, ROW, COL);
}
void Unsign(char show[ROWS][COLS], int x, int y)
{
if (show[x][y] == 'F')
show[x][y] = '*';
DisplayBoard(show, ROW, COL);
}
( 6 ) 游戲結(jié)束(所有雷已找出)
當(dāng)排查了除了雷的所有格子時(shí),游戲結(jié)束(算上自動(dòng)排查)
創(chuàng)建自定義函數(shù)Judge判斷是否掃完雷
若掃完雷時(shí),返回0,否則返回1。
flag = Judge(show, ROW, COL);
int Judge(char show[ROWS][COLS], int row, int col)
{
int i, j, count = 0;
for (i = 1; i <= row; i++)
{
for (j = 1; j <= col; j++)
{
if (show[i][j] != '*')
{
count++;//逐個(gè)計(jì)數(shù)
if (count == row * col - EASY_COUNT)
//當(dāng)所有除了雷的所有格子掃完時(shí)
return 0;
}
}
}
return 1;
}
if (flag == 0)
{
printf("恭喜你掃雷成功!!!\n");
}
8、記錄游戲時(shí)間
以上 7、正式開(kāi)始掃雷游戲的所有代碼是整個(gè)游戲過(guò)程
我們把他們合到一起(不包含自定義函數(shù))
創(chuàng)建自定義函數(shù)FindMine表示整個(gè)游戲過(guò)程
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
char s;
int x, y, flag = 1;
while (flag)
{
printf("1·排查地雷:請(qǐng)輸入要排查的坐標(biāo)例如‘2 4',第二行第四列\(zhòng)n");
printf("2·標(biāo)記地雷:輸入要標(biāo)記雷的坐標(biāo)例如‘2+4',注意要加'+'\n");
printf("3·取消標(biāo)記:輸入要取消標(biāo)記雷的坐標(biāo)例如‘2-4',注意要加'-'\n");
printf("請(qǐng)輸入:");
scanf("%d%c%d", &x, &s, &y);
printf("\n\n");
if (s == ' ' && x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '*')
{
printf("\a很遺憾,\a您踩雷了,\a游戲結(jié)束\a\n");
DisplayBoard2(mine, ROW, COL);
break;
}
else
{
int count = GetMineCount(mine, x, y);
show[x][y] = count + '0';
if (count == 0)
Chain(mine, show, x, y, ROWS);
DisplayBoard(show, ROW, COL);
flag = Judge(show, ROW, COL);
}
}
else if (s == '+' && x >= 1 && x <= row && y >= 1 && y <= col)
Sign(show, x, y);
else if (s == '-' && x >= 1 && x <= row && y >= 1 && y <= col)
Unsign(show, x, y);
else
{
printf("輸入錯(cuò)誤,坐標(biāo)范圍X(1-9) Y(1-9),請(qǐng)重新輸入\n");
}
}
if (flag == 0)
{
printf("恭喜你掃雷成功!!!\n");
}
}
若要記錄整個(gè)游戲時(shí)間,就是自定義函數(shù)FindMine這整個(gè)代碼時(shí)間
可以在主函數(shù)中寫(xiě):
clock_t start = clock();//記錄游戲時(shí)間
{
FindMine(mine, show, ROW, COL);
}
double time = (double)(clock() - start) / CLOCKS_PER_SEC;
printf("您一共用時(shí): %.2f 秒\n\n\n", time);
這樣就可以記下游戲時(shí)間了,精度為0.01秒
注意:記時(shí)代碼要包含頭文件<windows.h>
運(yùn)行結(jié)果:(雖然這里沒(méi)成功掃雷)

四、掃雷游戲完整代碼
在game.h頭文件寫(xiě)到:
(頭文件的聲明)
(以及用來(lái)放函數(shù)的聲明和一些庫(kù)函數(shù)的頭文件)
#pragma once #include <stdio.h> #include <time.h> #include <stdlib.h> #include <string.h> #include <windows.h> #define ROW 9 #define COL 9 //定義9*9小邊框 #define ROWS ROW+2 #define COLS COL+2 //定義11*11大邊框 #define EASY_COUNT 10 //設(shè)置雷的個(gè)數(shù) void SetBoard(char board[ROWS][COLS], int rows, int cols, char set); //聲明SetBoard函數(shù)(初始化棋盤(pán)) void SetMine(char mine[ROWS][COLS], int row, int col); //聲明SetMine(函數(shù)(放置雷) void DisplayBoard(char board[ROWS][COLS], int row, int col); //聲明DisplayBoard函數(shù)(打印棋盤(pán)) void DisplayBoard2(char board[ROWS][COLS], int row, int col); //聲明DisplayBoard2函數(shù)(打印失敗棋盤(pán)) void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col); //聲明函數(shù)FindMine(整個(gè)游戲過(guò)程)
在game.c源文件中寫(xiě)到:
(游戲主要代碼)
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void setColor(int color)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, color);
}
void red() { setColor(12); }
void green() { setColor(10); }
void yellow() { setColor(14); }
void blue() { setColor(9); }
void purple() { setColor(13); }
void cyan() { setColor(11); }
void white() { setColor(15); }
void reset() { setColor(7); }
void menu()//打印菜單
{
printf("**********************\n");
printf("****** 掃 雷 ******\n");
printf("**********************\n");
printf("***** 1.開(kāi) 始 *****\n");
printf("***** 0.退 出 *****\n");
printf("**********************\n");
printf("請(qǐng)輸入 1 或 2 \n\n");
printf("請(qǐng)輸入:>> ");
}
void SetBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void SetMine(char mine[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
//規(guī)定放置雷的個(gè)數(shù)
srand((unsigned int)time(NULL));
//生成隨機(jī)數(shù)
while (count)
{
int i = rand() % row + 1;//生成1-9隨機(jī)數(shù)
int j = rand() % col + 1;//生成1-9隨機(jī)數(shù)
if (mine[i][j] != '*')//若此處沒(méi)雷就放置雷
{
mine[i][j] = '*';
count--;
}
}
}
void DisplayBoard2(char board[ROWS][COLS], int row, int col)
{
printf("-------掃雷--------\n");
printf(" ");
int i = 1;
for (i = 1; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
int j = 1;
for (j = 1; j <= col; j++)
{
if (board[i][j] == '*')
{
red();
}
printf("%c ", board[i][j]);
reset();
}
printf("\n");
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
printf("-------掃雷--------\n");
printf(" ");
int i = 1;
for (i = 1; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
int j = 1;
for (j = 1; j <= col; j++)
{
switch (board[i][j])
{
case '0':
cyan();
break;
case '1':
blue();
break;
case '2':
yellow();
break;
case '3':
purple();
break;
case '4':
case '5':
case '6':
case '7':
case '8':
case 'F':
red();
break;
}
printf("%c ", board[i][j]);
reset();
}
printf("\n");
}
}
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
int i, j;
int count = 0;
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
if (mine[i][j] == '*')
{
count++;
}
}
}
return count;
}
void Chain(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y,int g)
{
int i = x - 1, j = y - 1;
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
if (show[i][j] == '*' && i >= 1 && i <= ROW && j >= 1 && j <= COL)
{
show[i][j] = GetMineCount(mine, i, j) + '0';
if (show[i][j] == '0' && g)
{
g--;
Chain(mine, show, i, j, g);
}
}
}
}
}
int Judge(char show[ROWS][COLS], int row, int col)
{
int i, j, count = 0;
for (i = 1; i <= row; i++)
{
for (j = 1; j <= col; j++)
{
if (show[i][j] != '*')
{
count++;
if (count == row * col - EASY_COUNT)
return 0;
}
}
}
return 1;
}
void Sign(char show[ROWS][COLS], int x, int y)
{
if (show[x][y] == '*')
show[x][y] = 'F';
DisplayBoard(show, ROW, COL);
}
void Unsign(char show[ROWS][COLS], int x, int y)
{
if (show[x][y] == 'F')
show[x][y] = '*';
DisplayBoard(show, ROW, COL);
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
char s;
int x, y, flag = 1;
while (flag)
{
printf("1·排查地雷:請(qǐng)輸入要排查的坐標(biāo)例如‘2 4',第二行第四列\(zhòng)n");
printf("2·標(biāo)記地雷:輸入要標(biāo)記雷的坐標(biāo)例如‘2+4',注意要加'+'\n");
printf("3·取消標(biāo)記:輸入要取消標(biāo)記雷的坐標(biāo)例如‘2-4',注意要加'-'\n");
printf("請(qǐng)輸入:");
scanf("%d%c%d", &x, &s, &y);
printf("\n\n");
if (s == ' ' && x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '*')
{
printf("\a很遺憾,\a您踩雷了,\a游戲結(jié)束\a\n");
DisplayBoard2(mine, ROW, COL);
break;
}
else
{
int count = GetMineCount(mine, x, y);
show[x][y] = count + '0';
if (count == 0)
Chain(mine, show, x, y, ROWS);
DisplayBoard(show, ROW, COL);
flag = Judge(show, ROW, COL);
}
}
else if (s == '+' && x >= 1 && x <= row && y >= 1 && y <= col)
Sign(show, x, y);
else if (s == '-' && x >= 1 && x <= row && y >= 1 && y <= col)
Unsign(show, x, y);
else
{
printf("輸入錯(cuò)誤,坐標(biāo)范圍X(1-9) Y(1-9),請(qǐng)重新輸入\n");
}
}
if (flag == 0)
{
printf("恭喜你掃雷成功!!!\n");
}
}
在main.c源文件中寫(xiě)到:
(游戲主體框架)
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
int g;
void game()
{
char mine[ROWS][COLS];
char show[ROWS][COLS];
//定義數(shù)組大小
SetBoard(mine, ROWS, COLS, '0');//放置雷
SetBoard(show, ROWS, COLS, '*');//展示信息
//初始化數(shù)組,傳入要初始化的值
SetMine(mine, ROW, COL);
//放置雷
DisplayBoard(show, ROW, COL);
//打印棋盤(pán)
/*DisplayBoard(mine, ROW, COL); */
clock_t start = clock();//記錄游戲時(shí)間
{
FindMine(mine, show, ROW, COL);
}
double time = (double)(clock() - start) / CLOCKS_PER_SEC;
printf("您一共用時(shí): %.2f 秒\n\n\n", time);
}
int main()
{
do
{
char x = 0;
menu();
//打印菜單
scanf("%d", &g);
switch (g)
{
case 1:
game();
//進(jìn)入游戲
break;
case 0:
printf("退出\n");
//退出游戲
break;
default:
printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
break;
}
} while (g);
return 0;
}
五、結(jié)語(yǔ)
OK,本期的掃雷代碼到這里就結(jié)束了
大家可自己游玩,也可改進(jìn)我的代碼
本期資料來(lái)自于:

到此這篇關(guān)于C語(yǔ)言掃雷游戲?qū)崿F(xiàn)的文章就介紹到這了,更多相關(guān)C語(yǔ)言掃雷游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 基于C語(yǔ)言實(shí)現(xiàn)的掃雷游戲代碼
- C語(yǔ)言代碼實(shí)現(xiàn)掃雷游戲
- C語(yǔ)言開(kāi)發(fā)簡(jiǎn)易版掃雷小游戲
- C語(yǔ)言快速實(shí)現(xiàn)掃雷小游戲
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲
- C語(yǔ)言實(shí)現(xiàn)掃雷小游戲(適合初學(xué)者)
- C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲
- C語(yǔ)言實(shí)現(xiàn)掃雷小游戲詳細(xì)代碼
- C語(yǔ)言實(shí)現(xiàn)掃雷小游戲
- C語(yǔ)言實(shí)現(xiàn)經(jīng)典掃雷小游戲完整代碼(遞歸展開(kāi)?+?選擇標(biāo)記)
相關(guān)文章
全面了解#pragma once與 #ifndef的區(qū)別
下面小編就為大家?guī)?lái)一篇全面了解#pragma once與 #ifndef的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
C語(yǔ)言實(shí)現(xiàn)電影管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電影管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
基于一致性hash算法 C++語(yǔ)言的實(shí)現(xiàn)詳解
在《基于一致性hash算法(consistent hashing)的使用詳解》一文中已經(jīng)介紹了一致性hash的基本原理,本文將會(huì)對(duì)其具體實(shí)現(xiàn)細(xì)節(jié)進(jìn)行描述,并用c++語(yǔ)言對(duì)一致性hash進(jìn)行了簡(jiǎn)單的實(shí)現(xiàn)2013-05-05
c++11之統(tǒng)一初始化(Uniform Initalization)實(shí)現(xiàn)
本文主要介紹了c++11之統(tǒng)一初始化(Uniform Initalization)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-02-02

