C语言实现扫雷游戏(完整版)
头文件定义、函数声明
下面就是扫雷中使用到的所有函数,为了省事我把所有的代码都放在一个C文件中实现
宏定义中设置了游戏的界面布局,以及设置地雷的个数(这里默认的是10个地雷),界面是一个9*9的方格布局
如图:

代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//布局9*9方格
#define ROW 9
#define COL 9
//多出隐藏的两行两列用来补全边缘棋盘6个方格凑9个方便计算
#define ROWS ROW + 2
#define COLS COL + 2
#define MINE_COUNT 10//地雷个数
/*******************************************************************************/
//游戏实现
void play();
//初始化界面布局
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//打印布局
void DisplayBoard(char board[ROWS][COLS], int rows, int cols);
//布置地雷
void SetMine(char board[ROWS][COLS], int row, int col);
//判断成功排除后剩下的方格数是否等于地雷数
int IsWin(char show[ROWS][COLS], int row, int col);
//使用递归函数来实现周围没地雷时展开多个
void spread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);
//计算周围地雷个数
int mine_count(char mine[ROWS][COLS], int x, int y);
//扫雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//递归实现连续排除周围地雷
void spread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);
/*******************************************************************************/
函数定义
游戏规则设定
这里使用了函数递归的方式来实现周围8个方格如果都没有地雷的话就一次性展开使用空格来填补,以及通过字符的ASCII码值来计算周围八个方格中地雷的数量以数字形式显示周围地雷个数。
接下来就可以进行简单的排雷操作了,输入坐标进行排雷,直到排完所有雷则通过游戏,如果输入的方格坐标为之前布置的雷坐标那么恭喜你踩到雷了游戏结束,你可以选择继续玩或者直接退出。
如图:


代码如下:
int IsWin(char show[ROWS][COLS], int row, int col)
{
int num = 0;
//排除一个地雷时便进行累加
for (int i = 1; i <= row; i++)
{
for (int j = 1; j <= col; j++)
{
if (show[i][j] == '*')
num++;
}
}
return num;
}
void spread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
int count = mine_count(mine, x, y);//周围地雷的个数(此时是字符的ASCII码值)
if (count == 0)
{
show[x][y] = ' ';
int i = 0, j = 0;
for (i = -1; i <= 1; i++)
{
for (j = -1; j <= 1; j++)
{
//连续排除时限制范围在棋盘范围内
if ((x + i) > 0 && (y + i) > 0 && (x + i < ROWS) && (y + j < COLS) && show[x + i][y + j] == '*')
{
spread(mine, show, x + i, y + j);//递归实现周围如果都没地雷连续排除
}
}
}
}
else
{
show[x][y] = count + '0';//将字符ASCII码值转换为数字从而显示
}
}
int mine_count(char mine[ROWS][COLS], int x, int y)
{
//将周围八个方格中字符的ASCII码值之和减去八个‘0’的值得到周围地雷个数
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 FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0, y = 0;
while (1)
{
printf("请输入排雷坐标:>");
loop:
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标是否合法
{
if (mine[x][y] == '1')//‘1’为地雷
{
printf("你已踩到雷,游戏结束\n");
DisplayBoard(mine, ROW, COL);
break;
}
else
{
spread(mine, show, x, y);//计算周围地雷数量,连续排除无雷的方格
DisplayBoard(show, ROW, COL);
}
}
else
{
printf("请输入正确的坐标:");
goto loop;
}
int ret = IsWin(show, row, col);
if (ret == MINE_COUNT)//当累加的地雷数量等于布置地雷的数量则说明地雷全部排除
{
printf("恭喜你,通关成功!\n");
break;
}
}
}
/*******************************************************************************/
布置地雷
这里使用了rand()函数在该方格没有地雷的情况下随机布置相应的地雷,有地雷的方格值为1,没有地雷的方格值为0,布置完地雷后再使用打印函数将界面布局打印出来
扩展:
在C语言中,我们一般使用 <stdlib.h> 头文件中的rand()函数来生成随机数
int rand (void); //void 表示不需要传递参数。
但是多次运行上面的代码,你会发现每次产生的随机数都一样
实际上,rand() 函数产生的随机数是伪随机数,是根据一个数值按照某个公式推算出来的,这个数值我们称之为“种子”,我们可以通过 srand() 函数来重新“播种”,这样种子就会发生改变。
void srand (unsigned int seed);
它需要一个 unsigned int 类型的参数。在实际开发中,我们可以用时间作为参数,只要每次播种的时间不同,那么生成的种子就不同,最终的随机数也就不同。
使用<time.h>头文件中的 time() 函数即可得到当前的时间(精确到秒),就像下面这样:
srand((unsigned)time(NULL));
代码如下:
void SetMine(char board[ROWS][COLS], int row, int col)
{
int count = MINE_COUNT;//布置地雷数量
while (count)
{
//当该方格内没有地雷时随机布置相应数量地雷
int x = rand() % row + 1;//(行,随机数范围1~9)
int y = rand() % col + 1;//(列,随机数范围1~9)
if (board[x][y] == '0')//判断没有地雷
{
board[x][y] = '1';//布置地雷
count--;//直到布置完所有地雷
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i <= col; i++)//打印列号
{
printf(" %d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf(" %d ", i);//打印行号
for (j = 1; j <= col; j++)
{
printf(" %c ", board[i][j]);//打印9*9方格内字符布局
}
printf("\n");
}
printf("\n");
}
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0, j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;//初始化所有方格内的字符
}
}
}
/*******************************************************************************/
游戏实现函数
首先初始化游戏布局并打印出来,之后进行布置地雷以及计算周围八个方格中地雷的数量,最后开始扫雷
如图:

