赞
踩
在掌握了前面的分支循环使用之后,我们就可以写一些稍微有趣的代码了,例如,我们可以实现一个猜数字游戏。
要想完成猜数字游戏,我们就需要生成随机数,那么该如何产生随机数呢?
C语言中提供了一个函数叫做rand,这函数是可以生成随机数的,函数原型如下:
int rand(void);
但是值得注意的是,rand函数生成的随机数是一种伪随机数,并不是真正意义上的随机,这个随机数范围在0——32767之间,rand函数使用时需要加上一个头文件:stdlib.h。
我们用下述代码来演示一下rand函数:
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- printf("%d\n",rand());
- printf("%d\n",rand());
- printf("%d\n",rand());
- printf("%d\n",rand());
- printf("%d\n",rand());
- printf("%d\n",rand());
- return 0;
- }
看上去两次编译运行结果相同,恰恰说明了rand所提供的随机数是一种伪随机,是通过某种算法生成的随机数,真正的随机数是无法预测下一个数是多少的,如果要生成不同的随机数,那我们就需要改变一下函数。
C语言中又提供了一个函数叫做srand,是用来初始化随机数的生成器的,srand函数的原型如下:
void srand(unsigned int seed);
程序中调用rand函数之前先调用了srand函数,通过srand函数的参数seed来设置rand函数随机数生成的种子,只要种子在变化,每次生成的随机数也就变化起来了。那就是说给srand的种子如果是随机的,rand就能生成随机数,在生成随机数时又需要一个随机数,这就相互矛盾了。
在程序中我们一般是使用程序运行的时间作为种子,因为时间是时刻在变化的。
在C语言中有一个函数叫做time,就可以获得这个时间,time函数原型如下:
time_t time(time_t* timer);
time函数会返回当前的日历时间,其实返回的是现在的时间距离1970年1月1日0时0分0秒的差值,单位为秒,其返回类型是time_t类型,time_t类型实际上是32位或64位的整型类型。
time函数的参数timer如果是非NULL的指针的话,函数也会将这个返回值的差值放在timer指向的内存中带去。
如果timer是NULL,就只返回这个时间差值。time函数返回的这个时间值也叫做时间戳。
time函数使用时需要包含头文件:time.h,那么我们就可以让生成随机数的代码改写如下:
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- int main()
- {
- srand((unsigned int)time(NULL));
- printf("%d\n",rand());
- printf("%d\n",rand());
- printf("%d\n",rand());
- printf("%d\n",rand());
- return 0;
- }
再次观察,每次运行的结果就不同了,就代表我们的随机数设置成功了。
如果我们要生成0——99之间的随机数,方法如下:
rand()%100;//余数范围为0到99
如果我们要生成1——100之间的随机数,方法如下:
rand()%100+1;//余数是0——99,+1后范围是1——100
如果我们要生成100——200之间的随机数,方法如下:
100+rand()%101;//余数范围是0——100,加上100范围为100——200
我们要先想象一下猜数字游戏的架构,先给出一个随机数,是我们要猜的数字,如果猜大了,则给予提示,并且重新猜测,猜小了,就给出提示猜小了,如果猜对了,就可以提示恭喜通关,也可以增加难度比如只能猜三次。
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- void game()
- {
- int r=rand()%100+1;
- int guess=0;
- int count=5;
- while(count)
- {
- printf("\n你还有%d次机会\n",count);
- printf("请猜数字>:");
- scanf("%d",&guess);
- if(guess<r)
- {
- printf("猜小了,请重新猜测\n");
- }
- else if(guess>r)
- {
- printf("猜大了,请重新猜测\n");
- }
- else
- {
- printf("恭喜你,完成猜测,奖励100元\n");
- break;
- }
- count--;
- }
- if(count==0)
- {
- printf("你失败了,好好反思下最近是不是没有努力\n");
- }
- }
- void menu()
- {
- printf("********************\n");
- printf("*******1.play ******\n");
- printf("*******0.exit ******\n");
- printf("********************\n");
- }
- int main()
- {
- int input=0;
- srand((unsigned int)time(NULL));
- int n=rand();
- int m;
- do
- {
- menu();
- printf("请选择>:");
- scanf("%d ",&input);
- switch(input)
- {
- case 1:
- game();
- break;
- case 0:
- printf("游戏结束\n");
- break;
- default:
- printf("选择错误,重新选择\n");
- break;
- }
- }while(input);
- return 0;
- }
最后,完整代码附上,快上你的vs2022试试吧!喜欢的话可以点个赞支持一下哦!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。