猜数字游戏就是程序给出一个数但不告诉你,我们需要去猜,根据我们给出的答案,程序还能够告诉我们是猜对了还是猜错了,是猜大了还是猜小了。今天我们就要用简单C语言来实现一个猜数字游戏。
因为是猜数字游戏,所以需要的数字是随机的,如果想生成随机数字,我们就需要用到以下几个函数。
1.rand函数
这个函数的原型是:
int rand (void);
引用这个函数需要包含头文件stdlib.h
这个函数会返回一个大小在0~RAND_MAX之间的整数,这个RAND_MAX的大小取决于编译器,不同的编译器大小可能会有所不同,大部分的编译器中RAND_MAX的值是32767。
以下是其随机数的生成结果。
但这个函数返回的数是伪随机数,并不是真正的随机数。什么意思呢?让我们把上方的代码再次运行一次看看,如下
是不是发现运行的结果和第一次运行的结果是相同的,这时我们就很奇怪了,我们不是要实现猜数字游戏吗,那如果每次生成的数字一样,那这个游戏只能玩一次了。
伪随机数不是真正的随机数,伪随机数是通过某种算法得出来的随机数,而rand函数是对一个叫“种子”的基准值进行运算生成的随机数。之所以上面的程序每次的结果一样,是因为rand函数生成随机数的默认种子是1,如果想要生成不同的随机数,就要让种子是变化的。
于是我们就需要用到另一个函数srand
2.srand
这个函数的原型是:
void srand (unsigned int seed);
引用这个函数需要包含头文件stdlib.h
srand函数是用来初始化随机数的生成器的,程序中在调用rand函数前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,rand函数每次生成的随机数也就变化起来了。
但我们是为了生成一个随机数,可是现在我们又需要srand函数中的参数seed是随机变化的,这就变得冲突矛盾了。
这时候就要引入第三个函数time了。
3.时间戳
在介绍time函数之前,我们先要了解一下什么是时间戳
时间戳是指格林威治时间1970年01月01日00时00分00秒(即北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
4.time
这个函数的原型是:
time_t time (time_t* timer);
引用这个函数的时候需要包含头文件time.h
time函数会返回当前的日历时间,其实返回的是1970年1月1日0时0分0秒到现在运行时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t类型本质上是32位或者64位的整型类型。
time函数的参数timer如果是非NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。
如果timer是NULL,就会返回这个时间的差值。time函数返回的这个时间差就是”时间戳“。
如果只是想让time函数返回时间戳,我们可以这样写:
因为时间是会时刻变化的,所以我们就可以把time函数所返回的时间戳当作seed的值。
现在让我们写一段代码看看是否能生成随机数:
大家可以看到,我将这段代码运行了两次,所出现的结果是不一样的,因此我们实现了随机数的生成。
5.如何规定生成随机数的范围
因为rand函数生成的随机数范围是在0~RAND_MAX之间的(RAND_MAX的值在大部分编译器上是32767),这个范围太大了,我们很难猜到随机数,这时候我们就可以利用求取来规定范围了
这里我们可以利用一些方法生成a~b的随机数
6.猜数字游戏的实现
知道了以上3个函数rand、srand、time后我们知道了如何生成随机数,使用求余的方法我们又可以规定生成的随机数的范围,知道了这些后我们就可以写一个代码来实现猜数字游戏了(猜1~100之间的随机数)。以下是我写的代码,大家可以参考一下。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("********************\n");
printf("**** 1:开始游戏 ****\n");
printf("**** 0:退出游戏 ****\n");
printf("********************\n");
printf("请选择1或0:\n");
}
void game()
{
int r = rand() % 100 + 1;
int guess = 0;
int count = 10;//一共有count次猜数字的机会
printf("你一共有 %d 次机会来猜数字,数字范围在1~100之间\n",count);
while (count)
{
scanf("%d", &guess);
if (guess > r)
printf("猜大了,请再猜一次\n");
else if (guess < r)
printf("猜小了,请再猜一次\n");
else
{
printf("恭喜你,猜对了\n");
break;
}
count--;
printf("你还有 %d 次机会猜数字\n",count);
}
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,请输入1或0\n");
}
} while (input);
return 0;
}
以下是这个游戏的实际效果:
感谢大家的阅读,如果感兴趣的话可以给博主来个三连,谢谢~