代码如下:
void play()
{
//随机数种子,time函数的返回值生成时间戳,保证每次随机布置的地雷位置不同
srand((unsigned int)time(NULL));
//地雷信息的存储
char mine[ROWS][COLS] = { 0 };//布置好的地雷信息11*11
char show[ROWS][COLS] = { 0 };//排查出的地雷信息11*11
InitBoard(mine, ROWS, COLS, '0');//将方格置为字符‘0’也就是无地雷状态
InitBoard(show, ROWS, COLS, '*');//将方格内字符初始化为*达到隐藏效果
DisplayBoard(show, ROW, COL);
//DisplayBoard(mine,ROW,COL);//显示地雷位置
SetMine(mine, ROW, COL);
FindMine(mine, show, ROW, COL);
}
/*******************************************************************************/
菜单函数以及主函数定义
这里是进入游戏的一个简单的选择菜单界面,通过选择(1/2)来执行相应的操作,调用该游戏实现函数以及退出游戏和错误判断
如图:

代码如下:
int main()
{
//菜单选择界面
int input = 0, choose = 0;
printf("&---------------------------&\n");
printf("| 1、扫雷 |\n");
printf("|---------------------------|\n");
printf("| 2、退出 |\n");
printf("&---------------------------&\n");
printf("请选择(1/2)>:");
do
{
scanf("%d", &input);
switch (input)
{
case 1:
while (1)
{
printf("\n");
play();
printf("&---------------------------&\n");
printf("| 1、继续 |\n");
printf("|---------------------------|\n");
printf("| 2、退出 |\n");
printf("&---------------------------&\n");
printf("请输入你的选择:");
loop:
scanf("%d", &choose);
switch (choose)
{
case 1:
break;
case 2:
return 0;
default:
printf("请输入正确的选项:");
goto loop;
}
}
case 2:
printf("退出成功!\n");
return 0;
default:
printf("请输入正确的选项:");
break;
}
} while (input);
return 0;
}
/*******************************************************************************/
总结
以上就是个人分享的关于扫雷游戏所有的代码,用C语言简单的实现了扫雷这个小游戏,虽然在界面和功能的实现上都很粗糙,但是对于一个初学C语言小白的我来讲也是一个小小的进步,也希望自己继续加油之后写出更优秀的代码
C语言实现扫雷游戏(完整版)的更多相关文章
- 爱拼图游戏android源码完整版
这个是一款爱拼图游戏源码完整版,该游戏源码比较完整的,可以支持音乐的播放在游戏的玩的过程中,还可以控制系统的声音等,可以支持多种图片的选择来进行玩的,还可以根据自己的爱好选择不同的难度来的,级别分为: ...
- 哆啦A梦连连看游戏源码完整版
这个源码是哆啦A梦连连看游戏源码完整版,也是安卓教程网android.662p.com分享过来的,哆啦A梦大家一定再熟悉不过了,这次登场的角色你能认出全部吗?赶紧把相同的小图标全部消除吧,一起体验下! ...
- Android版的疯狂猜图游戏源码完整版分享
这个游戏源码是在安装教程网那么分享过来的,Android版的疯狂猜图游戏源码完整版分享,也是本人之前很早以前发的一款游戏源码的,大家如果想了解一下,可以看看吧,不说多了,上一个图先吧. > ...
- Android宝宝点点乐游戏源码完整版
Android宝宝点点乐游戏源码完整版,是我从其他网站转载过来的,就是那个安卓教程网,该游戏目前已经上线了百度应用商店了,大家可以去搜索一下,看看演示吧. <ignore_js_op> & ...
- 数据结构系列之2-3-4树的插入、查找、删除和遍历完整版源代码实现与分析(dart语言实现)
本文属于原创,转载请注明来源. 在上一篇博文中,详细介绍了2-3树的操作(具体地址:https://www.cnblogs.com/outerspace/p/10861488.html),那么对于更多 ...
- Visual Studio 2010 SP1 中文升级补丁ISO完整版下载 (含多国语言)
最近事情比较多,差点忘记了这个VS2010 SP1的升级补丁更新了,程序员们赶快更新吧!这次发布的SP1包含了下列语言:英文,简体中文,繁体中文,法语,德语,印度语,日语,韩语,俄语以及西班牙语. V ...
- C语言二维数组实现扫雷游戏
#include<stdio.h> //使用二维数组实现 扫雷 int main() { char ui[8][8]={ '+','+','+','+','+','+','+','+', ...
- Android掌中游斗地主游戏源码完整版
源码大放送-掌中游斗地主(完整版),集合了单机斗地主.网络斗地主.癞子斗地主等,有史以来最有参考价值的源码,虽然运行慢了一点但是功能正常,用的是纯java写的. 项目详细说明:http://andro ...
- JAVA在线观看视频教程完整版
今天给大家介绍一下JAVA在线观看视频教程完整版,我们知道Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语 ...
随机推荐
- BMP位图之8位位图(三)
起始结构 typedef struct tagBITMAPFILEHEADER { WORD bfType; //类型名,字符串"BM", DWORD bfSize; //文件大小 ...
- 【Java面试】怎么防止缓存击穿的问题?
"怎么防止缓存击穿?" 这是很多一二线大厂面试的时候考察频率较高的问题. 在并发量较高的系统中,缓存可以提升数据查询的性能,还能缓解后端存储系统的并发压力.可谓是屡试不爽的利器. ...
- Apache DolphinScheduler 1.3.9 发布,新增 StandaloneServer
点击上方 蓝字关注我们 2021 年 10 月 22 日,Apache DolphinScheduler 正式发布 1.3.9 版本.时隔一个半月,在社区贡献者的共同努力下,Apache Dolphi ...
- 【活动专辑】Gitee X DolphinScheduler 邀你一起参与 issue 解决赢好礼!
在你参与 DolphinScheduler 项目开发时,是否曾因为这些问题困惑: 对项目感兴趣,但不清楚自己可以为项目做什么 在众多 issue 中,找不到合适自己参与的 issue 任务 认为参与开 ...
- 实现一个会动的鸿蒙 LOGO
本文将带大家简单实现一个会动的鸿蒙 LOGO. emmm,写本文的动机是之前在掘金看到一篇实现鸿蒙 LOGO 的文章 -- 产品经理:鸿蒙那个开场动画挺帅的 给咱们页面也整一个呗 鸿蒙的 LOGO 本 ...
- 理解 Flutter 的基础概念:Widget
Widget 的本意是组件的意思,熟悉 Web 应用开发的人在后期必定会接触到 Vue.React 等框架,这些框架都有一个核心的概念 -- 组件.组件的目的也很简单,那就是重复率用一段代码,并且能够 ...
- 从C过渡到C++——换一个视角深入数组[真的存在高效吗?](2)
从C过渡到C++--换一个视角深入数组[真的存在高效吗?](2) C风格高效的数组遍历 在过渡到C++之前我还是想谈一谈如何书写高效的C的代码,这里的高效指的是C代码的高效,也就是在不开启编译器优化下 ...
- linux 的文件权限案列
需求: 技术部门人员可以相互查看,但不能删除和修改别人的文件,其他部门人员不能查看,但领导组可以且只能查看. 设计: 技术部: 组 jishu ; 人员 js1, js2 领导:组 lingd ; 人 ...
- java方法---递归
java方法递归 1.什么是递归 就是自己调用自己: 2.递归结构的两个部分 递归头:什么时候不调用自身方法.如果仅有头,将陷入死循环.递归体:什么时候需要调用自身方法.
- scp复制发送文件夹到其他服务器上
简述scp: scp是secure copy的简写,是linux系统下基于ssh登陆进行安全的远程文件拷贝命令. 写法: scp [可选参数] 登录名@地址:源路径 目标路径. 举例:scp -r ...