游戏要求:
1、电脑自动生成-~100的随机数
2、玩家猜数字,猜数字的过程中,根据猜测数据的大小给出猜大了或猜小了的反馈,直到猜对,游戏结束
1、随机数生成
要想完成猜数字游戏,首先得产生随机数。
1.1rand
C语言提供了一个函数rand,这个函数是可以生成随机数的,函数原型如下:
int rand(void)

rand函数会返回一个伪随机数,这个随机数的范围是在0~RAND_MAX之间,,这个RAND_MAX的大小是依赖编译器实现的,但是大部分编译器上是
32767
使用rand函数需要包含一个头文件:stdlib.h

调用5次rand函数,观察生成随机数的结果:
代码:
cpp
//rand函数生成的随机数是伪随机数
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
第一次调用:

第二次调用:

第三次调用:

第四次调用:

第五次调用:

通过上述示例可以发现,以此运行产生的两个随机数是相对随机的,但是下一次运行程序生成的结果是和上一次程序生成的结果是一模一样的。
事实上,rand函数生成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法生成的随机数。真正的随机数是无法预测下一个值是多少的。而rand函数是对一个叫"种子"的基准值进行运算生成的随机数。
而上面每次运行程序产生的随机数序列是一样的,那是因为rand函数生成随机数的默认种子是1.如果要生成不同的随机数,就要使种子进行变化。
注意:
真正的随机数是无法预测的,是随机生成的。
伪随机数是通过算法生成的,不是随机生成的。
1.2 srand
使用srand函数需要包含头文件:stdlib.h
C语言种提供了一个函数srand,是用来初始化随机数的生成器的,srand函数原型如下:
void srand(unsigned int seed);

程序中在调用rand函数之前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数的种子,只要种子在变化,那么每次生成的随机数序列也就变化起来了。
也就是说srand的种子,即:srand函数的参数seed值如果是随机的,那么rand函数就可以生成随机数;在生成随机数的同时又需要一个随机的种子seed,这似乎矛盾了(因为:我们想让rand函数生成真的随机数,但是这时有需要一个随机数种子),为此引入了time函数
注意:
在1.1中我提到了:而上面每次运行程序产生的随机数序列是一样的,那是因为rand函数生成随机数的默认种子是1.如果要生成不同的随机数,就要使种子进行变化。
代码举例:
cpp
#include<stdio.h>
#include<stdlib.h>
int main()
{
//srand(1);//这句话不写时,让rand()生成随机数时,默认调用的就是srand(1)
printf("%d\n", rand());
return 0;
}
1.3time函数
在程序中我们一般是使用程序运行的时间作为种子的,因为时间每时每刻都在发生变化。
在C语言中有一个函数time,就可以获得这个时间,time函数原型如下:
time_t time (time_t* timer)

time函数会返回当前日历时间,返回的是1970年1月1日0时0分0秒到现在程序运行时间的差值,单位是秒。
time函数返回的类型是time_t类型的,time_t类型本质上其实就是32位或者64位的整型类型。
time函数的参数time如果是非NULL指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。
如果timer是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。
计算时间戳的网站:时间戳(Unix timestamp)转换工具 - 在线工具

注意:使用time函数的时候需要包含头文件time.h
对于上述的理解,如果只是让time函数返回时间差值(即:时间戳),我们就可以这样写:
time(NULL)
那么生成随机数的代码就可以该写成:
代码:
cpp
//生成真正随机数的代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{ //使用time函数设置种子,因为srand参数类型是unsigned int类型,
//我们可以将time函数的返回值强制类型转换一下
srand((unsigned int)time(NULL));
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
第一次运行:

第二次运行:

从上述两次运行的结果来看,每次运行的结果各不相同,实现了真正意义上的随机数生成
1.4设置随机数的范围
如果我们要生成0~99之间的随机数,方法如下:
rand()%100;//余数范围是0~99
那么要生成1~100之间的随机数可以这样写:
1+rand()%100;//余数范围是1~100
如果要生成100~200之间的随机数,可以这样写:
100+rand()%(200-100+1);//因为rand()%(200-100+1)范围是0~100,那么加上100后,就是100~200
如果要生成a~b之间(a<b)之间的随机数),方法为:
a+rand()%(b-a+1);
2、猜数字游戏实现:
代码:
cpp
//猜数字游戏实现
#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 num = 1 + rand() % 100;//生成随机数
int guess = 0;//要猜的数字
while (1)
{
printf("请输入您要猜的数字:\n");
scanf("%d", &guess);
if (guess > num)
{
printf("猜大了\n");
}
else if (guess < num)
{
printf("猜小了\n");
}
else
{
printf("恭喜您,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
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;
}
猜数字结果示例:
