[C语言]扫雷游戏

扫雷游戏规则:

不踩雷,并且将所有非雷位置全找出来,非雷位置会显示周围一共八个位置存在雷的个数.

整体思路:

由于我们做的是个9*9的游戏规格,可能我们马上想到创建是九行九列的二维数组,但仔细思考下就可以发现如果在第一行、第一列、最后一行或者最后一列点开一个非雷位置,它要查找并显示周围雷的个数不就越界了吗。

所以我们应该创建11*11的二维数组, 同时考虑到存放雷和寻找雷在同一棋盘,而且展示出来的棋盘应该是隐蔽的,因此要创建两个二维数组,一个用来系统随机存放雷,以及我们寻找雷,另外一个数组是用来展示当前扫雷进程。

我这里将整个项目分为game.h (包含所有要用到的头文件), game.c(游戏具体步骤的实现)、test.c(调用函数)三部分,使得程序简洁、易懂。

test.c存放主函数和game函数,game.c存放初始化数组、打印数组、电脑布雷和玩家找雷的函数。

所以扫雷游戏的组成成分和动作包括:游戏开始和结束的提示 、初始化棋盘、电脑埋雷、打印棋盘、玩家排雷、判断输赢。

游戏开始和结束的提示:

 这一步主要是告诉玩家如何开始和退出游戏,同时丰富了游戏界面。

头文件以及预处理:

将预处理,头文件和函数定义都放在game.h的头文件内,方便其他源文件调用函数使项目具有统一和完整性,在其他两个文件内只需调用包含"game.h"头文件就能实现所需功能。

1.C语言在做一些大型项目尽量不用直接用数值作为定义数组大小和循环的参考值,首先不美观,其次不方便后期代码的更改。像上面代码这样,如果以后想要改成16*16的棋盘不需要一个个的改数值,只需改变一次预处理的值。

主函数的调用:

 首先,让玩家选择是否开始游戏,输入1进入循环并开始游戏,输入0退出游戏并跳出循环,输入其他数字就会提示错误。这里的srand((unsigned int)time(NULL))是和后面用到的rand函数搭配的,先不细说。

进入游戏,调用函数实现游戏:

创建布雷和找雷的棋盘和展示棋盘的两个二维数组 ,将它们分别传入函数实现功能。

初始化棋盘:

将11*11的二维数组全部初始化为传入的字符set,用set决定初始化的字符是因为两个二维数组初始化的值不同。

打印棋盘:

后两个打印是标识出棋盘的横纵坐标号,像这样

 电脑在数组内随机布置雷:

 定义x和y用来接收电脑给的随机值,n变量初始化为10代表要放十个雷。调用rand()函数是电脑产生随机值,模row(9)+1(任何数模9的值在1-8之间再加一 就使x和y接收值的范围在1-9之间了),不过防雷的前提是该位置本身不是雷。这个rand函数要产生随机值就需要在之前调用srand函数,而且srand函数只能调用一次,否则产生的值不随机,所以将srand放在了主函数的开头。

玩家扫雷:

 玩家找雷就需要将两个数组都传入,找雷循环体结束有两种情况:

1.玩家踩雷了->失败,跳出循环,游戏结束。

2.玩家找出了所有的雷->赢了,跳出循环,游戏结束。

所以,当玩家踩雷时会break跳出循环,而如果要找出所有的雷就得找出71次(9*9-10)非雷的坐标,因此循环体正常是循环71次退出。如果出了循环是71次,那么说明你赢了。

还有一点,如果你没踩雷那就要显示出来该非雷位置周围有多少个雷,所以创建了一个临时变量ret接收周围雷的个数赋值给show二维数组的同样坐标位置(因为show展示目前游戏状态),而且要转为字符形式传给它所以在个数基础上加字符零。

计算周围雷个数的函数:

因为mine数组无非就是字符零或字符一,而这两个字符的ascll码值仅仅相差1,因此将周围八个坐标的值相加减去八乘以字符零就能得出周围雷的个数。

这个函数没有将初始化存入game.h是因为该函数只在game.c内被玩家找雷函数调用。

完整代码:

最终效果图: 

大家如果喜欢的话麻烦三连下哦,也都可以写写分享给朋友们,说不定他们会迷上你的写的小游戏呢!

写后有感:

代码这东西时常就是听起来都会,写起来就废,大家如果在不熟悉的情况下可以先跟着一步一步的写完,再产生自己的理解和记忆,过一段时间后自己再独立写一遍,毕竟知识不通过自己的大脑输出那永远都不是你自己的知识。

不懂的欢迎私信或评论区留言哦!

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值