0
点赞
收藏
分享

微信扫一扫

编写一个猜数字游戏程序。

zhoulujun 2022-01-20 阅读 55

猜数字游戏的实现内容:

1. 电脑随机生成一个数字(1—100)

2. 玩家猜数字

  如果玩家猜小了,就提示猜小了。

  如果玩家猜大了,就告提示大了。

  如果玩家猜对了,就提示猜对了。

3. 游戏每局结束后,可以选择是否继续玩或者退出。

我们开始先做一个游戏主页菜单,菜单的选择有玩游戏或者退出游戏,代码如下:

void menu()  // 这里我们定义一个不要返回值的 menu 函数来实现菜单的功能
{
        printf("***********************\n");
        printf("********1.Play*********\n");  //  选择 1 玩游戏;
        printf("********0.Exit*********\n");  //  选择 0 退出游戏
        printf("***********************\n");
}

游戏菜单做好后,我们需要进行选择玩游戏或者退出游戏,并且实现游戏猜数字的部分,代码如下:

void game()  // 定义 game函数 实现游戏部分
{    
        int ret = rand(); // 调用 rand 函数来随机生成一个伪随机数
        printf("%d\n", ret);
         /*int guess = 0;  // 先注释掉这句跟 while循环部分,暂且先不猜只随机生成数字
        while (1)
        {
               printf("猜数字:\n");
               scanf("%d", &guess);
               if (guess < ret)
               {
                      printf("猜小了,请重新猜\n");
               }
               else if (guess > ret)
               {
                      printf("猜大了,请重新猜\n");
               }
               else
               {
                      printf("恭喜你,猜对了\n");
                      break;
               }
        }*/
}

int main()
{
        int input = 0; // 定义一个整型变量来接收我们从键盘输入的选择
        do
        {
               menu();     // 菜单的实现
               printf("请选择:");
               scanf("%d", &input); // 输入数字选择(1/0) 1—玩游戏;0—退出游戏
               switch (input)
               {
               case 1:
                      game(); // 选择 1 玩游戏定义 game函数
                      break;
               case 0:
                      printf("退出游戏\n");
                      break;
               default:
                      printf("选择错误,重新选择!\n"); // 输入非选项数字
                      break;
               }
        } while (input); // ()里面输入 0 为假退出游戏不在继续选择, 输入非 0 为真进入循环继续选择
        return 0;
}

写好代码之后,那开始玩。( 那为什么每局随机生成的数字一样呢?)

在我们仔细阅读 rand 函数之后会发现,rand 函数可以随机生成一个伪随机数。

rand 生成伪随机数的范围是 0 — RAND_MAX,但 rand 函数有一个缺陷,每局生成的伪随机数是一样的,那我们玩一局结束后把随机生成出来的数都记下来,那游戏还有什么意思?

所以这里需要调用了一个 srand 函数,srand 函数需要在调用 rand 函数之前被调用。

 那 srand 函数作用是什么呢?

那如图我们传给它一个整型参数:

(这里需要注意 srand函数的位置是在 game函数里面)

输出结果如下:

 

我们发现随机生成的数字都一样,那我们改一下 srand 函数里面的参数会是怎么样?

我们改变里面的整型参数,重新给一个整型参数,生成的随机数还是一样。感兴趣的可以试一下,我就不放结果了。

那是不是每次给 srand 一个一直变化的整数我们就可以生成一个随机数?

这里就要引用一个时间戳,时间是一直变化的,而把它给 srand 每次生成的数字就随机了。

那时间戳是什么?

时间戳就是自己现在的时间相较于计算机起始时间之间的差值(秒) (计算机起始时间是 1970.01.01)

所以我们可以把时间戳传给 srand函数,C语言也提供了这样的函数 —— time ,它会返回一个时间戳。

下面就是 time函数的介绍:

如果我们不想用参数,不把时间戳存起来,我们可以给它传空指针(NULL)

还有一种办法是 time 会返回时间戳,我们只要接收这个返回值就可以了。

根据 srand 函数的定义,我们可以把 time 传给 srand,代码如下:

(这里注意 srand函数的位置发生了变化,放在了主函数里面)

那为什么这次放在了主函数里?

因为当我们开始游戏之后,快速的获取随机数的时候会发现生成的随机数有一样的数(输出结果省略,有兴趣或者疑问可以尝试自己做一下看是否一样)

如果放在 game 里面我们每次程序运行起来获取随机数,相当于调用设置起点,重新起始开始算起。

所以调用 rand 之前要调用 srand ,但是不能被频繁调用,只需在程序运行起来调用一次就可以。

所以 srand 不能放在 game 里,应该放在主函数里面。

最后完整正确代码如下:

#include <stdio.h>
#include <stdlib.h> // srand 头文件
#include <time.h>   // time 头文件
 void menu()    // menu — 游戏菜单
 {
     printf("***********************\n");
     printf("********1.Play*********\n");
     printf("********0.Exit*********\n");
     printf("***********************\n");
 }
 void game()   // 猜数字的实现
 {
     int ret = rand() % 100 + 1; //给生成的随机数 %100+1,任何数 %100 结果为 0-99,再 +1 就是 1-100
     int guess = 0;
     while (1)  // 猜错可以一直猜,直到猜对 break 跳出死循环
     {
         printf("猜数字:\n");
         scanf("%d", &guess);
         if (guess < ret)  // 猜的数字与随机生成的数字相比较
         {
             printf("猜小了,请重新猜\n");
         }
         else if (guess > ret)
         {
             printf("猜大了,请重新猜\n");
         }
         else
         {
             printf("恭喜你,猜对了\n");
             break;
         }
     }
 }
 int main()
 {
     int input = 0;
     srand((unsigned int)time(NULL)); // srand 函数放在主函数只需调用一次
     do
     {
         menu();
         printf("请选择:");
         scanf("%d", &input); // 输入选择:玩游戏 or 退出游戏
         switch (input)
         {
         case 1:
             game();
             break;
         case 0:
             printf("退出游戏\n");
             break;
         default:
             printf("选择错误,重新选择!\n");
             break;
         }
     } while (input);
     return 0;
 }

以上就是猜数字游戏需要注意的地方,以及一些讲解。

举报

相关推荐

0 条评论