目录
玩游戏之前我先介绍3个库函数
一。rand
C语言提供了一个函数叫rand,这个函数可以生成随机数函数
使用这个函数需要包含头文件<stdlib.h>,该函数产生随机数的范围0~32767,但该函数产生的随机数是伪随机的,伪随机数不是真正的随机数,它是通过某种算法生成的随机数。真正的随机数是无法预测下一次生成的值是多少,就像买彩票一样。而rand函数就是对一个叫"种子"的基准值进行运算生成的随机数,运行效果如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
for (i = 1; i <= 5; i++)
{
printf("%d\n", rand());
}
return 0;
}
我们可以看出来第一次运行的结果和第二次运行的结果一样,不信的可以自己运行一次,之所以我们两次运行的结果是一样的,那是因为rand生成随机数默认种子是1,如果要生成不同的随机数,那就要使其种子发生变化。
二。srand
C语言提供了一个函数叫srand,他可以初始化随机数的生成器,也就是改变种子的基准值。
- 无返回型,接收类型是无符号整形
- 引用此库函数要包含头文件<stdlib.h>
- 该函数在程序运行过程中只需要执行一次
在使用时我们让seed的值变化起来就可以改变rand函数生成随机数的种子,所以如果我们让seed的值是随机数,那么rand生成的数也一定是随机的,那么在生成随机数的时候又需要一个随机数,那不就互相矛盾了,那有没有解决方法?
三。time
我们可以使用time函数的返回值作为生成随机数的种子,因为时间是一直在发生变化
- 这个函数使用时需要包含头文件<time.h>
- 它的参数类型是time* 我们传个NULL空指针也可以返回时间差
- 它的返回值是time_t,而time_t是32位或者64位的整形类型,它返回的是1970年1月1日0时0分0秒到我们现在运行程序时间的差值,单位是秒,这个时间差我们也叫做时间戳 http://shijianchuo.wiicha.com/
改写随机数代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
//使用time函数返回的时间戳作为种子
//因为我们srand接收的参数是unsigned int类型,使用我们需要将time函数的返回类型强制转换
srand((unsigned int)time(NULL));
int i = 0;
for (i = 1; i <= 5; i++)
{
printf("%d\n", rand());
}
return 0;
}
运行结果:
设置生成随机数的范围
如果我们生成的数要在1~100之间我们可以这么写
rand () % 100 + 1; // %100的余数是0~99,加1就变成了1~100
那如果我们要生成a~b的数字我们就可以这么写
rand() % (b - a + 1) + a;
猜数字游戏
游戏要求:
- 电脑自动生成1~100的随机数
- 玩家猜数字,猜数字的过程中,根据猜测数据的大小给出猜大了或猜小了的反馈,5次机会没猜中就退出,猜对了游戏结束
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//猜数字
void menu()
{
printf("******************\n");
printf("******1.play******\n");
printf("******0.exit******\n");
printf("******************\n");
}
void game()
{
int n = rand() % 100 + 1; //生成1到100的数
int count = 5;//最多猜5次
int input = 0;
while (count)
{
printf("请输入要猜的数字:");
scanf("%d", &input);
if (input > n)
{
printf("猜大了往小的猜\n");
}
else if (input < n)
{
printf("猜小了往大的猜\n");
}
else
{
printf("恭喜你猜对了\n");
break;
}
//这里一定要--count,因为前置--是先减减后判断
//如果是count--,那就是先判断后减减
//那我们count等于1的时候假如猜错了执行if语句
//那么它就会输出你还有0次机会,而不是输出你失败了,然后显示要猜的随机数
if (--count)
{
printf("你一共还有%d次机会\n", count);
printf("--------------------\n");
}
//如果count等于0为假,!是取反操作,那么就!count就为真
//所以当count等于0的时候就可以输出下面的语句
else if (!count)
{
printf("你失败了,正确的数字是:%d\n", n);
}
}
}
运行结果: