小游戏---猜数字+扫雷 保姆级别实现(含源码)
引入
C中大部分知识点到这篇文章我们以及共同学习了很多,那么我们这篇文章来实际操作做两个小游戏,小游戏中会涉及到循环,函数调用,数组等基本知识,对这些还不太清楚的友友可以自行查看博主前面的文章。
猜数字游戏实现
游戏设定
给定数字范围在 1-100 之间,随机设置一个值为本轮游戏需要玩家猜测的数据值,根据玩家输入的数据与所猜数据大小比较来帮助玩家猜出,同时设置一轮游戏只有五次机会,五次机会内未猜出数据则游戏失败,玩家可以选择是否继续.....
游戏实现
1.菜单打印
在进入一个游戏页面时,会弹出可以让玩家选择的界面,当一轮游戏结束之后,玩家再次选择是否继续,那么我们为了方便且避免代码冗余,我们将打印菜单封装成一个函数,在循环中调用即可
2.游戏循环进行
在玩家选择开始玩(继续玩)时,游戏继续向下推进,那么此功能需要循环来辅助,只有当玩家选择退出游戏时,循环被打破,玩家退出游戏,程序结束。
不论玩家选择是否继续,菜单都进行打印,循环至少要进行一次供玩家选择,符合do...while 循环特点,在玩家做出选择之后,不同选择对应不同的程序走向,使用分支语句switch辅佐
3.随机数的产生
系统设置的随机数应该在随时变化,这里调用 rand 函数实现(需包含头文件<stdlib.h><time.h>)
rand函数
rand函数适用于产生伪随机数的,但是想要每一轮的随机数不同,还需要更改一下它产生伪随机数的"种子",从而产生一个随时会变化的随机数。
更改种子的函数我们使用 srand ,函数参数我们需要保证每次产生时都在变化,所以我们使用 TIME ,时间总是一分一秒的过去,使用时间来作为函数参数最为合适不过,需要注意的是 srand 函数参数要求为 unsigned int 类型,使用强制类型转换来实现。
种子已经种下,接下来就要开始使用 rand 函数来实现随机数的产生,rand 函数的取值范围是 [ 0 - RAND_MAX ],此时我们游戏设定的取值范围是 1-100,我们可以通过取模运算来实现。
4.游戏次数限制
当每次玩家进入游戏时,设置次数变量为5,每次循环过后进行 自减运算 直至次数耗尽则游戏失败。
代码实现
易错点
1.rand函数范围:rand 函数 % 100 产生的余数是 0-99 ,不符合题意(1-100),加1之后整体范围向后调整,在取模运算之后得到的数字范围不符合题意时要进行微调。
2.玩家给出的数字与程序产生的随机数大小比较:此时一定要判断正确,给出玩家正确的范围引导,若给出错误❌,那真的是完全向反方向发展......
3.随机数放置的位置不能处于猜数字的循环中:这一点千万要谨记,一定要注意它的位置,要是放入循环中,在五次机会中随机数一直在变,那真的是灾难了!!!
4.这里的switch语句中case 后面的语句可以用 枚举 (enum)实现,提高代码可读性(自定义类型下---不太懂的友友可以看博主这篇文章
猜数字小游戏到此就实现完成了,若还有好的想法改进,欢迎评论区留言,共同学习进步!
扫雷小游戏实现
游戏设定
网页版的扫雷都是大家童年的记忆,今天我们来实现一个简易版扫雷。
首先玩家根据菜单,选择是否进入游戏(继续游戏),系统自动设置雷💣的坐标,玩家在控制台输入坐标开始扫雷💣,该坐标非雷则输出坐标一圈雷的数量,当推测出某坐标是雷,则进行标记,若扫到雷💣则直接显示玩家被炸鼠,游戏结束。
游戏实现
1.游戏主体
由上述 猜数字小游戏 基础,本次游戏也采用首先打印封装过的菜单函数,再使用do...while循环和switch语句构成游戏主体,决定玩家是否开始游戏(继续游戏)
2.构造扫雷数组并初始化
扫雷的主体是一个矩阵,我们用二维数组来实现,定义一个二维数组,非雷的地方放置0,雷的地方放置1,那么问题来了:若玩家输入一个坐标,此时坐标非雷且周围有一个雷,我们将1放置在该坐标中,那么此时我们根本不能辨别此时的坐标是雷还是非雷且周围坐标有一个雷?
解决办法:
放置两个一摸一样的数组,一个用来展示给玩家,一个用来放置雷的信息
此时还有一个问题,当我们遍历该坐标周围八个坐标时,当坐标处于数组边界,势必会出现数组越界的情况,那么此时我们应该扩大数组边界,但是数组边界一圈不放置有效信息供玩家访问,只是为了解决数组越界而创造。
下文首先使用解决办法1(构造两个数组来实现):
在创建二维数组时,我们要给扫雷难度留有余地,在网页版本中,大家都玩过不同级别的扫雷,在定义数组大小时,我们采用 #define 来定义数组大小 以方便以后更改。
创建好数组之后开始初始化数组,这里的 " * " 是字符,将两个数组均设置为字符数组方便使用,但是需要注意这里的 放置雷信息数组就是 '0' ,'1' ,是字符非数字。
函数调用:
函数声明:
函数定义:
3.打印数组
在玩家选择开始游戏时,要打印出无雷信息的数组供玩家选择坐标,此时为方便玩家输入坐标,创建数组时要注意打印数组行列以便观察
函数声明:
函数调用:
包含雷信息的数组 mine 不会对用户展示,此处使用 mine 数组展示
函数定义:
4.布置雷
布置雷的位置是随机的,玩家开启每一轮的游戏,雷的位置也会随机发生变化,与上述猜数字小游戏类似,我们还是使用上述游戏中的 rand 和 srand 函数使用。将雷的坐标内容改变为字符 '1',放置在 mine数组中。
函数声明:
布置雷的个数,方便更改
函数调用:
完成布置后,使用打印函数观察结果是否达到预期
函数定义:
5.排查雷
到这步时,我们的前期准备工作以及完成,就要开始玩家旅程了
函数声明:
1.PlayBoard 函数是玩家开始游戏,引导游戏进程的函数
2.GetBome函数是在玩家输入排查坐标后,非雷位置统计周围一圈有几个雷的函数
3.AddFlag函数是在玩家推断出某坐标位置是雷,对该位置进行标记
函数调用:
函数定义:
注意:此时坐标元素相加是字符相加,算出几个雷是 int 型数据,减去 '0' 得到,放入数组中时再加上即可。
当玩家将所有非雷坐标都排查过后,此时数组中只剩下雷的坐标,此时玩家获得胜利,用变量 win 来标记,win 达到数组元素所有非雷的个数时,挑战成功!
源码
以上就是使用解决办法(双数组)的扫雷游戏实现,此处是源码合集,方便大家查看.....
总结:
1.代码可以多文件书写,方便整理
2.在传参过程中,虽然只需要 9*9 的矩阵来存储信息,但是传参仍然传 11*11,可以使用时函数参数是 row* col ,数组传参千万不能省略防止数组越界的两行。
3. 使用 rand 函数时,除了要注意使用 srand 函数产生 "种子",还要记得取模运算时产生的范围
例如:(rand % m)产生的是 0 - m-1的数据,不符合题意要进行微调
4.合理使用 #define ,方便代码重复利用
5.在使用数组时,一定要谨记此处的数组是字符数组,不要用整型去计算。
