🚀Get to know🚀
🛸大家好,我是适才,希望你看完文章后能对你有所帮助。🛸
🌍文章有不足的地方还望指正❗❗❗🔍适才的个人主页🔍随时欢迎您的到来。⛳
>🎁欢迎各位➡👍点赞➡💌留言➕关注💖
📚学习是终身的事业📚
前言
关于扫雷这篇文章,包含了关于数组、循环语句等方面的知识。它可以很好地锻炼我们的思维能力。本篇文章会从由浅到深的阶段来详解。
游戏介绍
扫雷游戏是1992年发布一款大众休闲益智的小游戏。游戏在一个方形区域内布置了若干个地雷,玩家需要根据数字提示来猜出每个格子周围的地雷数量,正确标记出所有地雷的位置才能胜利。如果玩家猜错了地雷的位置,就会触发一个爆炸,导致游戏失败。
模块化编程
⭐模块化编程⭐
1. 什么是模块化
模块化编程就是把我们的一整个项目,分成多个模块。一个程序项目包含多个源文件(.c 文件和 .h 文件),每个 .c 文件可以被称为一个模块,每一个模块都有其各自的功能,而每一个.h文件则是声明模块
2. 模块化的好处
会使整个项目分工明确,条理清晰,易于阅读,便于移植等优点。
扫雷游戏
在这之前,需创建三个文件(可以自定义)
1. test.c
2. game.c
3. game.h
Ⅰ游戏的思路
🔸创建游戏菜单函数
🔸创建游戏实现函数
🔸游戏实现函数内部创建两个二维数组
🔸创建函数给两个数组初始字符
🔸创建函数打印9x9的方形棋盘
🔸创建函数实现布置雷的功能
🔸创建函数进行排雷
🔸创建函数使用递归展开
Ⅱ 游戏的实现
前面已经知道了游戏的整体思路,接下来就跟着思路一步一步地实现扫雷游戏吧!
1. 游戏菜单
菜单就是让用户来选择游戏状态的菜单。
//菜单
void meun()
{
printf("=============扫雷游戏==========\n");
printf("******* 0.退出游戏 *******\n");
printf("******* 1.开始游戏 *******\n");
printf("=============扫雷游戏==========\n");
}
2. 游戏实现函数
游戏实现函数的内部会包含多个函数。
游戏实现函数内部创建两个二维数组
二维数组的行和列,需要game.h中进行宏定义
#define ROWS ROW+2
#define COLS COL+2
#define ROW 9
#define COL 9
🔴给数组的行和列宏定义是11的原因🔴
考虑到用户会输入(9,9)的坐标,若此时数组是9x9的大小,而需要对该坐标周围的坐标进行统计,这时会造成溢出。所以给数组11x11的大小就不会溢出。
void game()
{
char show[ROWS][COLS] = { 0 };
char mine[ROWS][COLS] = { 0 };
}
3.给数组的初始化字符
自定义两个字符,分别给数组初始化
1. show——‘ * ’
2. mine——‘ 0 ’
函数实现之前需在头文件game.h中进行声明
//初始化字符数组
void Init_broad(char broad[ROWS][COLS], int rows, int cols, char set);
初始化字符数组的定义在test.c
//初始化数组
Init_broad(mine,ROWS,COLS, '0');
Init_broad(show,ROWS,COLS, '*');
初始化字符在game.c中进行实现
//初始化数组
void Init_broad(char broad[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++)
{
broad[i][j] = set;
}
}
}
4. 打印棋盘
打印棋盘只需要打印show数组的就行
打印函数实现代码
/打印函数
void Pintf_broad(char broad[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
//打印行号
printf("======扫雷游戏======\n");
for (i = 0; i <= row; i++)
{
printf("%d ",i);
}
printf("\n");
for (i = 1; i <=row; i++)
{
printf("%d ", i);
for (j = 1; j <=col; j++)
{
printf("%c ", broad[i][j]);
}
printf("\n");
}
printf("======扫雷游戏======\n");
printf("\n");
}
效果图如下
5.布置雷
本篇文章所实现扫雷的游戏的等级为基础,所以只需要布置10个雷就行。
宏定义雷的个数
//雷的个数
#define RAY 10
布置雷需要用到rand函数,还不知道怎么使用rand函数的老铁,可以看我的这篇文章🔍三子棋小游戏🔍,该文章也详细的讲到三子棋游戏的实现。
布置雷函数的实现
/布置雷
void Set_show(char mine[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int i =RAY;
while (i)
{
x = rand() % row+1;
y = rand() % col+1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
i--;
}
}
}
效果图
6.排雷
🔻排雷需要用户输入坐标🔻
1. 要判断坐标的合法性
2. 要判断坐标是否已经排查
3. 要判断是是不是雷(是雷炸死,则继续)
排雷函数的实现
//排雷
void Mine_clearance(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-RAY)
{
printf("开始排雷,请输入你的坐标:>");
printf("\n");
scanf("%d%d", &x, &y);
if (show[x][y] != '*')
{
printf("该坐标已排查,请重新输入\n");
continue;
}
if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
{
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
Pintf_broad(mine, ROW, COL);
break;
}
else
{
//展开雷
Deve_mine( mine,show ,x, y);
Pintf_broad(show, ROW, COL);
win++;
}
}
else
{
printf("坐标非法,请重新输入\n");
}
if (win == (row * col - RAY))
{
printf("恭喜你,排雷成功\n");
Pintf_broad(mine, ROW, COL);
}
}
}
7. 展开函数
该函数是用到递归的功能,输入坐标周围没用会展开一片空间。
展开函数是实现之前,需要完成一个函数就是可以统计该坐标周围雷的个数返回来。
//返回坐标函数
int Return_Coor(char mine[ROWS][COLS],int x,int y)
{
return mine[x][y + 1] + mine[x][y - 1] +
mine[x - 1][y] + mine[x + 1][y]+
mine[x + 1][y + 1] + mine[x - 1][y - 1] +
mine[x + 1][y - 1] + mine[x - 1][y + 1] - 8 * '0';
}
接下来,就可以完成展开函数了
//展开雷
void Deve_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
if ((x >= 1 && x <= ROW) && (y >= 1 && y <= COL))
{
int ret = Return_Coor(mine, x,y);
if (ret != 0)
{
show[x][y] = ret + '0';//因为返回值是一个整数,而我们需要的是字符
}
else if (show[x][y] != ' ')
{
show[x][y] = ' ';
int i = 0;
int j = 0;
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
Deve_mine( mine, show, i, j);
}
}
}
else
{
return;
}
}
}
总体效果图
总结
本文章到这里就结束了,不知道你学会了没有。扫雷这个游戏非常适合新手锻炼,会提高我们的思维能力,以及对代码的理解,对语法更加深刻。