【C语言】猜数字游戏详解

目录

前言

游戏要求

游戏的代码实现

1.1 随机数的生成

1.2 函数代码框架

1.3 代码源码

1.4 难度升级

结语


前言

本文的猜数字小游戏所运用到的知识都十分基础,分支循环,自定义函数及其调用,唯一一个难点就是生成随机数,这部分我会尽量以通俗简单的话去讲解

游戏要求

1. 让电脑自动生成一个随机数,范围是 1 ~ 100

2. 玩家猜数字,根据猜测数字的大小给出 “大了” 或者 “小了” 的反馈,直到玩家猜中数字,游戏结束

游戏的代码实现

1.1 随机数的生成

在C语言中,有一个叫做 rand 的函数,它的头文件为: stdlib.h,在使用的时候不要忘记写头文件哦。它能够生成一个伪随机数,为什么是伪随机呢,这就得深入了解一下 rand 函数了。

伪随机是通过某种算法生成的,真正的随机数是无法预测下一个值是多少,而 rand 函数是对一个叫“种子”的基准值进行运算生成的随机数,“种子”一旦确定,rand 生成的数是确定的。所以,如果我们想要生成真正的随机数,就必须得让“种子”发生变化,所以我们得再调用 srand 函数来改变“种子”,在C语言中,我们一般用 time 函数来做“种子”,它可以返回当前的日历时间,时间每时每刻都会发生变化,十分适合“种子”所需的随机性,而使用 time 函数时需要包含头文件:time.h

随机数生成的这个过程类似套娃,随机伪随机数,那就是随机数了,具体实现如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    int main()
    {
        //使用time函数的返回值设置种子
        //因为srand的参数是unsigned int类型,使用我们需要强制转换time返回值的类型
        srand((unsigned int)time(NULL));
        printf("%d\n", rand());
        printf("%d\n", rand());
        printf("%d\n", rand());
        return 0;
    }

运行的两次结果如下:

    

                      (第一次运行结果)                                                      (第二次运行结果)

两次结果不一样且随机,这样就能够得到我们所要的随机数了 

1.2 函数代码框架

玩游戏嘛,肯定要一个游戏菜单,让玩家选择能够选择开始或结束游戏,要想显示游戏菜单,我们可以先自定义一个菜单函数 menu( ),它的作用是显示菜单,因此无需返回任何值。代码如下:

    //游戏菜单
    void menu( )
    {
        printf("   猜数字游戏   \n");
        printf("===============\n");
        printf("=== 1. play ===\n");
        printf("=== 0. exit ===\n");
        printf("===============\n");
    }

接下来就是游戏主体部分,即猜数字的玩法实现。我们可以定义一个 game( ) 函数,它和上面的菜单函数 menu( )一样,无需返回任何值。在函数里面,我们需要把生成的随机数限定在 1 ~ 100 的范围内,这就需要我们限制生成的随机数。我们可以用 100 取余随机数,这样就能得到随机数的十位和个位,再 + 1 ,就能确保余数的范围在  1 ~ 100 ,做法如下:

        rand ( ) % 100 + 1 // 此时就能生成 1 ~ 100 之间的随机数

        如果想要生成 a ~ b 之间的随机数,公式如下:

        a + rand ( ) % (b - a + 1) // 此时就能生成 a ~ b 之间的随机数

完成了随机数的生成,我们就要接收玩家输入的数字,并将它跟随机数进行比较大小,如果大于随机数,就显示 “猜大了” 来提醒玩家,如果小于随机数,就显示 “猜小了” 来提醒玩家,直至玩家猜中正确的数字,游戏结束。以上都是 game( ) 函数里要实现的功能,代码如下:

    //游戏主体
    void game()
    {
        int RanNum = rand() % 100 + 1;
        int guess = 0;;
        while (1)
        {
            printf("请输入想猜的数字 —— ");
            scanf("%d", &guess);
            if (guess > RanNum)
            {
                printf("猜大了\n");
            }
            else if (guess < RanNum)
            {
                printf("猜小了\n");
            }
            else
            {
                printf("恭喜你,猜中了!\n");
                break;
            }
        }
    }

