准备工作
猜数字游戏,顾名思义就是系统生成一个随机数,玩家需要在规定时间内猜出正确答案。那我们思考以下问题:
1.随机数如何生成?数字的范围怎么确定的?
2.如何规定玩家的最大输入次数?
3.内部的代码是怎样进行判断运行的?
随机数的生成
假设我们规定这个游戏中的随机数产生于1到100之间。想获得一个随机数,就需要用到rand函数。补充一点:如果我们需要使用rand函数的话,必须引用新的头文件stdlib.h。那我们先来试用一下:
不难发现,虽然生成的数字式随机的,但是前后两次生成的数字是一模一样的,假如玩家想多次进行游戏,显然这样的随机数是不行的,每次的最终结果都会一样。为什么会这样呢?因为rand生成一个随机数的原理是里面有一个生成随机数的种子,而rand函数运行时默认的种子为1。自然随机数也就不会改变了。那么我们该如何解决这样的困难呢?
再引入了一个srand函数,用于初始化随机数,相当于在rand里埋下不同的种子,最终生成的随机数就会不同。
void srand (unsigned int seed);
那我们思考一下,什么东西是一直在变化的?不难想到是时间吧。恰好在c语言中有一个函数就叫做time。原型:
time_t time(time_t*timer)
如果timer是NULL,time返回的时间差就叫做时间戳。同时,使用该函数时也需要定义一个新的头文件:time.h。带入之前的代码有:
可以发现,前后两次打印出来的随机数是不同的,至此,我们便完成了随机数生成。
随机数范围设置
0到99:
rand()%100 //余数的范围是0到99
1到100:
rand()%100+1; //0到99后余数值各加1
100到200:
100+rand()%(200-100+1) //余数的范围是0到100,加上100后变成100到200
以此类推,a到b:
a+rand%(b-a+1)
ok,范围的问题解决了
代码实现
定义game函数
void game();
{
int r = rand() % 100 + 1;
int guess = 0;
int count = 8;
while(count)
{
printf("你还有%d次机会\n",count);
scanf("%d",&guess);
if (r < guess)
{
printf("猜小了\n");
}
else if(r>guess)
{
printf("猜大了\n");
}
else
{
printf("猜对啦!\n");
break;
}
count--;
}
if (count == 0)
{
printf("次数耗尽,挑战失败。正确答案是%d\n", r);
}
}
利用多次循环,判断是否猜对。用来输出游戏的结果,游戏的内核就已经基本实现,接下来我们要做一个菜单,询问玩家是继续play还是选择退出游戏。
菜单的实现
直接打印要输出的内容就好了。
判断是否进行下一次游戏
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择是否继续进行游戏:");
scanf("%d",&input);
switch (input)
{
case 1:game();
break;
case 0:printf("游戏结束\n");
break;
default:printf("输入错误,请重新选择!");
break;
}
} while (input);
return 0;
}
利用上一期讲的do while循环可以很好的执行这个程序。srand函数定义时间戳,给rand函数埋下了不同随机数的种子。至此,所有的代码编译完成,接下来是完整代码。
完整代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void game()
{
int r = rand() % 100 + 1;
int guess = 0;
int count = 8;
while(count)
{
printf("你还有%d次机会\n",count);
scanf("%d",&guess);
if (r < guess)
{
printf("猜大了\n");
}
else if(r>guess)
{
printf("猜小了\n");
}
else
{
printf("猜对啦!\n");
break;
}
count--;
}
if (count == 0)
{
printf("次数耗尽,挑战失败。正确答案是%d\n", r);
}
}
void menu()
{
printf("***********输入1继续游戏*********\n");
printf("***********输入0退出游戏*********\n");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择是否继续进行游戏:");
scanf("%d",&input);
switch (input)
{
case 1:game();
break;
case 0:printf("游戏结束\n");
break;
default:printf("输入错误,请重新选择!");
break;
}
} while (input);
return 0;
}
感兴趣的小伙伴可以自己上手试试,可以让我们更好的理解循环语句的使用哦。