【C语言】猜数字游戏

目录

实现逻辑

整体框架设计

main函数和menu()函数

game()函数

逻辑梳理

生成随机数

种子的获取

控制随机数的大小范围

设置可猜的机会数

game()函数代码:

完整代码参考


小时候我们或许都和小伙伴玩过一个游戏,一个人心里默念一个数字,让另一个人来猜这个数字是几,猜完后告诉他猜大了、猜小了或者猜对了。那么现在我们可以用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语言实现就已讲解结束, 希望大家在发现错误后可以向我反馈,共同进步。

  • 37
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值