文章目录
前言
啦啦啦啦~学了这一个月加二十天的C语言,小桃子学会了如何做一个简单的猜数字游戏,大家跟随小桃子一起来看看吧。
`
一、游戏要求
1.1 电脑自动生成一个1~100的随机数
1.2 玩家猜数,猜数过程中给出相应的大小提示
二、功能实现
2.1 随机数生成
2 .1.1 rand函数 srand函数 time函数
C语言提供了一个rand函数,可以生成“随机数”
/*随机数的生成*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("%d\n", rand());//但这样生成的“随机数”其实并不随机
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
rand函数为库函数,使用时要包含<stdlib.h>这个头文件。
我们可以看见屏幕上出现了一些“随机数”,但当我们让编译器重新编译链接时,弹出来的窗口上仍然是这几个数字。那么这样生成的“随机数”本质上其实并不随机。
甚至我们在原有的基础上再叠加一个printf,但出来的结果前面几个数字仍然不变,更加验证了rand生成的随机数其实并不随机这一点。
为什么会这样呢?
让我们深入了解一下rand函数。
C语言提供的rand函数原型为
int rand(void)
即rand函数不接收参数,会返回一个伪随机数,范围为0~RAND_MAX之间,这个最大值不确定,是依赖编译器实现的。而生成的数据不随机的原因是,rand函数是根据一个叫“种子”的基准值生成的随机数,种子默认为一。如果要生成真正的随机数,就要想办法改变这个基准值种子。
那如何改变这个基准值呢?
C语言提供了一个初始化随机数生成器的基准值(种子)的函数——srand
void srand(unsigned int seed)
在使用rand函数之前,调用srand函数,随机改变种子(基准值)的值,rand函数再对这颗种子进行运算,就可以使得rand函数生成的值变得随机起来。
那么问题来了,如果我们有能力让基准值发生随机变化,那么我们也有能力让rand函数生成随机值。
但问题就在于,我们没有办法生成一个随机数,也就没有办法生成随机的种子。
如果随机的种子没有办法生成,那有没有办法生成有一定顺序的种子呢?
我们引入C语言中的time函数
time_t time(time_t* timer);
在程序中我们一般使用程序运行的时间作为种子,因为时间是不断变化的---->种子不断变化---->生成的伪随机数不断变化---->所以伪随机数变成了真正的随机数。
time函数返回的是1970-1-1-0:00到现在时间差值的秒数差值,为32或者64位的整数类型。这个差值也叫时间戳。timer的参数我们之后再补充,小桃子暂时还不理解书上timer这段话。
目前只要记住,如果只要time函数返回时间戳,我们就这样写
time(NULL)
好啦,现在我们可以完成一个随机数的生成啦!
/*随机数的生成2.0版本*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
srand((unsigned int)time(NULL));//将time类型强转为unsigned int类型(srand函数的参数类型)
printf("%d\n", rand());//种子已经发生变化
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
我们可以看到,已经完成随机数的生成工作啦!
问题又来了,如何生成0~99之间的随机数呢?
利用适当的加减与取余
要生成a~b的随机数,方法如下
a + rand()%(b - a + 1);
2.2 游戏实现
/*猜数字游戏*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu(void)
{
printf("****1为玩游戏,2为不玩游戏***\n");
printf("*****************************\n");
printf("**********1 . play **********\n");
printf("**********0 . exit **********\n");
printf("*****************************\n");
}
void game()
{
int guess = 0;
int right = rand() % 100 + 1;
while (1)
{
printf("请输入你认为正确的数字 : \n");
scanf("%d", &guess);
if (guess > right)
printf("haha,你猜大了\n");
else if (guess < right)
printf("hehe,你猜小了\n");
else
{
printf("好好好,被你小子猜着了\n");
break;
}
}
}
int main(void)
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();//出现1/0提示图标
printf("请选择1 / 0 : \n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,请重新输入\n");
}
} while (input);
return 0;
}
执行结果
总结
这是小桃子写的第一个“系统”一点的“游戏”,非常简陋,或许也根本就不算一个游戏,还是在模仿老师的情况下完成的,但是小桃子依旧很开心啦~
我是小桃子,我爱这个世界。