前言:大家好! 在学习完分支结构和循环结构后。我们可以来实现一些有趣的小游戏,而今天,我们就来实现猜数字游戏,那么就让我justin 来讲解下吧
猜数字要求如下:
1.电脑能自动生成1-100的随机数字(数字要求可以自己设定)
2.玩家在猜数字的游戏中,如果选择大了会提示 “猜大了” , 选择小了会提示 “ 猜小了 ” ,直到猜对正确的数字,游戏结束
3.可以设定猜数字的次数,提高游戏难度
在正式介绍猜数字游戏之前,需要介绍3个函数 rand函数 , srand函数, time函数
1.rand函数 需要包含头文件,如下:
#include
2.想要电脑自动生成随机数,就需要 使用一个函数为rand , 这个函数可以自动生成随机数,函数的使用,如下:
int rand (void);
但是!但是!但是!rand函数返回的随机数其实是伪随机数,这个伪随机数的范围是 0 ~ RAND_MAX之间, 是依赖于编译器实现的,大多数的编译器上是32767
3.我们可以来验证一下 rand 函数,让它给我们生成几个随机数
#include
#include
int main()
{
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
在这里我运行了2次,结果如下 , 我们发现 2次的运行结果是一模一样的 ,那可想而知 ,虽然rand 函数生成了 几个随机数, 但是我们每一次运行的结果都一样,而这就是伪随机数,而不是真正的随机数。这不是我们想要的结果
那如何才能实现真正的随机数呢,C语言提供了一个函数为 srand , 用来初始化随机数的生成器,使用如下:
void srand(unsigned int seed);
程序中在调⽤ rand 函数之前先调⽤ srand 函数,通过 srand 函数的参数seed来设置rand函数⽣成随 机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了
在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的,而time 函数,可以获得时间,time函数以及头文件,使用如下:
#include
time_t time(time_t * timer);
time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的 差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型。 time函数的参数 timer 如果是非NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存 中带回去。如果 timer 是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。时间戳(Unix timestamp)转换工具 - 在线工具 (tool.lu)
如果只想让time 返回时间戳,可以这样
time(NULL); //调用time函数的返回时间戳,这里没有返回值
也就是说time函数的时间是不断变化的,我们运用time函数,这样我们的随机值也是不断在变的,而这就是真正的随机值。
#include
#include
#include
int main()
{
// 使用time 函数的返回值设置种子
// 因为srand 的参数为 unsigned int 类型 ,
// 我们将time函数的返回值强制转换
srand((unsigned int)time(NULL)); //调用time函数的返回时间戳,这里没有返回值
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
运行结果
和之前的运行结果不同,随着时间的变化,随机数也变化 ,所产生的数字。这才是真正的随机数。
五.实现猜数字游戏
// 猜数字游戏
#include
#include
#include
void menu() // 菜单的打印
{
printf("***************\n");
printf("*** 1.play ***\n");
printf("*** 0.exit ***\n");
printf("***************\n");
}
void game() // 游戏的实现
{
int r = rand() % 100 + 1; // 因为要随机1-100的值,所以 %100的余数范围为0-99 , +1 范围才是 1-100
int guess = 0;
int count = 5; // 计时游戏次数为5次
while (count)
{
printf("你剩余次数:%d\n", count);
printf("请输入数字\n");
scanf_s("%d", &guess);
if (guess > r) // 如果猜的数字 大于 随机数 ,则反馈猜大了
{
printf("猜大了\n");
}
else if (guess < r) // 如果猜的数字 小于 随机数,则反馈猜小了
{
printf("猜小了\n");
}
else // 最后猜对正确的随机数 ,反馈猜对了
{
printf("恭喜你猜对了,数字为:%d\n", r);
}
count--; // 总共有5次机会,因为我们设置了5次,每猜一次 减一次,直到5次机会用完
}
if (count == 0) // 机会用完了提示,并且告诉随机数是多少
{
printf("很遗憾你的次数用完了,正确的数字为:%d\n", r);
}
}
int main()
{
srand((unsigned int )time(NULL)); // 随机数的生成
int input = 0;
do
{
menu(); // 实现菜单
printf("请选择:>");
scanf_s("%d", &input); // 选择输入选项
switch (input) // switch 来完成选项的选择
{
case 1:
game(); // 如果选择case 1 就play 玩游戏 , game()实现游戏
break;
case 0: // 如果选择case 0 就exit 退出游戏
printf("你选择退出\n");
break;
default: // 如果选择不是 以上两种 就提示 选择错误 请重新选择
printf("你选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
如果想要生成 a ~ b的值,方法:a + rand()%(b-a+1)
运行结果:
结尾
感谢大家的观看,希望可以帮助到大家