C語言實(shí)現(xiàn)掃雷小游戲的示例代碼
一、掃雷
掃雷小游戲主要是利用字符數(shù)組、循環(huán)語句和函數(shù)實(shí)現(xiàn)。
設(shè)計(jì)思路:雷盤大小為9*9,但是為了后續(xù)能更好的統(tǒng)計(jì)出雷的個(gè)數(shù)在定義數(shù)組的時(shí)候定義大小為11*11,先定義兩個(gè)字符數(shù)組,一個(gè)用來記錄雷的位置,另一個(gè)用來展現(xiàn)給玩家,初始化雷盤,將兩個(gè)字符數(shù)組分別全部賦值為字符0和字符*,打印棋盤,隨機(jī)設(shè)置雷所在位置,根據(jù)玩家輸入的坐標(biāo)排查上下左右8個(gè)格子中的雷,并判斷輸入坐標(biāo)處是否有雷。
玩法:玩家選擇開始游戲之后,輸入坐標(biāo),如果坐標(biāo)處有雷,輸入坐標(biāo)處標(biāo)記為$,并打印出來游戲結(jié)束重新選擇;如果坐標(biāo)處沒有雷,統(tǒng)計(jì)出附近8個(gè)格子中雷的個(gè)數(shù)并在輸入坐標(biāo)處展現(xiàn)出來;如果輸入坐標(biāo)已經(jīng)被排查過了,則提示已排查過。
1.演示效果
為了更好的演示,將雷的個(gè)數(shù)設(shè)置為79個(gè),同時(shí)將顯示出雷的位置的雷盤也展現(xiàn)出來。
具體效果如下:

