在分析题目之间,我们先来了解几个库函数,这在实现猜数字游戏中起到非常重要的角色!
第一个是rand函数,rand函数是生成随机数的函数,生成随机数是我们猜数字游戏必不可少的,所以这个rand函数我们肯定需要利用到,接着这个rand函数怎么使用,我们通过cplusplus这个网站去查询rand函数的用法和作用,下面是比较详细的讲解,也比较好理解:

在这里我们可以看到rang的范围是0-RAND_MAX,那么这个RAND_MAX值是多少呢?在vs上输入RAND_MAX,然后右击鼠标转到定义,这个时候会出现这句话

这里有个0x7fff,这里我们通过计算器转换为十进制,我们可以知道最大值是32767,下面给大家展示其用法:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
int ret = rand();
printf("%d \n", ret);
}
return 0;
}
这就是生成随机数的用法,运行结果是:

从运行结果我们可以看出每次生成的数都是随机的,这正好符合我们猜数字游戏的需求,每一个数字都是不一样的!
但是会出现一个问题,我们进行猜数字游戏时,如果我要玩很多把的话,那问题就出现了,我们会发现第二次,第三次之后的每一把所生成的数字和之前的都是一样的,这样显然不符合我们游戏的一贯要求,我们玩游戏肯定需要每一把所猜的数字是不一致的,这种问题肯定在猜数字游戏中肯定是不行的,这样的话,咋们爱玩游戏的小伙伴没有一点游戏体验感,那么这个问题出在哪里呢?
其实问题出在这里,我们还需要调用srand函数,这是在rand函数中所说明的:

通过srand - C++ Reference (cplusplus.com)这个网站,我们知道srand函数的用法和用途,这是初始化随机数生成器。

#include<stdio.h>
#include<stdlib.h>
int main()
{
int i = 0;
srand(100);//初始化随机数
for (i = 0; i < 10; i++)
{
int ret = rand();//生成随机数
printf("%d \n", ret);
}
return 0;
}
但是我们又会发现一个问题,就是我们如果需要进行很多把游戏时,我们每进行一把游戏就要改变一次srand()函数,这个()里面的数,我们的随机数就会发生变化,我们通过运行代码可以发现100和200的不同,所生成的随机数也是不同的:

所以我们只要每次进行游戏,都需要改变srand函数,那么我们生成的数才会不断的发生变化,那么我们该如何解决这个问题?
这个时候,我们就要想到时间这个观念,因为我们的时间是在每时每刻都在随时发生变化。我们只需要让srand函数随着时间发生变化,那么我们生成的随机数也在不断的发生变化。
这个时候我要引入一个新的知识点,就是时间戳,时间戳不知道大家听没听过,我给大家简单的解释一下
时间戳:就是电脑此时此刻运行代码时间和计算机起始时间的一个差值
通过百度我们也可以知道时间戳

所以我们需要调用时间time这个函数,这里我们通过cplusplus可以看到time函数的参数是time_t型指针,返回值是time_t型:

但是我们并不需要time函数传入指针,所以我们传入NULL空指针就行,并且我们利用time函数在srand中,返回类型不是time_t型,我们知道srand函数的返回类型是unsigned int ,所以我们将time函数强制转换unsigned int 型,srand((unsigned int)time(NULL),这样我们就可以在不同时间里生成不同的随机数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int i = 0;
srand((unsigned int)time(NULL));//初始化随机数
for (i = 0; i < 10; i++)
{
int ret = rand();//生成随机数
printf("%d \n", ret);
}
return 0;
}
这样我们生成随机数就搞定了!
但是还是有个问题就是,我们如果在玩游戏过程中玩的太快的话,计算机时间戳可能没有转换的那么快,这个时候我们从运行结果中发现,两个数又重复了。

当然,解决这个小问题很简单,我们只需要把srand((unsigned int)time(NULL))放在主函数中,那么就不会出现这个问题了,放在主函数中我们仅仅需要调用一次就行,不用每次进行游戏都来调用,这样不论我们把游戏进行的多块我们的随机数都不会重复!
以上,我们就讲解完了猜数字游戏中必须使用到的函数,其中有rand函数,srand函数,time函数,还有需要使用到的时间戳,也希望我的讲解,各位小伙伴能够非常明白!
下面我们就来分析讲解我们的代码思路:
首先,我们肯定要创建一个菜单menu,从上面函数讲解过程中我们也可以发现,每次运行结果都伴随着菜单的存在,这个菜单大家都可以创建自己喜欢的,我创建的比较简单:
void menu()
{
printf("*******************************\n");
printf("*********** 1.paly ************\n");
printf("*********** 0.exit ************\n");
printf("*******************************\n");
}
1代表的是进入游戏,0代表的是退出游戏
我们在主函数中,设置随机数的生成器,并且在主函数中我们利用do while循环和switch语句进行判断你是否要进行游戏,这个里面大家要注意一些用法就行:
while(input)当input为0时,循环结束,退出游戏。这里面的game()是我们需要调用的函数
int main()
{
int input = 0;
//设置随机数生成器
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入你是否进入游戏:\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择失败请重新选择:\n");
}
} while (input);
}
接着我们调用game函数,进行游戏,在game函数中,我们要进行的是第一步生成随机数,第二步就是我们游戏的关键进行猜数字,当我们猜的数字小了,代码会提示小了,当我们猜的数字大了,代码会提示大了,直到我们猜对了结果,退出游戏。这里面需要利用到while循环进行猜数字的循环,同时还需要利用if ,else if语句进行判断你猜的数字是否正确,代码如下:
void game()
{
int guess = 0;
//1.生成随机数
int ret = rand()%100 + 1;
//printf("%d\n", ret);
//2.猜数字
while (1)
{
printf("请输入你要猜的数字:\n");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了,再猜猜\n");
}
else if (guess > ret)
{
printf("猜大了,再猜猜\n");
}
else
{
printf("恭喜你猜对了\n");
break;
}
}
}
这就是我们猜数字游戏的思路,大家认真的去看,会很快掌握的,下面我们把代码结合起来:
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
void menu()
{
printf("*******************************\n");
printf("*********** 1.paly ************\n");
printf("*********** 0.exit ************\n");
printf("*******************************\n");
}
void game()
{
int guess = 0;
//1.生成随机数
int ret = rand()%100+1;
//printf("%d\n", ret);
//2.猜数字
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;
//设置随机数生成器
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入你是否进入游戏:\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择失败请重新选择:\n");
}
} while (input);
}
代码的运行结果:

哈哈哈,本来每次我玩的时候都得五六次才可以才对,这次就三次就猜对了,希望大家和我一样那么顺利,一下就猜对了!
猜数字游戏总结:
对于猜数字游戏,我觉得其中所使用到的知识点很多,很适合大家用来练练,这样能够更加牢固的掌握知识点
这里面也有一些难点,比如一些函数的实现还是有一定的难度的,希望大家能够理解其中的知识点!
最后大家一定要动手去实践!