OK了诸君,五一小长假正式结束了,各位玩的怎么样呢?不管再怎么放肆开心,现在咱们也得把这个心往回拉一拉,学习方面咱们扬帆再起航,假期方面静静期待暑假哈哈哈
言归正传昂,这一期咱们主要是利用我们学过的知识,如:函数,循环,嵌套循环,i f 语句等等来综合起来实现一个猜数字游戏的代码,现阶段对我们来说,这个整体还是相对复杂繁琐的,所以我们应当理清思路,化整为零,逐个击破
一.生成随机数
咱们先构思哈,当我们要设计一个猜数字游戏,我们是想让玩家来猜数字,那么首先咱们的游戏系统里得有数字是吧,且这些数字还得是不能被预知的随机数,不然每次生成的数就是那几个固定的,玩家玩两次就记住了,这样游戏就失去可玩性了是吧
1. rand 函数
在这里我们引入一个概念叫 rand 函数,这是C语言中提供的,首先,使用 rand 函数需要包含头文件------<stdlib.h>,其次它概念上是可以生成" 随机数 "的,But !我们直接写出 rand 函数时,它所返回的是一个" 伪随机数 ",其意思就是:这个" 随机数 "完全是可预测的,其范围是在0~RAND_MAX之间,这个RAND_MAX的大小是依赖编译器上实现的,且绝大部分编译器上都是32767,老规矩,无需多言,咱们直接上图帮助诸君形象理解:
如图,当我们在这里调用 rand 函数,第一次,我们会觉得这些数就是随机数,因为这些数字看起来非常之混乱,好像就是随机数,其实不然,当我们多运行几次就会发现,每次生成的数都是一模一样的,这就是所谓的伪随机数
2.伪随机数
rand 函数生成的这类伪随机数并不是真正的随机数,而是通过某种算法生成的" 随机数 ",rand 函数是对一个叫作**" 种子 "的基准值进行运算生成的" 随机数 ",而之所以会出现我们图例中那样的每次运行产生随机数序列都一模一样,这是因为rand 函数生成" 随机数 "的系统默认种子为" 1 "**,由此可观之,若我们想要生成不同的真正的随机数,我们就必须让种子也是变化的
3. srand 函数
出现问题了,诸君莫慌,毕竟C语言系统已经问世这么多年了是吧,我们所遇到的问题前辈们自然也会遇到,所以自然也就有着与之对应的解决方法。因此,为了解决伪随机数的问题,在C语言中又引入了一个 srand 函数,它就是专门用来初始化随机数的生成器
在我们程序调用 rand 函数之前我们先调用 srand 函数,再通过 srand 函数是参数 seed 来进一步设置 rand 函数生成随机数的时候的种子,只要种子在不断变化,我们的随机数序列也就会随之变化
srand 函数格式如下:
4. time 函数
我们怎么让种子活过来、动起来呢?这个时候就又引入了一个 time 函数,就是" 时间 ",因为时间是随时随地在不断变化的嘛,所以当我们使用 time 函数作为程序运行的种子时,这个种子就活过来了,time 函数的头文件是<time.h>
time 函数格式如下:
这里涉及到了一些指针的概念,在这儿我就不过多赘述了,暂时只给大家粗略介绍一下,在后续学习指针的章节会为大家详细讲解
我们的 time 函数返回的是当前的日历时间,其实返回的是1970年1月1日0时0分0秒到现在程序运行时间的差值,单位是秒(这个时候就有小伙伴要提问了是吧,为什么是从这个时间开始呢?至于这个嘛,我其实也不太清楚哈哈哈,我的理解是因为在1969年,贝尔实验室的Ken Thompson与Dennis Ritchie一起开发了Unix操作系统嘛,然后在这个基础上相继衍生出了B语言、C语言。OK,感兴趣的小伙伴可以自己去查阅相关资料,咱们就不在这个问题上钻牛角尖了)
返回的类型是 time_t 类型,究其本质就是32位或64位的整形类型
time 函数的参数timer 如果是非NULL(NULL就是0)的指针的话,函数也会将这个返回的差值放在 timer 指向的内存当中去;如果 timer 是NULL(0),就只返回这个时间的差值,这个时间差就被我们称做:时间戳
通过 srand 函数并且以 time 作种子,我们就可以生成真正的随机数,如图:
二.设置随机数的范围
解决了随机数的问题,我们就来进一步设置随机数的范围
当我们想要把随机数限制在10以内怎么办呢?很简单,我们先将生成的随机数%10,此时余数是不是只能取到0~9,我们再加一,就能得到0~10,如:rand()%100+1
同理可得,想要将随机数限制在100以内就rand()%100+1,想要1000就rand()%1000+1
再进行变通:想要100~200以内的随机数,如:100+rand()%(200-100+1)(在余数范围为0~100的基础上再加上100,此时随机数的范围就被限制在100~200)
三.实现游戏
接下来我们直接进行代码演示:
主体main函数:
游戏菜单(函数):
游戏内容:
我也会把这个代码上传到我的 git 上,诸君感兴趣的可以参考参考。网站:5.6_3/5.6_3/猜数字游戏(精细版).cpp · 野原希之助/Dove_X - 码云 - 开源中国 (gitee.com)
OKK,猜数字游戏的大致内容和框架就是这样的,综合了我们学过的函数,循环,i f 语句等,还引入了 rand 函数,srand 函数,time 函数等概念,希望诸君能够理解消化。大家有兴趣的可以自己去尝试并且做出一些更改及优化,最好自己也去过一遍代码,毕竟好记性不如烂笔头嘛。就这样咯,咱们下期再见,与诸君共勉!!!