[C语言]猜数字游戏

一、游戏思路揭秘

猜数字游戏,这个听起来就让人心跳加速的小游戏,它的核心奥秘在于随机数。游戏的过程就像是一场寻宝探险:生成宝藏(随机数),玩家根据提示一步步接近宝藏,直到最终发现它。如果猜对了,那就是一场胜利的欢呼;如果猜错了,游戏会像个耐心的导师,告诉你 “猜大了” 或 “猜小了” ,然后鼓励你继续尝试,直到你找到那个神秘的数字。


二、随机数生成大法

1、初探随机数:rand函数的魔力

在C语言的神秘宝库中,有一个叫rand的函数。它的魔力就是:每次你呼唤它,它都会变出一个新的随机数来。不信?那我们就来试试看:

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

int main()
{
    for(int i = 0; i < 10; i++)//重复试几次
    {
	    int random = rand();//这里生成随机数
	    printf("%d ",random);//先打印出来看看
	}
    return 0;
}

接下来运行几次测试一下,会得到重复的运行结果:

41 18467 6334 26500 19169 15724 11478 29358 26962 24464

哎呀,怎么每次运行结果都一样啊?还好我们测试了一下,这是一个好习惯,可以避免无法预料的结果。
那怎么解决呢?当然是查文档啦:文档地址

请添加图片描述

由以上文档可知:rand函数的随机值是由一个算法生成的,该算法在每次调用它时都会返回一个明显不相关的数字序列。该算法使用种子来生成序列,该序列应使用srand方法初始化为某个唯一值。

2、随机数种子:时间的魔法

那我们再看看srand方法:文档地址

请添加图片描述

要得到真正的随机数,我们需要给rand函数一个种子,这个种子每次都要不一样。那用什么来做种子呢?时间!时间就像流水,永远在变,用它来做种子,随机数就会像魔法一样变化无穷。

3、抓住时间的精髓:time函数

在C语言中,有一个time函数,它能获取当前的时间戳。时间戳就像是一个时间的指纹,每个时刻都有它独特的印记。

好,那我们就用时间来给rand函数设置种子,看看真正的随机数是怎么诞生的:

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

int main()
{
    srand(time(NULL));//用时间设置种子
    for(int i = 0; i < 10; i++)
    {
        int a = rand();
        printf("%d ",a);
    }
    return 0;
}

运行几次程序,得到以下输出:

22820 1628 32269 9569 7902 21478 16516 18171 16466 6404

哈哈,看,这次随机数真的变魔术一样变出来了!每次运行结果都不一样,太棒了!


三、完善程序

现在,我们已经掌握了随机数的奥秘,那就来打造一个完美的猜数字游戏吧!这个游戏将是一个if、switch、while、for、do…while、goto语句的完美结合:

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

//显示游戏菜单
void menu()
{
    printf("**********************************\n");
    printf("***********  1.play  *************\n");
    printf("***********  0.exit  *************\n");
    printf("**********************************\n");
}

//游戏主逻辑
void game()
{
    int random_num = rand() % 100 + 1;//生成1到100之间的随机数
    int input = 0;//用户输入的猜测数字
    int num = 0;//记录用户猜测的次数
    while (1)//无限循环
    {
        printf("请输入猜的数字(1-100):");
        scanf("%d", &input);//读取用户输入

        //清空输入缓存,防止输入错误导致的问题
        for (int i = getchar(); i != '\n'; i = getchar());

        num++;//猜测次数加1
        if (input > random_num)
        {
            if (num >= 10)//如果猜测次数超过10次
                goto byby;//跳转到游戏结束标签

            system("cls");
            printf("猜大了!\n");
        }
        else if (input < random_num)
        {
            if (num >= 10)
                goto byby;

            system("cls");
            printf("猜小了!\n");
        }
        else
        {
            system("cls");
            printf("恭喜你,猜了%d次就猜对了!\n", num);
            getchar();//等待用户按下回车键
            system("cls");
            return;//返回主函数
        }
    }
byby:
    system("cls");
    printf("很遗憾,你没有在规定次数内猜到%d,游戏结束!\n", random_num);//游戏结束提示
    getchar();
    system("cls");
}

int main()
{
    int input = 5;//用户输入的选择
    srand((unsigned)time(NULL));//初始化随机数种子
    do
    {
        menu();//显示菜单
        printf("请选择(1/0):");
        scanf("%d", &input);

        //清空输入缓存,防止输入错误导致的问题
        while (getchar() != '\n')
            input = 2;

        switch (input)//根据用户选择执行不同操作
        {
        case 1://选择1
            system("cls");
            printf("开始游戏!\n");
            getchar();//等待用户按下回车键
            system("cls");
            game();
            break;
        case 0://选择0
            system("cls");
            printf("退出游戏!\n");
            break;
        default:
            system("cls");
            printf("选择错误!\n");//输入错误,提示用户重新输入
            getchar();
            system("cls");
            break;
        }
    } while (input);//当用户选择0时退出循环
    return 0;//程序正常结束
}

这个游戏就像是一个小小的编程世界,里面充满了分支和循环的魔法。如果你还不太熟悉这些控制语句,那就快去查查资料,学学它们的魔法吧!学会了这些,你就能更好地掌握这个游戏,甚至还能打造出更多属于你的编程小宇宙呢!


四、游戏成果

1、游戏效果

经过一系列的开发与调试,游戏的最终效果已经呈现。现在,你可以尽情享受猜数字的乐趣了:

请添加图片描述

2、源代码

为了方便大家学习和交流,游戏的源代码已经在Gitee上开源。你可以通过以下链接访问并下载源代码:传送门


评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

疑惑的杰瑞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值