猜数字游戏实现(最易理解)

本文介绍了用C语言实现猜数字游戏的方法。先讲解了rand、srand、time函数及时间戳的使用,解决随机数重复问题。接着阐述代码思路,包括创建菜单、用do while和switch判断是否游戏,在game函数中生成随机数和猜数字,最后总结游戏适合练习,鼓励动手实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在分析题目之间,我们先来了解几个库函数,这在实现猜数字游戏中起到非常重要的角色!

  1. 第一个是rand函数,rand函数是生成随机数的函数,生成随机数是我们猜数字游戏必不可少的,所以这个rand函数我们肯定需要利用到,接着这个rand函数怎么使用,我们通过cplusplus这个网站去查询rand函数的用法和作用,下面是比较详细的讲解,也比较好理解:

在这里我们可以看到rang的范围是0-RAND_MAX,那么这个RAND_MAX值是多少呢?在vs上输入RAND_MAX,然后右击鼠标转到定义,这个时候会出现这句话

这里有个0x7fff,这里我们通过计算器转换为十进制,我们可以知道最大值是32767,下面给大家展示其用法:

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

int main()
{
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        int ret = rand();
        printf("%d \n", ret);
    }
    return 0;
}

这就是生成随机数的用法,运行结果是:

从运行结果我们可以看出每次生成的数都是随机的,这正好符合我们猜数字游戏的需求,每一个数字都是不一样的!

但是会出现一个问题,我们进行猜数字游戏时,如果我要玩很多把的话,那问题就出现了,我们会发现第二次,第三次之后的每一把所生成的数字和之前的都是一样的,这样显然不符合我们游戏的一贯要求,我们玩游戏肯定需要每一把所猜的数字是不一致的,这种问题肯定在猜数字游戏中肯定是不行的,这样的话,咋们爱玩游戏的小伙伴没有一点游戏体验感,那么这个问题出在哪里呢?

其实问题出在这里,我们还需要调用srand函数,这是在rand函数中所说明的:

通过srand - C++ Reference (cplusplus.com)这个网站,我们知道srand函数的用法和用途,这是初始化随机数生成器。

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

int main()
{
    int i = 0;
    srand(100);//初始化随机数
    for (i = 0; i < 10; i++)
    {
        int ret = rand();//生成随机数
        printf("%d \n", ret);
    }
    return 0;
}

但是我们又会发现一个问题,就是我们如果需要进行很多把游戏时,我们每进行一把游戏就要改变一次srand()函数,这个()里面的数,我们的随机数就会发生变化,我们通过运行代码可以发现100和200的不同,所生成的随机数也是不同的:

所以我们只要每次进行游戏,都需要改变srand函数,那么我们生成的数才会不断的发生变化,那么我们该如何解决这个问题?

这个时候,我们就要想到时间这个观念,因为我们的时间是在每时每刻都在随时发生变化。我们只需要让srand函数随着时间发生变化,那么我们生成的随机数也在不断的发生变化。

这个时候我要引入一个新的知识点,就是时间戳,时间戳不知道大家听没听过,我给大家简单的解释一下

时间戳:就是电脑此时此刻运行代码时间和计算机起始时间的一个差值

通过百度我们也可以知道时间戳

所以我们需要调用时间time这个函数,这里我们通过cplusplus可以看到time函数的参数是time_t型指针,返回值是time_t型:

