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

猜数字游戏的实现内容:
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;
}

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

编写一个猜数字游戏程序。_第1张图片

在我们仔细阅读 rand 函数之后会发现,rand 函数可以随机生成一个伪随机数。
编写一个猜数字游戏程序。_第2张图片
rand 生成伪随机数的范围是 0 — RAND_MAX,但 rand 函数有一个缺陷,每局生成的伪随机数是一样的,那我们玩一局结束后把随机生成出来的数都记下来,那游戏还有什么意思?
所以这里需要调用了一个 srand 函数,srand 函数需要在调用 rand 函数之前被调用。
编写一个猜数字游戏程序。_第3张图片

 那 srand 函数作用是什么呢?

编写一个猜数字游戏程序。_第4张图片

那如图我们传给它一个整型参数:
(这里需要注意 srand函数的位置是在 game函数里面)
编写一个猜数字游戏程序。_第5张图片
输出结果如下:

 编写一个猜数字游戏程序。_第6张图片

我们发现随机生成的数字都一样,那我们改一下 srand 函数里面的参数会是怎么样?
我们改变里面的整型参数,重新给一个整型参数,生成的随机数还是一样。感兴趣的可以试一下,我就不放结果了。
那是不是每次给 srand 一个一直变化的整数我们就可以生成一个随机数?
这里就要引用一个时间戳,时间是一直变化的,而把它给 srand 每次生成的数字就随机了。
那时间戳是什么?
时间戳就是自己现在的时间相较于计算机起始时间之间的差值(秒) (计算机起始时间是 1970.01.01)
编写一个猜数字游戏程序。_第7张图片
所以我们可以把时间戳传给 srand函数,C语言也提供了这样的函数 —— time ,它会返回一个时间戳。
下面就是 time函数的介绍:
编写一个猜数字游戏程序。_第8张图片
如果我们不想用参数,不把时间戳存起来,我们可以给它传空指针(NULL)
还有一种办法是 time 会返回时间戳,我们只要接收这个返回值就可以了。
根据 srand 函数的定义,我们可以把 time 传给 srand,代码如下:
(这里注意 srand函数的位置发生了变化,放在了主函数里面)
编写一个猜数字游戏程序。_第9张图片
那为什么这次放在了主函数里?
因为当我们开始游戏之后,快速的获取随机数的时候会发现生成的随机数有一样的数(输出结果省略,有兴趣或者疑问可以尝试自己做一下看是否一样)
如果放在 game 里面我们每次程序运行起来获取随机数,相当于调用设置起点,重新起始开始算起。
所以调用 rand 之前要调用 srand ,但是不能被频繁调用,只需在程序运行起来调用一次就可以。
所以 srand 不能放在 game 里,应该放在主函数里面。
最后完整正确代码如下:
#include 
#include  // srand 头文件
#include    // 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;
 }

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

你可能感兴趣的:(C语言,游戏程序,c语言,c++)