猜数字游戏是我们日常生活中家喻户晓的游戏,那么我们有没有想过,这么有趣的一个游戏,在c语言中是如何表达出来的呢?让我们一起往下看:
#include<stdio.h>
void menu()
{
printf("****************************\n");
printf("******** 1.play 0.exit******\n");
printf("****************************\n");
}
int main()
{
int input = 0;
do
{
menu();(menu()、printf、scanf一定要放在循环内)
printf("请选择\n");
scanf("%d",&input);
switch(input)
{ case 1:
printf("猜数字\n")
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入错误,请重新选择\n");
break;
}
}while(input);
}
首先,我们采用do....while循环,以确保程序至少可以运行一次。当我们进入循环后,就等于我们进入了游戏界面,因此,进入后的第一件事就是打印菜单menu()以供玩家选择,菜单中有0,1两个选项,因此我们需要创建一个变量input作为scanf函数的参数以供玩家输入数字,做出选择。当玩家做出选择以后,每种选择就对应着不同的结果,这时,我们就要用到switch case语句,switch(input)用于判断玩家做出了那种选择,而case:语句则对应着不同选择下不同结果,其中,若玩家输入1,则进入game()函数,开始猜数字游戏。若玩家输入0,则为退出游戏,若玩家输入的数非0非1,则进入default:语句,需要玩家重新输入。代码最后的while中,选择以input作为参数是很有讲究的,若玩家输入1,结束猜数字游戏后,break跳出,因为input == 1,所以条件为真,while循环,玩家重新回到菜单界面,选择继续玩游戏或者退出。若input输入为0,则while中条件为假,程序停止运行,实现退出游戏。若输入的input非0非1,则与第一种情况相同。到此为止,我们已经完成了猜数字游戏的第一步,让我们看看结果:
如图所示,我们很完美的打印出了菜单,以及每个选项对应的结果。紧接着,我们只需要把case1:的擦猜数字游戏实现即可
想要实现猜数字游戏,那么要满足以下两个条件
生成1—100之间的随机数。
找一个数与随机数作比较。
在实现这个函数之前,我们来介绍几个库函数。
rand()随机数函数,他能生成0—2147483647之间的数字,头文件是<stdlib.h>。
若我们只使用这个随机数函数,能否实现游戏呢?让我们往下看看:
#include<stdio.h>
#include<stdlib.h>
void menu()
{
printf("****************************\n");
printf("******** 1.play 0.exit******\n");
printf("****************************\n");
}
void game()
{
int ret = 0;
ret = rand();
printf("%d\n",ret);
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择\n");
scanf("%d",&input);
switch(input)
{ case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入错误,请重新选择\n");
break;
}
}while(input);
}
结果如下:
看到这很多小伙伴肯定认为一个rand()函数就够用了,别急,我们再运行一次:
由图的结果我们可以发现,两次运行的结果一模一样,rand()产生的随机数一模一样,这又是为什么呢?其实,这里涉及到了起始点的问题,我们得介绍另一个新的函数——srand()函数
srand函数是随机数的初始化函数,用法是srand((unsigned int)seed)。
我们在game()函数中加入srand(1)看看会产生什么结果:
这时候我们又会发现,无论输入多少次1,结果始终是41.这是因为我们在srand()中输入的值是1,这是个常量,所以rand()函数只会被srand()函数初始化一次,因此输出值永远是41。为了改变这种情况,使rand()函数一直在被初始化,我们需要引入一个一直在变化的东西作为srand()函数的参数,让我们动脑想想我们生活中什么东西是随时在变化的呢?很好,是时间。因此我们引入time()函数。
time()函数是时间戳函数,它的起始时间是1970年1月1日,时间戳就是现在的时间减去起始时间。引用time()函数的头文件是<time.h>。
让我们加入time()函数后再试一次:
如图我们可以发现,虽然随机数的值一直在改变,但是相差并不大,几乎相等。这是因为srand()函数被放在了循环中,time()起始点一直在被改变且相差不大(每次选择时间过短,几乎无间隔),因此这种情况time()函数几乎为一个定值,和上一种情况类似,为了解决这种情况,我们将srand()函数放在循环外面,起始时间点只需要调用一次即可:
我们完美的解决了所有出现的问题,只剩下一个问题,如何使rand()函数产生1—100之间的数字呢?
我们不妨给rand()%100,因为任何数%100都产生1—99之间的值,我们再+1,即:
rand()%100+1
我们再试一次看看结果如何:
到目前为止,我们已经实现了这个游戏的大部分,只剩下最后找一个数与随机数作比较。这还是比较简单的部分,我们直接看最后代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
printf("****************************\n");
printf("******** 1.play 0.exit******\n");
printf("****************************\n");
}
void game()
{
int ret = 0;
ret = rand()%100+1;
int guess = 0;
while(1)
{
printf("请输入数字\n");
scanf("%d",&guess);
if(ret < guess)
printf("猜大了,请重新猜\n");
else if(ret > guess)
printf("猜小了,请重新猜\n");
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
srand((unsigned int )time(NULL));
int input = 0;
do
{
menu();
printf("请选择\n");
scanf("%d",&input);
switch(input)
{ case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入错误,请重新选择\n");
break;
}
}while(input);
}
切记,scanf,printf,menu()一定要放在循环内,因为玩家需要重复进行游戏或者重复进行选择。
注意函数与循环之间的配合,以及循环参数的选用!
文章到此结束,如有不对之处,请大佬们指正!