2.完整代碼
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9//展現(xiàn)出來的行
#define COL 9//展現(xiàn)出來的列
#define ROWS ROW+2//全部的行
#define COLS COL+2//全部的列
#define MINE 79//雷的個(gè)數(shù)
void Init_board(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 Print_board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (j = 0; j <= col; j++)
{
printf("%d ", j);//打印出來列號(hào)
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ",i);//打印出來行號(hào)
for (j = 1; j <= row; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void Set_mine(char mine[ROWS][COLS], int row, int col)
{
int count = MINE;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
int Get_mine(char mine[ROWS][COLS], int x, int y)
{
return (mine[x - 1][y] +
mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] +
mine[x][y + 1] +
mine[x - 1][y + 1] - 8 * '0');
}
void Find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;//走了多少步
while(win<row*col-MINE)
{
printf("請(qǐng)輸入坐標(biāo)>:");
scanf("%d%d",&x,&y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (show[x][y] == '*')
{
if (mine[x][y] == '1')
{
printf("你被炸死了,通關(guān)失??!\n");
show[x][y] = '$';//炸死時(shí)用符號(hào)$代表所輸入的坐標(biāo)
Print_board(show, row, col);
break;
}
else
{
int count = Get_mine(mine, x, y) + '0';
show[x][y] = count;
Print_board(show, row, col);
win++;
}
}
else
{
printf("輸入的坐標(biāo)已被排查過,請(qǐng)重新輸入!\n");
}
}
else
{
printf("輸入的坐標(biāo)非法,請(qǐng)重新輸入!\n");
}
}
if (win == row * col - MINE)
{
printf("恭喜你,成功通關(guān)!\n");
Print_board(show, row, col);
}
}
void game()
{
//定義兩個(gè)數(shù)組,mine用來記錄雷的位置,show展現(xiàn)給玩家
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//初始化雷盤
//全部初始化為字符0和字符*
Init_board(mine, ROWS, COLS,'0');
Init_board(show, ROWS, COLS, '*');
//打印雷盤
//Print_board(mine, ROW, COL);
Print_board(show, ROW, COL);
//布置雷
Set_mine(mine, ROW, COL);
Print_board(mine, ROW, COL);
//排雷
Find_mine(mine, show, ROW, COL);
}
void menu()
{
printf("************************\n");
printf("**** 1.開始游戲 ****\n");
printf("**** 0.結(jié)束游戲 ****\n");
printf("************************\n");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do {
menu();
printf("請(qǐng)選擇>:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戲結(jié)束!\n");
break;
default:
printf("選擇錯(cuò)誤,請(qǐng)重新選擇!\n");
break;
}
} while (input);
}
二、代碼解析
1.初始化雷盤
//初始化雷盤
void Init_board(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;
}
}
}
char set是用來接收傳過來的字符。
2.打印雷盤
//打印雷盤
void Print_board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (j = 0; j <= col; j++)
{
printf("%d ", j);//打印出來列號(hào)
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);//打印出來行號(hào)
for (j = 1; j <= row; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
打印雷盤時(shí)將其所在的序列號(hào)也打印了出來。
3.布置雷
void Set_mine(char mine[ROWS][COLS], int row, int col)
{
int count = MINE;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
通過用rand函數(shù)和srand函數(shù)生成隨機(jī)坐標(biāo)布置雷的位置,一共布置count個(gè)雷。
4.排雷
int Get_mine(char mine[ROWS][COLS], int x, int y)
{
return (mine[x - 1][y] +
mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] +
mine[x][y + 1] +
mine[x - 1][y + 1] - 8 * '0');
}
void Find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;//走了多少步
while (win < row * col - MINE)
{
printf("請(qǐng)輸入坐標(biāo)>:");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (show[x][y] == '*')
{
if (mine[x][y] == '1')
{
printf("你被炸死了,通關(guān)失??!\n");
show[x][y] = '$';//炸死時(shí)用符號(hào)$代表所輸入的坐標(biāo)
Print_board(show, row, col);
break;
}
else
{
int count = Get_mine(mine, x, y) + '0';
show[x][y] = count;
Print_board(show, row, col);
win++;
}
}
else
{
printf("輸入的坐標(biāo)已被排查過,請(qǐng)重新輸入!\n");
}
}
else
{
printf("輸入的坐標(biāo)非法,請(qǐng)重新輸入!\n");
}
}
if (win == row * col - MINE)
{
printf("恭喜你,成功通關(guān)!\n");
Print_board(show, row, col);
}
}
Get_mine函數(shù)用來計(jì)算輸入坐標(biāo)附近的雷的個(gè)數(shù),通過附近字符1相加之后減去8個(gè)字符0計(jì)算出來,減去字符0是因?yàn)樽址?和字符0的ASCII碼值相差1,利用這個(gè)規(guī)則將字符轉(zhuǎn)化為數(shù)字。Find_mine函數(shù)通過輸入的坐標(biāo),判斷坐標(biāo)處是否為雷或展現(xiàn)出附近雷的個(gè)數(shù)亦或者結(jié)束游戲。
5.游戲函數(shù)主體
void game()
{
//定義兩個(gè)數(shù)組,mine用來記錄雷的位置,show展現(xiàn)給玩家
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//初始化雷盤
//全部初始化為字符0和字符*
Init_board(mine, ROWS, COLS, '0');
Init_board(show, ROWS, COLS, '*');
//打印雷盤
//Print_board(mine, ROW, COL);
Print_board(show, ROW, COL);
//布置雷
Set_mine(mine, ROW, COL);
Print_board(mine, ROW, COL);
//排雷
Find_mine(mine, show, ROW, COL);
}
6.菜單函數(shù)
void menu()
{
printf("************************\n");
printf("**** 1.開始游戲 ****\n");
printf("**** 0.結(jié)束游戲 ****\n");
printf("************************\n");
}
7.頭文件、宏定義及主函數(shù)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9//展現(xiàn)出來的行
#define COL 9//展現(xiàn)出來的列
#define ROWS ROW+2//全部的行
#define COLS COL+2//全部的列
#define MINE 79//雷的個(gè)數(shù)
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do {
menu();
printf("請(qǐng)選擇>:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戲結(jié)束!\n");
break;
default:
printf("選擇錯(cuò)誤,請(qǐng)重新選擇!\n");
break;
}
} while (input);
}
以上就是C語言實(shí)現(xiàn)掃雷小游戲的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C語言掃雷游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++ Boost Random隨機(jī)函數(shù)詳解
Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱2022-11-11
C++深入學(xué)習(xí)之徹底理清重載函數(shù)匹配
C++ 不允許變量重名,但是允許多個(gè)函數(shù)取相同的名字,只要參數(shù)表不同即可,這叫作函數(shù)的重載,下面這篇文章主要給大家介紹了關(guān)于C++深入學(xué)習(xí)之徹底理清重載函數(shù)匹配的相關(guān)資料,需要的朋友可以參考下2019-01-01
探討編寫int strlen(char *strDest);不允許定義變量的問題
本篇文章是對(duì)編寫int strlen(char *strDest);不允許定義變量的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C語言實(shí)現(xiàn)航空訂票系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)航空訂票系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

