猜数小游戏的关键在于生成随机数
rand是生成随机数的函数int rand(void)(返回值为整形,无参数)头文件<stdlib.h>
RAND_MAX = 0x7fff(16进制) 换算成十进制的结果为32767,也就是rand生成的随机数的范围是在[0,32767]之间,但是使用rand函数会发现每次程序运行所生成的结果都是一样的
解决随机数每次都出现一样的问题
在使用rand函数之前需要使用srand函数去设置rang函数生成随机数
srand函数为设置随机起点,void srand(nusigned int seed),头文件<stdlib.h>
srand需要整形,假设为srand(6);
结果:
程序单次运行的结果都是是一样的
可以看出srand函数的也需要一个随机数,rand函数才能随之生成随机数,rand函数生成的随机数又需要srand函数来设置随机起点,而srand函数设置随机起点又需要随机函数!#¥%&*@!¥%¥ ……
显然,这种方法行不通,套娃会陷入死循环
所以这里是使用时间戳
时间戳 = 当前计算机的时间 - 计算机的起始时间1970/01/01 00:00:00=(xxxx)秒 使用时间戳来作为srand函数的随机起点,就可以让srand函数生成随机起点(好像是废话)
time函数,time_t time(time_t *timer),头文件<time.h>
time_t其实就是长整型
srand((unsigned int)time(NULL));
因为void srand(nusigned int seed)需要unsigned int参数,所以将time函数的值强制类型转换,转变成unsigned int,让srand的参数变成时间戳,srand就可以生成随机起点,rand随即生成随机数
至此随机数的生成问题解决了
#include
#include
#include
void menu()//定义menu函数
{
printf("#################################\n");
printf("#################################\n");
printf("### 1. play 0. exit ###\n");
printf("#################################\n");
printf("#################################\n");
}
//RAND_MAX 0x7fff-32767
void game()//定义game函数
{
int ret = 0;//随机数
int guess = 0;//猜数
printf("猜数字游戏开始^-^\n");
ret = rand() % 100 + 1;//生成随机数,rand取值范围[0,32767],模100再加上1后范围[1,100]
//printf("%d\n", ret);//打印随机数
while (1)//一直循环,直到最后else打印然后break跳出循环
{
scanf("%d", &guess);//输入猜数
if (guess > ret)//如果猜数大于随机数
{
printf("猜大了,再试一次\n:>");//打印
}
else if (guess < ret)//如果猜数小于随机数
{
printf("猜小了,再试一次\n:>");//打印
}
else//否则
{
printf("恭喜你,猜对了 ^-^\n");//打印
break;//并退出循环
}
}
}
int main()//主函数
{
int x=0;//选择数字
srand((unsigned int)time(NULL));//(unsigned int)强制类型转换,转换成srand需要的类型
//主函数中调用,不用放在game函数中每次都使用
//时间戳=当前计算机的时间减去计算机的起始时间1970/01/01 00:00:00=(xxxx)秒
//用时间戳设置随机数的生成起点
//time_t 本质上是长整型
do//执行循环
{
menu();//menu函数
printf("请输入数字选择:>");
scanf("%d", &x);//输入数字选择
switch (x)//1,play 2,exit
//switch选择语句从上往下执行遇到break跳出循环
{
case 1:
game();//game函数
break;//跳出
case 0:
printf("退出游戏");
break;//跳出
default:
printf("输入错误,请重新输入\n");
break;//跳出
}
} while (x);//非0即为真,当x属于case 1或default时x大于等于1,while继续循环。
//当x等于0时则为假,while结束循环。
return 0;
}