目录
小时候我们或许都和小伙伴玩过一个游戏,一个人心里默念一个数字,让另一个人来猜这个数字是几,猜完后告诉他猜大了、猜小了或者猜对了。那么现在我们可以用C语言来模拟这个游戏,找回一点童年乐趣。
实现逻辑
提炼这个游戏的逻辑(或者说具体要用代码做的事)就是:生成1~100的一个随机数字,让玩家去猜是几,可以猜很多次,每一次给出反馈:猜大了、猜小了或者猜对了。整个游戏可以循环地玩,不止猜一次。
整体框架设计
分为三个主要部分,一部分就是main函数,保持简洁;另一部分从main函数中拆分出来作为函数menu(),专门负责打印游戏目录,因为可以循环玩游戏可能不止一次需要打印函数;还有一部分作为函数game(),因为玩游戏可能也不止一次。
main函数和menu()函数
根据以上的整体框架设计,我们便可以很快写出main函数和menu函数:
void menu()
{
printf("*********************************\n");
printf("*********** 1.玩游戏 ************\n");
printf("*********** 0.退出游戏 **********\n");
printf("*********************************\n");
}
int main()
{
int input=0;//用来让玩家输入选择
do//可以先直接打印一次游戏菜单
{
menu();
printf("请选择\n");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;//不要忘记,否则会连着后面的情况一起输出
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,重新输入");
break;
}
}while(input);//如果input为0说明不想玩游戏,刚好可以退出循环
game()函数
逻辑梳理
这个函数就是具体游戏过程的实现函数,在这个函数中要实现的是生成随机数,然后循环让玩家猜、对比、反馈这个过程。
生成随机数
生成随机数需要用到rand()函数,使用该函数前要包含的头文件是stdlib.h,rand()可以生成0~RAND_MAX之间的一个随机数,RAND_MAX是stdlib.h中定义的一个整数,它与系统有关。
但其实rand()生成的是伪随机数,并不是真正意义上,即不可预测的随机数。为什么这么说呢?举个例子,下图中打印四个随机数,但其实每次重新执行都是这四个数,可见并没有真正做到随机。
为了每次执行能生成一个新序列的随机值,通常通过随机数生成器提供一粒新的随机种子(理解这个种子,可以联想Minecraft里的种子,异曲同工)。函数srand()称为随机数生成器的初始化器(或者初始化函数),可以为随机数生成器播撒种子,它的头文件也是stdlib.h。种子不同,rand()才能产生不同的随机数序列。
所谓随机数,是rand()和srand()配合,通过一定的方式模拟的随机。
srand()的原型是void srand(unsigned seed),参数unsigned seed是随机数生成器的初始值(种子值),如果在调用srand()前调用rand(),会默认以1作为seed调用srand产生相同的序列。任何大于1的种子值都会将rand随机数产生的序列重新设定一个起始点。
种子的获取
总之,如果能让种子是随机的,那么rand()就能产生想要的随机数,为了实现这一点,可以使用time()函数。time()函数会返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t类型本质上其实就是32位或者64位的整型类型。
time()函数的原型是time_t time(time_t* timer)。这个函数所需的头文件是time.h,如果timer是空指针NULL,直接返回当前时间;如果是非NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。 time函数返回的这个时间差也被叫做:时间戳。
总之,可以使rand()生成理想的随机数的代码如下:
srand((unsigned int)time(NULL));//要加上(unsigned int)进行强制类型转换。
注意:srand函数不需要频繁调用,程序中调用⼀次就够了。所以直接将这句代码写在main函数中就行。
控制随机数的大小范围
因为要产生的是1~100间的随机数,所以还要对rand()得到的随机数进行处理,我们知道一个数mod100的余数范围在0~99之间,所以rand()%100的范围是0~99,rand()%100+1的范围就是1~100。
设置可猜的机会数
为了让游戏更生动,每次选择玩猜数字游戏,可以设置一个猜的机会数,用完就提示游戏失败,退出游戏。并且每轮猜测可以提示还剩几次机会。
并不难想到,我们可以设置一个变量count,如果给五次机会,就让count=5,只要在每一轮循环结束时count--就行。
game()函数代码:
到这一步,我们就可以得出game()函数的具体代码了:
void game()
{
int r=rand()%100+1;//设置随机数r
int guess=0;//用来存放玩家的猜测值
int count=5;//给的猜测机会数
printf("猜数字游戏开始,你有5次机会\n");
while(count)//count比1大才有必要继续,否则已经耗尽机会数
{
printf("你还有%d次机会\n",count);
scanf("%d",&guess);
if(guess<r)
printf("你猜小了\n");
else if(guess>r)
printf("你猜大了\n");
else
{
printf("恭喜你猜对了!\n");
break;//猜对了要记得退出循环
}
count--;//能运行到这一步说明并没有退出循环也就是没猜对,所以机会要减1
}
if(count==0)//说明5次全猜错
printf("你失败了,正确答案是%d\n",r);
}
完整代码参考
这里给出我的完整代码参考:
在vs2022上运行的效果:
至此,猜数字游戏的C语言实现就已讲解结束, 希望大家在发现错误后可以向我反馈,共同进步。