接下来就是主函数的代码思路了。在程序的开始,我们需要先定义一个变量 input,让玩家选择能够选择开始或结束游戏,为 1 则开始游戏,为 0 则退出游戏。如果玩家选择开始游戏,我们就可以进行下一步—生成随机数,即 srand((unsigned int)time(NULL)),然后就可以开始游戏啦。在这里我会使用 do - while 循环,它可以先生成菜单,再来判断,十分适合该场景。

接下来,我们可以用 switch 语句来判断玩家输入的是 “1” 还是 “0”,为 1 则开始游戏,为 0 则退出游戏,如果输入其他值,就可以显示 “选择错误,请重新选择”,这样就可以实现猜数字游戏啦 !

1.3 代码源码

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    //游戏菜单
    void menu( )
    {
        printf("   猜数字游戏   \n");
        printf("===============\n");
        printf("=== 1. play ===\n");
        printf("=== 0. exit ===\n");
        printf("===============\n");
    }

    //游戏主体
    void game()
    {
        int RanNum = rand() % 100 + 1;
        int guess = 0;;
        while (1)
        {
            printf("请输入想猜的数字 —— ");
            scanf("%d", &guess);
            if (guess > RanNum)
            {
                printf("猜大了\n");
            }
            else if (guess < RanNum)
            {
                printf("猜小了\n");
            }
            else
            {
                printf("恭喜你,猜中了!\n");
                printf("就是%d这个数!\n", RanNum);
                break;
            }
        }
    }

    //主函数
    int main()
    {

        int input = 0;
        srand((unsigned int)time(NULL));
        do
        {
            menu( );
            printf("请选择 —— ");
            scanf("%d", &input);
            switch (input)
            {
                case 1:
                    game();
                case 0:
                    printf("游戏结束\n");
                    break;
                default :
                    printf("输入错误,请重新选择\n");
                    break;
            }
        } while (input);
        return 0;
    }

 1.4 难度升级

有人可能会说,这个猜数字游戏没啥挑战性啊,那么,如果我加上猜数字的次数限制,阁下又该如何应对呢(dogo),我们可以限制猜的次数,如果五次猜不出来,就算失败。

我们只需要在代码中加入一个 count 变量,每猜一次 count-- ,直到 count == 0,用 if 语句判段 count 的值,一旦  count == 0,直接跳出 while 循环,显示 “游戏失败”。具体代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    //游戏菜单
    void menu( )
    {
        printf("   猜数字游戏   \n");
        printf("===============\n");
        printf("=== 1. play ===\n");
        printf("=== 0. exit ===\n");
        printf("===============\n");
    }

    //游戏主体
    void game()
    {
        int RanNum = rand() % 100 + 1;
        int guess = 0;
        int count = 5;//加入次数限制count
        while (count)
        {
            printf("\n你还有%d次机会\n", count);
            printf("请猜数字 —— ");
            scanf("%d", &guess);
            if (guess > RanNum)
            {
                printf("猜大了\n");
            }
            else if (guess < RanNum)
            {
                printf("猜小了\n");
            }
            else
            {
                printf("恭喜你,猜中了!\n");
                printf("就是%d这个数!\n", RanNum);
                break;
            }
            count--;
        }
        if (count == 0)
        {
            printf("你失败了,正确的数字是:%d\n", RanNum);
        }
    }

    //主函数
    int main()
    {

        int input = 0;
        srand((unsigned int)time(NULL));
        do
        {
            menu( );
            printf("请选择 —— ");
            scanf("%d", &input);
            switch (input)
            {
                case 1:
                    game();
                case 0:
                    printf("游戏结束\n");
                    break;
                default :
                    printf("输入错误,请重新选择\n");
                    break;
            }
        } while (input);
        return 0;
    }

这样是不是变得更有挑战性了呢

结语

综上就是猜数字游戏的思路分析和代码实现,有初阶版本和进阶版本两种难度,不知到大家觉得如何,欢迎各位在评论区友好讨论,如果觉得不错的话,麻烦您点个赞吧,十分感谢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值