(注:所有涉及到函数的知识在后期会详细讲解~,小伙伴们稍安勿躁哈~)
哈喽小伙伴们,帅气的我又又又来了哦~
今天我们来看看用C实现猜数字游戏怎么个事~
①怎样让电脑产生随机数
为了让电脑产生随机数,在C语言中提供了这样一个函数: rand 关于这个函数,大家可以在:
cplusplus.com/reference/cstdlib/rand/ 里面了解它的功能,这里做一个简单介绍,rand函数的功能就是:Returns a pseudo-random integral number in the range between 0
and RAND_MAX. 翻译过来就是rand函数会返回一个伪随机数,这个伪随机数的范围在 0 到 RAND_MAX 之间,而RAND_MAX 的值为32767.也就是说,通过rand函数,系统可以产生 0~32767 之间的任意一个伪随机数,为啥叫伪随机呢? 哦对了,在使用rand函数时,别忘了包含它对应的头文件呢,<stdlib.h>
我们来看下面一串代码:
如图所示,我用rand函数产生了七个随机数并打印
有的小伙伴就问了,这不挺好的嘛,你为啥说人家是伪随机数嘞?
原因是:我再运行一次,结果还是这些数~
不信你看:
你若不信截图,可以在自己的电脑上试一试~
为什么会出现这种情况呢?
rand函数产生的随机数之所以被称为伪随机的,是因为它是用另一个函数的参数作为基准值,通过某种运算得来的. 这个函数就是 srand 函数(头文件:<stdlib.h>). 关于 srand 小伙伴们可以在:
cplusplus.com/reference/cstdlib/srand/ 中查看它的功能~
大致是这样的:srand 是一个伪随机数的生成器,说白了就是用来设置rand的随机数生成起点的一个函数,而在没有调用srand之前,rand生成的起点默认为1,这样大家想,每次生成的起点一样,每次生成所用的算法也一样,那每次生成的"随机数"不也就一样了嘛~
所以为了改变这种情况,我们在不知道随机数算法的前提下不就只能改变随机数的生成起点嘛
而对于srand 函数来说,它的函数大致的架构是这样的:
void srand (unsigned int seed);
在这里, srand 里面的参数默认为1, 也就是说rand 的生成起点默认为1,而我通过刚刚的分析,是不是,要让这个参数时时刻刻都在变呀~
② 时间戳
大家想一想,我们从古至今永远在不断变化的是不是时间呀,正所谓:逝者如斯夫,不舍昼夜.随着时间的流逝,曾经懵懂无知的我们也已经长大成人,唉[泪目](对不起各位小伙伴,我稍稍感伤了一下下~)
而在计算机中关于时间也有计算的机制,这个机制就是时间戳~
关于时间戳的概念,小伙伴们可以参考:时间戳(Unix timestamp)转换工具 - 在线工具 (tool.lu)
这里简单介绍一下,所谓时间戳,就是从计算机创造出来开始(1970/1/1 00:00:00)~当前时间 所相差的时间换算成秒,大家想,只要当前的时间一直在变,这个秒数是不是就会一直增大呀,那么如果我把这个不断变大的秒数(也就是时间戳)放入srand函数的参数里面,不就可以让随机数的生成起点一直改变嘛,这样rand不就生成了真正意义上的随机数嘛?
那么怎样生成时间戳呢?
C 中为时间戳也提供了一个函数:time (头文件: <time.h>)
关于这个函数,小伙伴们可以在:cplusplus.com/reference/ctime/time/ 中了解详细的细节,这里给它做一个简单的介绍:
这个函数的大致架构为:
time_t time (time_t* timer);
可以看到,这个函数的返回类型是time_t 它的参数是一个指针(后面再详细介绍~),当你不用它的参数时,需要把参数写成NULL,它的功能就是返回时间戳,接下来我们它放进srand函数的参数中,看看每次生成的随机数是不是不一样
请看下面一段代码:(第一次运行)
第二次生成:
你看,这两次的结果是不是就完全不一样呀~
③ 正式开始写游戏的逻辑
有了生成随机数的方法,咱们下面正式开始写这个小游戏的程序设计~
首先大家想,我要开始一个游戏是不是得设置一个菜单,在这个菜单里,我要注明按钮及其功能对不对? 接下来我就先设置一个菜单,并让操作者输入一个值,如果这个值是1,那就启动游戏,玩完一轮之后,再次选择1/0,来实现启动/退出游戏.
那么接下来,来看这样一串代码:
(case 0 的后面也要加一个break哟)
经过刚才的分析,各位小伙伴们想必已经猜到,判断条件就写:input
原因是;当我输入input为1 时,就会进入游戏,玩完之后再去判断条件,这时input==1 为真,再次循环打印出菜单,并让操作者输入一个值,以此来判断这一轮是玩还是退出,反之如果我输入0,打印退出游戏后再判断循环条件,此时input==0,就不会再循环打印菜单,就像退出了游戏的APP一样对不?
所以这个判断条件里应该放input
那么接下来,我们就开始写开始游戏的逻辑~
仔细看下面一串代码~
void menu()
{
printf("***************************\n");
printf("******** 1.play **********\n");
printf("******** 0.exit **********\n");
printf("***************************\n");
}
void game()
{
int guess = 0;
int r = 1 + rand() % 100;
while (1)
{
scanf("%d", &guess);
if (guess < r)
{
printf("猜小了,请再猜一次\n");
}
else if (guess > r)
{
printf("猜大了,请再猜一次\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do {
menu();
printf("请选择:")
scanf("%d", &input);
switch (input)
{
case 1:
game();
printf("游戏已开始,请输入你猜的数字:")
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
在上面的这一串代码中,我将游戏运行的逻辑封装成了一个名叫game 的函数,把菜单的打印封装成了menu 的函数.
这样既方便调用,也避免了代码的大量堆积,使代码更有层次感,更清晰.
在game函数中,我把1+rand所产生的随机数%100 是不是就产生了1~100 之间的数呀~
这里小伙伴们需要想明白的是:任何一个数%100 之后所产生的数是0~99,不知各位小伙伴能否想明白~
如果不能理解,那就听小编给你举个例子吧~
eg:32767÷100 按正常计算是不是应该等于327.67,所以在C中这个算式的商是不是327呀? 那商为327的话,你想,327×100=32700,那余数是不是67 ?
所以你会发现:任何一个数%100 都是0~99 然后我又加了个1,不就变成1~100 啦!
然后在while 循环中设置猜后提示,直到猜对为止则游戏结束.
好啦,你听懂了嘛? 这就是关于这个小游戏所有的逻辑~
另外,关于这一篇所有的代码,我都放在:test 4_24/add.c · 等同于/C.src - 码云 - 开源中国 (gitee.com)
不理解的小伙伴可以看看哦~
这一篇就到这里,我们下一篇再见~