利用C语言写出简单的猜数字小游戏

Posted 夏.冬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用C语言写出简单的猜数字小游戏相关的知识,希望对你有一定的参考价值。

何为猜数字游戏?

电脑给出一个1-100之间的随机数,由玩家去猜,如果玩家猜小了,则提示猜小了,如果猜大了,则提示猜大了,如果猜对了,则显示你真棒,猜对了~

实现猜数字游戏需要哪些C语言知识点?

实现该程序只需要简短的几十行代码即可,涉及的知识点有菜单,简单的循环语句、选择语句,以及简单的库函数引用、自定义函数的调用。

具体的代码实现

首先,我使用的是vs2017编译器,编译器具体的使用方法这里就不提及了。

 首先写出主函数

注:这里的#define _CRT_SECURE_NO_WARNINGS是为了防止vs编译器报错scanf函数不安全

我们平时打开游戏都会先弹出一个界面让我们选择是否开始游戏,因此我们写该游戏时也需要写一个菜单。

我们平常玩游戏肯定不是玩完一局接着就退出游戏了,因此这里我们需要用到循环语句,这样玩完一局以后就可以选择是否继续游戏。

while、for循环都需要先判断才会进入循环,而菜单的显示是不需要判断的,因此选择do while循环。

其中的menu即为菜单。

图示即为该游戏菜单的写法,菜单无需返回值,因此定义为void;该菜单的意思是输入1开始游戏,输入0退出游戏。 

写完菜单后,在主函数中继续完善。

定义一个input用于接收我们要选择的数字,游戏用户除了会选择1和0,还有可能误选择其他数字,因此用swtich语句进行处理,先把swtich语句的基本结构写出。

将基本结构写出后,再对switch语句和do while语句进行完善(不要忘了把do while循环的条件写上)。

选择数字1即开始游戏,这里先打印"猜数字"进行代替,后面再编写具体游戏内容。

如果用户选择了1和0之外的数字,则提示"选择错误",do while的循环条件写为input,如果用户输入的是0,则退出游戏,而0为假,循环也可以结束;如果输入的是非0的数字,则为真,循环继续,用户也可以选择是否继续游戏。 

将上述代码都完成后,开始编写游戏的内容。

 编写一个自定义函数game(),在game函数内部进行游戏代码的编写,以实现游戏。

游戏分为两部分:1. 生成随机数   2. 猜数字

生成随机数要引用库函数rand() - 生成一个随机数 - 需引入头文件stdlib.h

 

 这时我们打印ret的值,运行查看一下随机数的生成结果,发现好像确实生成了几个随机数。

 这时我们关闭运行窗口,再运行一次查看结果。

我们发现与第一次的结果完全相同,这时我们会发现该随机数的生成出现了问题,此时可以查一下文档看看rand的具体功能。

此处我选择的是MSDN。

我们发现该函数的功能确实是生成一个0-RAND_MAX范围的随机数(其中RAND_MAX的值为0x7fff(引入头文件后输入RAND_MAX,将鼠标移到RAND_MAX上,即可显示其数值),转化为十进制即为32767),这时候不要着急,我们继续往后读文档。

这句话的意思是在引起rand函数之前需要用一个srand函数,即srand是一个设置随机数的生成器,要将srand与rand配合使用。

 

先将srand函数中的值写为1,我们运行查看结果。

 将srand中的内容改为其他值,我们再运行一下。

 

可以发现,每次随机数都改成了固定的一个值,改变srand中的值就可以改变随机数的值,这时可以推得,只要srand函数中的值一直在改变,那么就可以生成随机数了。

srand中的值需要随机数,我们又需要用srand来生成随机值,这好像是自相矛盾的,其实不然,只要srand中是一个一直在改变的量就可以了,那么计算机中什么是一直在变的呢——时间。

这时要引入时间戳的概念。

时间戳

 当前计算机的时间-计算机的起始时间(1970.1.1.0:0:0)=(xxxx)秒,xxxx即为时间戳。

我们可以拿时间戳来设置随机数的生成起始点。

时间戳的使用则要用库函数time - 需引入头文件time.h。

查看time的文档后,发现time的参数为指针time_t*,如果不想用这个参数,我们传一个空指针NULL,即写为time(NULL)。同时我们发现time的返回类型为time_t,time_t其实是一个整型类型(此处不过多介绍),而srand函数的参数的返回类型为unsigned int。

这时候我们就可以明白,只要把time函数强制转化为unsigned int类型,那么就可以把time函数作为srand函数的参数了。 

运行后发现随机数生成的并不完全随机,如果输入值时按的过快甚至会出现两个随机数相同的情况,这是因为我们把srand函数用错了,srand只需生成一次即可,如果放入我们自定义的game函数内就会多次生成,因此要把srand放到主函数内。

这时随机数的生成就完全随机了,但生成的数过大,非常难以猜到数字,我们已知rand生成随机数的范围为0-32767,那么rand()%100生成的随机数即为0-99,rand()%100+1生成的随机数即为1-100,这就符合我们的游戏规则了。

这时游戏的第一步就完成了,接下来我们就可以进行第二步了。

 

这时我们发现,玩家基本不可能一次就猜对,因此第二步我们需要设置循环,让玩家猜多次,直到猜中为止。 

玩家猜错,则继续循环,猜对了则跳出循环,询问是否继续游戏。

这时我们就可以愉快的进行猜数字游戏了~

完整代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
    printf("************************************\\n");
    printf("*****  1. play            0. exit  *****\\n");
    printf("************************************\\n");
}

//游戏的实现
void game()
{
    int guess = 0;//用于接收猜的数字
    //1. 生成随机数
    int ret = rand() % 100 + 1;
    //2. 猜数字
    while (1)
    {
        printf("请猜数字:>");
        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));//设置随机数的生成器
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch(input)
        {
        case 1:
            //printf("猜数字\\n");
            game();
            break;
        case 0:
            printf("退出游戏\\n");
            break;
        default:
            printf("选择错误\\n");
            break;
        }
    } while (input);
    return 0;
}

以上是关于利用C语言写出简单的猜数字小游戏的主要内容,如果未能解决你的问题,请参考以下文章

C语言游戏入门小程序之简单而有趣的猜数字游戏!!

学习 C 语言丨编写一个简单的猜数字游戏

一步一步用c语言写一个简单的猜数字游戏

用C语言实现一个简单的猜数字游戏

运用c语言完成简单的猜数字游戏(随机数为1到100)

《C语言初阶》 猜数字小游戏