- 引言
- 相关库函数介绍
- 生成一个随机数
- 猜数字代码实现
1. 引言
在介绍猜数字小游戏之前,我会先讲解一些游戏中所要用到的一些库函数,方便大家理解。
2. 相关库函数介绍
2.1 rand
int rand(void);
rand是标准库<stdlib.h>里的库函数,会返回一个伪随机数,伪随机数的范围是0~RAND_MAX之间,RAND_MAX 的大小是根据编译器来确定的。但大多数编译器的值是32767。
为什么说是一个伪随机数呢
rand生成随机数是以一个名为“种子”的基数为基础根据一种算法获得的随机数,不是真正的随机数,而这个“种子”的基数默认值是 1 。因此每次编译生成的随机数都是一样的。
下面是两次编译的结果,你会发现生成的随机数是一样,因为“种子”默认值是1没有变化,所以两次生成的随机数也是一样的,只有这个“种子”不断变化,生成的随机数才每次都不一样。
这就要介绍下面的函数:
2.2 srand
void stand(unsigned int seed);
srand函数也是标准库<stdlib.h>里面的库函数,用来初始化生成随机数的“种子”。
rand函数每次调用前都要先从stand函数这里获得“种子”值(“种子”的默认值是1),然后根据某种算法生成随机数,因此要想得到真正的随机数就要让“种子”不断变化,才能让每次编译生成的随机数是不同的。
想想计算机里什么东西是不断变化的:时间
因此就涉及到下面的函数:
2.3 time
time_t time(time_t *timer);
time是标准库<time.h>里面的库函数,返回值类型是 time_t(实际上是一个32位或者64位的整型类型),而这个返回值也被称为 时间戳,是不断变化的一个值。
什么是时间戳?
时间戳也就是从1970年1月1日0时0分0秒到现在的时间差值,单位是秒。
time函数的参数为空时:则只会返回时间戳的值
time函数的参数不为空时:则会将时间戳的值放到timer所指向的内存中,并返回时间戳的值。
而我们生成随机数只需用到时间戳的值,因此就可以使time函数的参数设置为空(NULL):
time(NULL);
3.生成一个随机数
学完上面的函数知识后,我们就可以生成随机数了。
srand( (unsigned int)time(NULL) );
int rdom = rand();
首先通过调用time函数生成一个时间戳(这个时间戳是整型类型),而srand接收的参数应是time函数返回的一个 无符号整型,而srand函数应该接收的参数为无符号整型(unsigned int),因此要将 time函数返回的时间戳强制类型转换成(unsigned int)类型 ,srand接收后就生成一个 种子 ,由rand函数接收,生成一个随机数赋值给定义的变量rom,这样一个随机数就生成了。
下面便是“种子”不断变化,两次编译后生成的随机数:
很明显这两次编译后生成的随机数是不同的。
4.猜数字代码实现
了解完上面三个函数后,你就可以自己动手去尝试编写 猜数字小游戏 的代码了。
下面是(博主自己写的)猜数字的完整代码(仅供参考):
#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 rdom = 0;
int guess = 0;
rdom = rand() % 100 + 1;
while (1)
{
printf("请输入你要猜的数->");
scanf("%d", &guess);
if (guess < rdom)
{
printf("猜小了\n");
}
else if (guess > rdom)
{
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();
break;
}
case 0:
{
printf("退出游戏\n");
break;
}
default:
{
printf("输入错误,请重新输入!");
break;
}
}
}while (input);
return 0;
}