C语言小游戏--猜数字小游戏

文章介绍了如何使用C语言编写一个猜数字小游戏。游戏逻辑基于用户与计算机的大小比较,计算机生成1到100的随机数,用户尝试猜测。关键在于利用srand和rand函数生成随机数,通过time(NULL)确保每次启动时的随机性。程序包含一个菜单选项供用户选择玩游戏或退出,并在猜数字部分使用while循环实现反复猜测直到猜对为止。
摘要由CSDN通过智能技术生成
猜数字小游戏基本实现的逻辑也是大小关系来实现的,电脑随机生成1~100之间的一个随机数,然后需要我们来输入数字来进行猜数字,如果输入的数字比电脑随机生成的数字大,那么就会提示猜大了,如果输入的数字比随机生成的数字小,那么就会提示猜小了,但是要涉及到随机数的设置,这个也会一一分析

基本实现结果:

先给出一个菜单,然后可以让玩家进行选择,然后输入1~100之间的数字,进行猜数字,如果输入的数字小于电脑生成的数字,就提示你猜小了,如果大于,就提示猜大了,直到你猜中数字

💓游戏菜单实现

要实现游戏菜单,首先在代码运行起来之后就要打印这个菜单,而且玩完一次游戏之后还想再玩也是可以选择的,因此就需要一个循环,而且是先打印循环语句再进行判断,所以就需要do while循环

代码实现:

#include <stdio.h>
void menu()
{
    printf("*************************\n");
    printf("*************************\n");
    printf("******** 1. Play ********\n");
    printf("******** 0. Exit ********\n");
    printf("*************************\n");
    printf("*************************\n");
}
int main()
{
    int input = 0;    
    do
    {
        //打印菜单
        menu();
        printf("请选择:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            printf("猜数字小游戏:\n");
            break;
        case 0:
            printf("退出游戏:\n");
            break;
        default:  //加上输入的不为0也不为1的情况
            printf("输入非法,请重新输入:\n");
            break;
        }
    } while (input);   //将input放进判断条件意思是当input为真时进入循环
                       //为假退出循环,当输入的不为0时就会进入循环
                       //这样就可以实现一次玩完之后还可以再玩
    return 0;
}

💓猜数字函数的实现

void game()
{
    //1.生成随机数
    //2.猜数字
}
要实现猜数字,首先得设置一个数来猜,并且这个数谁也不知道,需要电脑设置一个1~100的随机数,然后玩家再进行猜数字,如果猜大了就显示猜大了,猜小了就显示猜小了,直至猜对,因此如果让电脑来随机生成一个随机数是一个关键,那么接下来就来看看随机数怎么生成

📍随机数生成器

C语言中有一个库函数是专门生成随机数,这个函数是rand,关于这个函数的具体细节我们可以再使用C语言的工具来学习一下

rand函数会返回一个0~RANG_MAX的一个随机值,那这个RAND_MAX的值是多少呢?,我们可以在编译器上面看一看

也就是说,rand函数会返回一个0~32767的一个随机数,我们可以打印看一看

#include <stdlib.h>
#include <stdio.h>
void game()
{
    //1.生成随机数
    int target_num = rand();
    printf("%d", target_num);
    //2.猜数字
}

可以看到两次运行之后生成的随机数居然是一模一样,如果这样设置随机数就没有意思,每次设置的数都一样,猜完一次就知道第二次的结果,因此,不能只是单纯的用rand函数来设置随机数,上面对rand函数的介绍我们只看了前半段话,后半段话还没有看

后半段说了,在使用rand函数之前需要使用srand函数来进行设置,那srand怎么用呢?可以看一下

因此我们来使用一下srand来设置一下随机数的生成器

#include <stdlib.h>
#include <stdio.h>
void game()
{
    //1.生成随机数
    srand(1); //函数的参数类型为unsigned int 类型,所以可以设置不同的数字先来观察一下
    int target_num = rand();
    printf("%d\n", target_num);
    //2.猜数字
}

