1. 电脑随机生成一个数字(1—100)
2. 玩家猜数字
3. 游戏每局结束后,可以选择是否继续玩或者退出。
void menu() // 这里我们定义一个不要返回值的 menu 函数来实现菜单的功能
{
printf("***********************\n");
printf("********1.Play*********\n"); // 选择 1 玩游戏;
printf("********0.Exit*********\n"); // 选择 0 退出游戏
printf("***********************\n");
}
游戏菜单做好后,我们需要进行选择玩游戏或者退出游戏,并且实现游戏猜数字的部分,代码如下:
void game() // 定义 game函数 实现游戏部分
{
int ret = rand(); // 调用 rand 函数来随机生成一个伪随机数
printf("%d\n", ret);
/*int guess = 0; // 先注释掉这句跟 while循环部分,暂且先不猜只随机生成数字
while (1)
{
printf("猜数字:\n");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了,请重新猜\n");
}
else if (guess > ret)
{
printf("猜大了,请重新猜\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}*/
}
int main()
{
int input = 0; // 定义一个整型变量来接收我们从键盘输入的选择
do
{
menu(); // 菜单的实现
printf("请选择:");
scanf("%d", &input); // 输入数字选择(1/0) 1—玩游戏;0—退出游戏
switch (input)
{
case 1:
game(); // 选择 1 玩游戏定义 game函数
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择!\n"); // 输入非选项数字
break;
}
} while (input); // ()里面输入 0 为假退出游戏不在继续选择, 输入非 0 为真进入循环继续选择
return 0;
}
写好代码之后,那开始玩。( 那为什么每局随机生成的数字一样呢?)
在我们仔细阅读 rand 函数之后会发现,rand 函数可以随机生成一个伪随机数。
rand 生成伪随机数的范围是 0 — RAND_MAX,但 rand 函数有一个缺陷,每局生成的伪随机数是一样的,那我们玩一局结束后把随机生成出来的数都记下来,那游戏还有什么意思?
所以这里需要调用了一个 srand 函数,srand 函数需要在调用 rand 函数之前被调用。
那 srand 函数作用是什么呢?
那如图我们传给它一个整型参数:
(这里需要注意 srand函数的位置是在 game函数里面)
输出结果如下:
我们发现随机生成的数字都一样,那我们改一下 srand 函数里面的参数会是怎么样?
我们改变里面的整型参数,重新给一个整型参数,生成的随机数还是一样。感兴趣的可以试一下,我就不放结果了。
那是不是每次给 srand 一个一直变化的整数我们就可以生成一个随机数?
这里就要引用一个时间戳,时间是一直变化的,而把它给 srand 每次生成的数字就随机了。
那时间戳是什么?
时间戳就是自己现在的时间相较于计算机起始时间之间的差值(秒) (计算机起始时间是 1970.01.01)
所以我们可以把时间戳传给 srand函数,C语言也提供了这样的函数 —— time ,它会返回一个时间戳。
下面就是 time函数的介绍:
如果我们不想用参数,不把时间戳存起来,我们可以给它传空指针(NULL)
还有一种办法是 time 会返回时间戳,我们只要接收这个返回值就可以了。
根据 srand 函数的定义,我们可以把 time 传给 srand,代码如下:
(这里注意 srand函数的位置发生了变化,放在了主函数里面)
那为什么这次放在了主函数里?
因为当我们开始游戏之后,快速的获取随机数的时候会发现生成的随机数有一样的数(输出结果省略,有兴趣或者疑问可以尝试自己做一下看是否一样)
如果放在 game 里面我们每次程序运行起来获取随机数,相当于调用设置起点,重新起始开始算起。
所以调用 rand 之前要调用 srand ,但是不能被频繁调用,只需在程序运行起来调用一次就可以。
所以 srand 不能放在 game 里,应该放在主函数里面。
最后完整正确代码如下:
#include <stdio.h>
#include <stdlib.h> // srand 头文件
#include <time.h> // time 头文件
void menu() // menu — 游戏菜单
{
printf("***********************\n");
printf("********1.Play*********\n");
printf("********0.Exit*********\n");
printf("***********************\n");
}
void game() // 猜数字的实现
{
int ret = rand() % 100 + 1; //给生成的随机数 %100+1,任何数 %100 结果为 0-99,再 +1 就是 1-100
int guess = 0;
while (1) // 猜错可以一直猜,直到猜对 break 跳出死循环
{
printf("猜数字:\n");
scanf("%d", &guess);
if (guess < ret) // 猜的数字与随机生成的数字相比较
{
printf("猜小了,请重新猜\n");
}
else if (guess > ret)
{
printf("猜大了,请重新猜\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL)); // srand 函数放在主函数只需调用一次
do
{
menu();
printf("请选择:");
scanf("%d", &input); // 输入选择:玩游戏 or 退出游戏
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择!\n");
break;
}
} while (input);
return 0;
}
以上就是猜数字游戏需要注意的地方,以及一些讲解。