通过对一系列循环语句的学习,小编已经对循环语句的运用方法有一定的了解,那么今天小编就来尝试着做一个简单的猜数游戏,规则如下:
生成一个随机数(1~100),让玩家猜测这个数是多少,在玩家输入一个数后,若猜的数比随机数小,则显示“Too Small!”;若猜的数比随机数大,则显示“Too Big!”;若猜的数就是随机数,则显示“Good Guess!” 那接下来就跟着小编一起来设计这个游戏吧!
首先呢,我们需要知道怎样生成一个随机数。
随机数的生成需要使用一个叫做 rand 的函数,这个函数会基于一个基准值来生成一个伪随机值(伪:因为这个随机值是根据计算机的算法给出的,在一定程度上意味着它是可以预测的),而这个基准值是由一个叫种子(srand)的东西来控制的。看到这里是不是有点晕了呢?没关系,跟着小编的步伐,小编慢慢来解释给你听。
1、rand函数:它会从0~rand max(32767)中生成一个伪随机值
但是我们会发现,生成的值怎么都这么大,我们要的是(1~100)的数呀,诶,简单,我们对这个rand 施加一些“小魔法”,来,3,2,1,变!rand ()%100+1
2、srand 对 rand函数 的值的控制:我们先来看一下在程序中加入一个srand的方式
好了,清楚了加入srand的方式了之后,我们把这两张图对比一下,是不是发现他们生成的随机值是一样的,我们在上面提到过 rand 是基于一个由 srand 控制的基准值来生成随机值的,而当我们没有在函数中声明 srand 为多少时,都是默认它为 srand(1),所以这就致使上面两个程序生成的随机值是一样的了。
为了老铁们更好理解 srand 的效果,小编也把一个不同的 srand (以2为例)打印结果图放在这里了。
现在我们知道了 srand 可以对 rand 生成的随机值进行控制,那如果我们想让每次生成的随机值都不一样呢?
实际上也就是让 srand()这个括号中的值不一样,这个时候我们就可以通过一个叫time 的函数来实现它。time 可以显示时间戳(如下图),因为时间一直是在改变的,那么我们就可以用 srand(time)让括号中的值一直改变,为了符合编译器的编译逻辑,我们会把它写成:
srand((unsigned int)time(NULL))
注:使用 time 函数需要引用头文件 #include<time.h>
到这里是不是感觉CPU有点不够用了呢,哈哈哈,别着急,认识一个新东西是需要时间的,小编也是刚刚学习到这些知识。好了,这样的话我们对于这个游戏的设计算是走出新手村了,接下来,拥有新手村捡到的 rand、srand、time这些装备,我们就可以进入后面的关卡了。
接下来我们该怎样设计这个游戏呢?俗话说:“一口气吃不成一个胖子。”想要实现这个游戏的设计我们得一步一步来:
1、菜单部分(显示 play / exit)
2、游戏部分(运用 while 循环中间再嵌套 if 语句)
3、主函数部分(运用 switch 语句来选择 play / exit)
这样子我们的游戏就设计完成啦!
//简单的猜数游戏
#include<stdio.h>
#include<time.h>
void menu()
{
printf("*********************\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("*********************\n");
}
void game()
{
srand((unsigned int)time(NULL));
int yournumber = 0;
int number = rand(time)%100+1;
while (1)
{
printf("输入要猜的数字:>");
scanf("%d", &yournumber);
if (yournumber < number)
{
printf("Too Small!\n");
}
if (yournumber > number)
{
printf("Too Big!\n");
}
if (yournumber == number)
{
printf("Good Guess!\n");
break;
}
}
}
int main(void)
{
int input = 0;
menu();
printf("请选择:>");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
return 0;
}
来看一下小编替你们玩一局猜数字游戏吧!怎么样,是不是很有趣呢?
总结:今天这个猜数字游戏的设计对于初学者来说有一点点难度,我们从中认识了几个新朋友,
一个是 rand(生成伪随机数的),一个是 srand (控制 rand 的值的),
一个是 time (表示时间戳的),刚接触可能还不熟,以后多见几面就可以跟它们成为好朋友了。
猜数字游戏考察了分支结构、循环语句、条件关系等知识,最重要的是它告诉了我们在解决一个复杂问题时可以进行对这个问题进行拆分,解决这一类问题就像拼一个玩具,先把它的零部件找齐,然后进行组装,就可以得到你想要的程序啦!
好了,时间也不早了,今天的学习就到这里吧!晚安,老铁们!