但是我们并不需要time函数传入指针,所以我们传入NULL空指针就行,并且我们利用time函数在srand中,返回类型不是time_t型,我们知道srand函数的返回类型是unsigned int ,所以我们将time函数强制转换unsigned int 型,srand((unsigned int)time(NULL),这样我们就可以在不同时间里生成不同的随机数

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

int main()
{
    int i = 0;
    srand((unsigned int)time(NULL));//初始化随机数
    for (i = 0; i < 10; i++)
    {
        int ret = rand();//生成随机数
        printf("%d \n", ret);
    }
    return 0;
}

这样我们生成随机数就搞定了!

但是还是有个问题就是,我们如果在玩游戏过程中玩的太快的话,计算机时间戳可能没有转换的那么快,这个时候我们从运行结果中发现,两个数又重复了。

当然,解决这个小问题很简单,我们只需要把srand((unsigned int)time(NULL))放在主函数中,那么就不会出现这个问题了,放在主函数中我们仅仅需要调用一次就行,不用每次进行游戏都来调用,这样不论我们把游戏进行的多块我们的随机数都不会重复!

以上,我们就讲解完了猜数字游戏中必须使用到的函数,其中有rand函数,srand函数,time函数,还有需要使用到的时间戳,也希望我的讲解,各位小伙伴能够非常明白!


下面我们就来分析讲解我们的代码思路:

  1. 首先,我们肯定要创建一个菜单menu,从上面函数讲解过程中我们也可以发现,每次运行结果都伴随着菜单的存在,这个菜单大家都可以创建自己喜欢的,我创建的比较简单:

void menu()
{
    printf("*******************************\n");
    printf("*********** 1.paly ************\n");
    printf("*********** 0.exit ************\n");
    printf("*******************************\n");

}

1代表的是进入游戏,0代表的是退出游戏

  1. 我们在主函数中,设置随机数的生成器,并且在主函数中我们利用do while循环和switch语句进行判断你是否要进行游戏,这个里面大家要注意一些用法就行:

while(input)当input为0时,循环结束,退出游戏。这里面的game()是我们需要调用的函数

int main()
{
    int input = 0;
    //设置随机数生成器
    srand((unsigned int)time(NULL));

    do
    {
        menu();
        printf("请输入你是否进入游戏:\n");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择失败请重新选择:\n");
        }

    } while (input);
}
  1. 接着我们调用game函数,进行游戏,在game函数中,我们要进行的是第一步生成随机数,第二步就是我们游戏的关键进行猜数字,当我们猜的数字小了,代码会提示小了,当我们猜的数字大了,代码会提示大了,直到我们猜对了结果,退出游戏。这里面需要利用到while循环进行猜数字的循环,同时还需要利用if ,else if语句进行判断你猜的数字是否正确,代码如下:

void game()
{
    int guess = 0;
    //1.生成随机数
    int ret = rand()%100 + 1;
    //printf("%d\n", ret);
    //2.猜数字
    while (1)
    {
        printf("请输入你要猜的数字:\n");
        scanf("%d", &guess);
        if (guess < ret)
        {
            printf("猜小了,再猜猜\n");
        }
        else if (guess > ret)
        {
            printf("猜大了,再猜猜\n");
        }
        else
        {
            printf("恭喜你猜对了\n");
            break;
        }
    }
}

这就是我们猜数字游戏的思路,大家认真的去看,会很快掌握的,下面我们把代码结合起来:

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


void menu()
{
    printf("*******************************\n");
    printf("*********** 1.paly ************\n");
    printf("*********** 0.exit ************\n");
    printf("*******************************\n");

}

void game()
{
    int guess = 0;
    //1.生成随机数
    int ret = rand()%100+1;
    //printf("%d\n", ret);
    //2.猜数字
    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;
    //设置随机数生成器
    srand((unsigned int)time(NULL));

    do
    {
        menu();
        printf("请输入你是否进入游戏:\n");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择失败请重新选择:\n");
        }

    } while (input);
}

代码的运行结果:

哈哈哈,本来每次我玩的时候都得五六次才可以才对,这次就三次就猜对了,希望大家和我一样那么顺利,一下就猜对了!

猜数字游戏总结:

  1. 对于猜数字游戏,我觉得其中所使用到的知识点很多,很适合大家用来练练,这样能够更加牢固的掌握知识点

  1. 这里面也有一些难点,比如一些函数的实现还是有一定的难度的,希望大家能够理解其中的知识点!

  1. 最后大家一定要动手去实践!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值