当前位置: 首页 > news >正文

[C语言]猜数字游戏

文章目录

  • 一、游戏思路揭秘
  • 二、随机数生成大法
    • 1、初探随机数:rand函数的魔力
    • 2、随机数种子:时间的魔法
    • 3、抓住时间的精髓:time函数
  • 三、完善程序
  • 四、游戏成果
    • 1、游戏效果
    • 2、源代码

一、游戏思路揭秘

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


二、随机数生成大法

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++;//猜测次数加1if (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://选择1system("cls");printf("开始游戏!\n");getchar();//等待用户按下回车键system("cls");game();break;case 0://选择0system("cls");printf("退出游戏!\n");break;default:system("cls");printf("选择错误!\n");//输入错误,提示用户重新输入getchar();system("cls");break;}} while (input);//当用户选择0时退出循环return 0;//程序正常结束
}

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


四、游戏成果

1、游戏效果

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

请添加图片描述

2、源代码

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


相关文章:

  • 10 基于Gazebo和Rviz实现导航仿真,包括SLAM建图,地图服务,机器人定位,路径规划
  • 什么是静态住宅ip,跨境电商为什么要用静态住宅ip
  • 私有云与虚拟化攻防2(OpenStack渗透场景,大部分云平台都是基于此进行二次开发)
  • USB 网卡——RNDIS 介绍
  • 生物化学笔记:神经生物学概论04 视觉通路简介视网膜视网膜神经细胞大小神经节细胞(视错觉)
  • 【GPU 微架构技术】Pending Request Table(PRT)技术详解
  • AI Agent开源技术栈
  • 4.2.4 MYSQL的缓存策略
  • 凯撒密码算法的实现
  • 【LLM】Qwen3模型训练和推理
  • 【论文_序列转换模型架构_20230802v7】Attention Is All You Need 【Transformer】
  • 想做博闻强记的自己
  • 《云原生》核心内容梳理和分阶段学习计划
  • 软件设计师-软考知识复习(1)
  • 【嘉立创EDA】如何找到曲线和直线的交点,或找到弧线和直线的交点
  • jspm老年体检信息管理系统(源码+lw+部署文档+讲解),源码可白嫖!
  • JavaScript中 说说你对闭包的理解?闭包使用场景?
  • 算法每日一题 | 入门-顺序结构-A+B Problem
  • 【Python魔法方法(特殊方法)】
  • Spring知识点梳理
  • 网警查处编造传播“登顶泰山最高可得3万奖金”网络谣言者
  • 空调+零食助顶级赛马备战,上海环球马术冠军赛即将焕新登场
  • 辽宁辽阳火灾3名伤者无生命危险
  • 原国家有色金属工业局副局长黄春萼逝世,享年86岁
  • 李铁案二审今日宣判,押送警车已进入法院
  • 这就是上海!