只有当srand函数参数设置不同数字时生成的随机数才会改变,那这就证明在srand函数参数为一个随机值时才可以得到不同的随机数,那这就很奇怪,我们需要生成随机数,而这个函数的参数也需要随机数,这就很挫了,那是不是证明这个方法行不通呢?

在生成随机数时,我们只需要在里面放进去一个随时在变化的值,那么什么值是一直在变化的呢?那就是时间,时间在每分每秒的一直变化,那这个不就是我们所需要的值吗?因此我们需要使用时间戳,因为时间在随时变化,时间戳跟着时间也在随时变化,在C语言中有表示时间的函数叫time函数,关于time函数我们可以来看一看

time函数的函数参数是需要一个指针,但在设置随机数的时候并不需要什么指针,因此就传给它一个空指针NULL,time函数的返回类型是time_t,其实time_t是long long经过重命名之后的值,但是我们在使用srand时它所需要的函数参数是unsigned int 的值,所以我们需要对time函数进行强制类型转换来达到设置随机数的目的

#include <time.h>
#include <stdlib.h>
srand(( unsigned int )time(NULL));  //设置随机数生成器

在设置随机数的生成器的时候,我们只需要生成一次随机数就够了,因此要将随机数的生成器放在主函数中,如果放进game函数中,每玩一次就会生成一次随机数,这样子很会导致生成的随机数并不是很随机,生成的随机数两个数之间的差异并不是很大,所以将随机数的生成器放在主函数的内部就够了,我们可以看一下效果:

#include <stdlib.h>
#include <stdio.h>
void game()
{
    //1.生成随机数 
    int target_num = rand();
    printf("%d\n", target_num);
    //2.猜数字
}
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;
}

但是如果这样写,那生成的随机数是0~32767之间的数,猜数字的难度就及其大,因此我们得将范围变小,缩小至1~100,要知道任何一个数模上100得到的结果是0~99之间的,那如果使用生成的随机数%100然后+1就可以得到1~100之间的随机数

int ret = rand() % 100 + 1; //随机生成1~100之间的数字
当随机数设置好了之后,我们就需要进行猜数字了,那这个逻辑就很简单

📍猜数字

关于猜数字,我们需要输入一个值,如果这个输入的值比电脑随机生成的值大,那么就会提示猜大了,如果输入的数比电脑随机生成的数字小了,那么就会提示猜小了,这样反复的循环,直到猜对

代码实现:

void game()
{ 
    int target_num = rand() % 100 + 1;   //随机生成的1~100之间的数
    int num = 0;
    while (1)  //设置死循环,如果没有猜对就一直猜
    {
        printf("请猜数字:");
        //输入
        scanf("%d", &num);
        //判断
        if (num > target_num)
            printf("猜大了\n");
        else if (num < target_num)
            printf("猜小了\n");
        //猜对获胜break跳出循环
        else
        {
            printf("猜对了\n");
            break;
        }
    }
}

写到这里整个代码的基本逻辑都写完了,下面展示完整的代码

📍完整代码

//猜数字小游戏
//头文件的包含
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

//菜单
void menu()
{
    printf("*************************\n");
    printf("*************************\n");
    printf("******** 1. Play ********\n");
    printf("******** 0. Exit ********\n");
    printf("*************************\n");
    printf("*************************\n");
}

//猜数字游戏逻辑
void game()
{   
    //1.随机数的生成
    int target_num = rand() % 100 + 1;  //生成的随机数是1~100
                                        //rand%100是0~99之间的数,再加上1就是1~100之间的数
    int num = 0;
    //2.猜数字
    while (1)
    {
        printf("请猜数字:");
        //输入
        scanf("%d", &num);
        //判断
        if (num > target_num)
            printf("猜大了\n");
        else if (num < target_num)
            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;
}

那么猜数字小游戏整个游戏逻辑和代码就展示完了,如果大家有什么疑问可以打在评论区,我们可以一起讨论一下,或者也可以私信我,感谢大家的支持!谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stackY、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值