C 语 言 --- 猜 数 字 游 戏

C 语 言 --- 猜 数 字 游 戏

  • 代 码 全 貌 与 功 能 介 绍
  • 游 戏 效 果 展 示
  • 游 戏 代 码 详 解
    • 头 文 件 引 入
    • 菜单函数
    • 游 戏 逻 辑 函 数 game
      • rand 函 数 详 解
      • 逻 辑 函 数 game
    • 主 函 数
  • 总结

💻作 者 简 介:曾 与 你 一 样 迷 茫,现 以 经 验 助 你 入 门 C 语 言
💡个 人 主 页:@笑口常开xpr 的 个 人 主 页
📚系 列 专 栏:C 启新程
✨代 码 趣 语:代 码 要 像 诗 一 样 优 雅,而 不 是 像 神 秘 的 咒 语。
💪代 码 千 行,始 于 坚 持,每 日 敲 码,进 阶 编 程 之 路。
📦gitee 链 接:gitee

在这里插入图片描述

       在 编 程 的 世 界 里,每 一 行 代 码 都 可 能 隐 藏 着 无 限 的 可 能 性 。你 是 否 想 过,一 个 小 小 的 程 序 究 竟 能 改 变 什 么?它 可 以 是 解 决 复 杂 问 题 的 工 具 ,也 可 以 是 实 现 梦 想 的 桥 梁。今 天,就 让 我 们 一 起 走 进 C 语 言 的 世 界,探 索 它 的 无 限 潜 力。

代 码 全 貌 与 功 能 介 绍

       我 们 先 来 整 体 看 一 下 这 段 C 语 言 代 码。它 实 现 了 一 个 简 单 而 经 典 的 猜 数 字 游 戏,程 序 启 动 后,会 展 示 一 个 菜 单,提 供 两 个 选 项:1. 玩 游 戏 和 0. 退 出 游 戏。选 择 1 进 入 游 戏,玩 家 需 要 在 规 定 次 数 内 猜 出 一 个 1 到 100 之 间 的 随 机 数 字;选 择 0 则 退 出 游 戏。如 果 玩 家 输 入 了 其 他 无 效 选 项,程 序 会 提 示 选 择 错 误。

下 面 展 示完整代码

读 者 可 以 将 这 段 代 码 复 制 到 自 己 的 编 译 器 中 运 行:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//菜单: 1.玩游戏 0.退出游戏
void menu()
{
	printf("**************************************\n");
	printf("*******   1.猜数字      ***************\n");
	printf("*******   0.退出游戏    ***************\n");
	printf("**************************************\n");
}
//猜数字游戏的逻辑
void game()
{
	int guess = 0;
	int count = 5;
	//1.生成随机数
	int r = rand() % 100 + 1;//1 ~ 100
	//2.猜数字
	printf("请输入你猜数字的次数:");
	scanf("%d", &count);
	while (count)
	{
		printf("目前还有%d次机会\n", count);
		printf("请猜数字:>");
		scanf("%d", &guess);
		if (guess < r)
		{
			printf("猜小了\n");
		}
		else if (guess > r)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
		count--;
	}
	if (count == 0)
	{
		printf("很遗憾,%d次机会使用完成,没能猜出数字,结果是:%d\n",count,r);
	}
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//只调用一次
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	}while (input);
}

游 戏 效 果 展 示

         在 猜 数 字 游 戏 里,对 猜 数 字 次 数 的 限 制 是 关 键 的 游 戏 规 则 设 定。程 序 为 玩 家 设 定 了 一 定 数 量 的 猜 测 机 会 , 在 规 定 的 这 几 次 机 会 里,玩 家 需 要 凭 借 对 数 字 大 小 的 判 断 不 断 尝试。一 旦 在 这 有 限 的 次 数 内 未 能 成 功 猜 出 正 确 数 字,程 序 便 会 判 定 游 戏 失 败。此 时,系 统 会 清 晰 地 告 知 玩 家 游 戏 结 果,并 展 示 出 正 确 数 字,让 玩 家 了 解 最 终 答 案。

在这里插入图片描述

游 戏 代 码 详 解

头 文 件 引 入

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

         这 里 引 入 了 三 个 重 要 的 头 文 件。stdio.h 提 供 了 标 准 输 入 输 出 函 数,比 如 我 们 在 程 序 中 用于 输 入 的 scanf 和 用 于 输 出 的 printf。stdlib.h 包 含 了 一 些 通 用 的 工 具 函 数,其 中 rand 函 数 就 来 自 这 个 头 文 件,用 于 生 成 随 机 数。time.h 则 用 于 获 取 系 统 时 间,在 我 们 的 程 序 中,它 与srand 函 数 配 合 ,确 保 每 次 运 行 程 序 时 生 成 的 随 机 数 不 同 。

菜单函数

void menu()
{
    printf("**************************************\n");
    printf("*******   1.猜数字      ***************\n");
    printf("*******   0.退出游戏    ***************\n");
    printf("**************************************\n");
}

         menu 函 数 的 作 用 很 直 观,就 是 在 控 制 台 打 印 出 游 戏 的 菜 单 界 面。这 种 格 式,使 菜 单 看 起 来 清 晰 明 了,方 便 玩 家 做 出 选 择。

游 戏 逻 辑 函 数 game

rand 函 数 详 解

在这里插入图片描述

         在 猜 数 字 游 戏 中,rand 函 数 负 责 生 成 玩 家 需 要 猜 测 的 随 机 数。rand 函 数 定 义 在 stdlib.h 头 文 件 中,因 此 在 使 用 该 函 数 前,我 们 必 须 包 含 这 个 头 文 件:#include <stdlib.h>。

         rand 函 数 不 需 要 传 入 任 何 参 数,每 次 调 用 它 时,都 会 返 回 一 个 介 于 0( 包 括 )和 RAND_MAX 之 间 的 整 数。RAND_MAX 是 一 个 在 stdlib.h 中 定 义 的 常 量,其 值 通 常 是 一 个 非 常 大 的 整 数,具 体 数 值 因 编 译 器 而 异,但 常 见 的 取 值 是 32767。

例 如,在 我 们 的 猜 数 字 游 戏 代 码 中:
int r = rand() % 100 + 1;

       这 里 通 过 rand() 获 取 一 个 随 机 整 数,然 后 对 100 取 模(即 求 余 数),得 到 的 结 果 范 围 是 0 到 99。再 加 上 1 后,r 的 值 就 被 限 定 在 了 1 到 100 之 间,这 正 是 我 们 希 望 玩 家 猜 测 的 数 字 范围。需 要 注 意 的 是 ,rand 函 数 生 成 的 并 不 是 真 正 意 义 上的 随 机 数 , 而 是 伪 随 机 数。这 意 味 着 如 果 程 序 的 初 始 条 件 相 同 , 每 次 运 行 时 rand 函 数 生 成 的 随 机 数 序 列 都 是 一 样 的。为 了 避 免 这 种 情 况 ,让 每 次 运 行 程 序 时 生 成 的 随 机 数 不 同 ,我 们 需 要 使 用 srand 函 数 来 设 置 随 机 数 种 子。在 我 们 的 主 函 数 main 中:

在这里插入图片描述

srand((unsigned int)time(NULL));

         这 里 使 用 time(NULL) 获 取 当 前 系 统 时 间,将 其 转 换 为 unsigned int 类 型 后 作 为 参 数 传 递 给 srand 函 数。由 于 每 次 运 行 程 序 时 的 系 统 时 间 几 乎 不 可 能 相 同,这 样 就 保 证 了 每 次 运 行 程 序 时 随 机 数 种 子 不 同 ,从 而 使 rand 函 数 生 成 不 同 的 随 机 数 序 列 。并 且,srand 函 数 只 需 在 程 序 开 始 时 调 用 一 次 即 可。

在这里插入图片描述

逻 辑 函 数 game

void game()
{
    int guess = 0;
    int count = 5;
    //1.生成随机数
    int r = rand() % 100 + 1;//1 ~ 100
    //2.猜数字
    printf("请输入你猜数字的次数:");
    scanf("%d", &count);
    while (count)
    {
        printf("目前还有%d次机会\n", count);
        printf("请猜数字:>");
        scanf("%d", &guess);
        if (guess < r)
        {
            printf("猜小了\n");
        }
        else if (guess > r)
        {
            printf("猜大了\n");
        }
        else
        {
            printf("恭喜你,猜对了\n");
            break;
        }
        count--;
    }
    if (count == 0)
    {
        printf("很遗憾,%d次机会使用完成,没能猜出数字,结果是:%d\n",count,r);
    }
}

         初 始 化 变 量:在 game 函 数 内 部,首 先 定 义 了 两 个 变 量 guess 用 于 存 储 玩 家 猜 测 的 数 字,count 初 始 化 为 5,表 示 玩 家 初 始 有 5 次 猜 测 机 会。不 过,这 里 有 个 小 亮 点,玩 家 可 以 自 己 输 入 猜 测 的 次 数,这 增 加 了 游 戏 的 灵 活 性 和 趣 味 性。

         生 成 随 机 数:通 过 rand 函 数 生 成 一 个 0 到 RAND_MAX( 一 个 很 大 的 整 数 )之 间 的 随 机 数,然 后 对 100 取 模 并 加 1,这 样 就 得 到 了 一 个 1 到 100 之 间 的 随 机 整 数 r,这 就 是 玩 家 需 要 猜 测 的 目 标 数 字。

         猜 数 字 循 环:使 用 一 个 while 循 环,只 要 count 大 于 0,就 会 持 续 进 行 游 戏。在 每 次 循 环 中,先 提 示 玩 家 剩 余 的 猜 测 次 数,然 后 让 玩 家 输 入 猜 测 的 数 字。接 着 通 过 if - else 语 句 判 断 玩 家 猜 测 的 数 字 与 目 标 数 字 的 大 小 关 系 , 并 给 出 相 应 的 提 示 。 如 果 猜 对 了 ,打 印 “ 恭 喜 你 ,猜 对 了 ” 并 使 用 break 语 句 跳 出 循 环;如 果 猜 错 了,count 减 1。当 count 变 为 0 时, 循 环 结 束 ,此 时 如 果 玩 家 还 没 有 猜 对,会 打 印 出 遗 憾 的 提 示 信 息 ,并 告 知 目 标 数 字。

主 函 数

int main()
{
    int input = 0;
    srand((unsigned int)time(NULL));//只调用一次
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }
    }while (input);
}

         随 机 数 种 子 设 置:在 main 函 数 开 头 ,通 过 srand((unsigned int)time(NULL)) 设 置 随 机 数 种 子。 这 里 使 用 系 统 当 前 时 间 作 为 种 子,并 且 只 调 用 一 次,这 样 就 能 保 证 每 次 运 行 程 序 时 生 成 的 随 机 序 列 不 同 , 增 加游 戏 的 新 鲜 感 。

         菜 单 选 择 循 环:使 用 do - while 循 环,先 调 用 menu 函 数 打 印 菜 单,然 后 让 玩 家 输 入 选 择。 通 过 switch 语 句 根 据 玩 家 的 输 入 执 行 相 应 的 操 作。如 果 选 择 1,调 用 game 函 数 开 始 游 戏; 如 果 选 择 0,打 印 “ 退 出 游 戏 ” 并 结 束 循 环;如 果 输 入 其 他 无 效 选 项,提 示 “ 选 择 错 误 ”。只 要 玩 家 输 入 的 不 是 0,循 环 就 会 继 续,程 序 会 不 断 提 供 菜 单 供 玩 家 选 择,直 到 玩 家 选 择 退 出 游 戏。

在这里插入图片描述

总结

       通 过 这 个 简 单 的 猜 数 字 游 戏,我 们 不 仅 实 践 了 C 语 言 中 的 基 本 语 法,如 变 量 定 义、循 环 结 构、条 件 判 断 和 函 数 调 用,还 学 习 了 如 何 使 用 随 机 数 生 成 函 数 和 输 入 输 出 函 数。希 望 这 篇 博 客 能 帮 助 你 更 好 地 理 解 C 语 言 编 程,激 发 你 在 编 程 世 界 中 不 断 探 索 和 创 新 的 热 情 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/982024.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入探索C++17文件系统库:std::filesystem全面解析

前言 在C编程中&#xff0c;文件系统操作是许多应用程序的基础功能之一。无论是读写文件、创建目录&#xff0c;还是遍历文件系统&#xff0c;文件系统操作几乎无处不在。然而&#xff0c;在C17之前&#xff0c;标准库并没有提供一个统一、高效且易用的文件系统操作接口。开发…

C++学习之C++初识、C++对C语言增强、对C语言扩展

一.C初识 1.C简介 2.第一个C程序 //#include <iostream> //iostream 相当于 C语言下的 stdio.h i - input 输入 o -output 输出 //using namespace std; //using 使用 namespace 命名空间 std 标准 &#xff0c;理解为打开一个房间&#xff0c;房间里有我们所需…

transformer架构解析{掩码,(自)注意力机制,多头(自)注意力机制}(含代码)-3

目录 前言 掩码张量 什么是掩码张量 掩码张量的作用 生成掩码张量实现 注意力机制 学习目标 注意力计算规则 注意力和自注意力 注意力机制 注意力机制计算规则的代码实现 多头注意力机制 学习目标 什么是多头注意力机制 多头注意力计算机制的作用 多头注意力机…

【大模型基础_毛玉仁】1.3 基于Transformer 的语言模型

【大模型基础_毛玉仁】1.3 基于Transformer 的语言模型 1.3 基于Transformer 的语言模型1.3.1 Transformer1&#xff09;注意力层&#xff08;AttentionLayer&#xff09;2&#xff09;全连接前馈层&#xff08;Fully-connected Feedforwad Layer&#xff09;3&#xff09;层正…

Beeline的使用和Hive JDBC

目录 1. 引言1.1 Hadoop1.2 HBase1.3 Hive 2. Beeline2.1 使用Beeline访问Hive2.1.1 通过beeline直接连接Hive2.1.2 先进入beeline客户端再连接Hive2.1.3 先进入beeline客户端再连接MySQL 2.2 Beeline命令 3. Hive JDBC3.1 pom.xml中依赖配置3.2 Util工具类3.3 代码3.4 结果 参…

分布式多卡训练(DDP)踩坑

多卡训练最近在跑yolov10版本的RT-DETR&#xff0c;用来进行目标检测。 单卡训练语句&#xff08;正常运行&#xff09;&#xff1a; python main.py多卡训练语句&#xff1a; 需要通过torch.distributed.launch来启动&#xff0c;一般是单节点&#xff0c;其中CUDA_VISIBLE…

30秒从零搭建机器人管理系统(Trae)

1. 安装 [Trae官网】(https://www.trae.com.cn/) 2. 提示词 创建一个BS架构的机器人远程操控系统&#xff0c;具备机器人状态及位置实时更新&#xff0c;可以实现机器人远程遥控&#xff0c;可以对机器人工作日志进行统计分析&#xff0c;以及其它管理系统的常用功能3. 模型…

软考-数据库开发工程师-3.1-数据结构-线性结构

第3章内容比较多&#xff0c;内容考试分数占比较大&#xff0c;6分左右 线性表 1、线性表的定义 一个线性表是n个元素的有限序列(n≥0)&#xff0c;通常表示为(a1&#xff0c;a2, a3,…an). 2、线性表的顺序存储(顺序表) 是指用一组地址连续的存储单元依次存储线性表中的数据元…

解锁数据潜能,永洪科技以数据之力简化中粮可口可乐决策之路

企业数字化转型是指企业利用数字技术和信息通信技术来改变自身的商业模式、流程和增值服务&#xff0c;以提高企业的竞争力和创新能力。数字化转型已经成为企业发展的重要战略&#xff0c;尤其在当前信息技术高速发展的时代。数字化转型还涉及到企业与消费者之间的互动和沟通。…

Vue 3 整合 WangEditor 富文本编辑器:从基础到高级实践

本文将详细介绍如何在 Vue 3 项目中集成 WangEditor 富文本编辑器&#xff0c;实现图文混排、自定义扩展等高阶功能。 一、为什么选择 WangEditor&#xff1f; 作为国内流行的开源富文本编辑器&#xff0c;WangEditor 具有以下优势&#xff1a; 轻量高效&#xff1a;压缩后仅…

游戏引擎学习第137天

演示资产系统中的一个 bug 我们留下了个问题&#xff0c;你现在可以看到&#xff0c;移动时它没有选择正确的资产。我们知道问题的原因&#xff0c;就在之前我就预见到这个问题会出现。问题是我们的标签系统没有处理周期性边界的匹配问题。当处理像角度这种周期性的标签时&…

监听 RabbitMQ 延时交换机的消息数、OpenFeign 路径参数传入斜杠无法正确转义

背景 【MQ】一套为海量消息和高并发热点消息&#xff0c;提供高可用精准延时服务的解决方案 我现在有一个需求&#xff0c;就是监听 RabbitMQ 一个延时交换机的消息数&#xff0c;而 RabbitTemplate 是不存在对应的方法来获取的。 而我们在 RabbitMQ 的控制台却可以发现延时交…

大数据学习(56)-Impala

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

开发环境搭建-01.前端环境搭建

一.整体结构 Nginx目录必须放在没有中文的目录中才能正常运行&#xff01;&#xff01;&#xff01;

Redis 常见数据类型

官方文档 RedisCommands 1&#xff09;Redis 的命令有上百个&#xff0c;如果纯靠死记硬背比较困难&#xff0c;但是如果理解 Redis 的一些机制&#xff0c;会发现这些命令有很强的通用性。 2&#xff09;Redis 不是万金油&#xff0c;有些数据结构和命令必须在特定场景下使用…

Redis7——进阶篇(三)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…

云原生时代的技术桥梁

在数字化转型的大潮中&#xff0c;企业面临着数据孤岛、应用间集成复杂、高成本与低效率等问题。这些问题不仅阻碍了企业内部信息的流通和资源的共享&#xff0c;也影响了企业对外部市场变化的响应速度。当前&#xff0c;这一转型过程从IT角度来看&#xff0c;已然迈入云原生时…

ICLR 2025|香港浸会大学可信机器学习和推理课题组专场

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; AITIME 01 ICLR 2025预讲会团队专场 AITIME 02 专场信息 01 Noisy Test-Time Adaptation in Vision-Language Models 讲者&#xff1a;曹晨涛&#xff0c;HKBU TMLR Group一年级博士生&#xff0c;目前关注基础…

ProfibusDP主站转ModbusTCP网关如何进行数据互换

ProfibusDP主站转ModbusTCP网关如何进行数据互换 在现代工业自动化领域&#xff0c;通信协议的多样性和复杂性不断增加。Profibus DP作为一种经典的现场总线标准&#xff0c;广泛应用于工业控制网络中&#xff1b;而Modbus TCP作为基于以太网的通信协议&#xff0c;因其简单易…

016.3月夏令营:数理类

016.3月夏令营&#xff1a;数理类&#xff1a; 中国人民大学统计学院&#xff1a; http://www.eeban.com/forum.php?modviewthread&tid386109 北京大学化学学院第一轮&#xff1a; http://www.eeban.com/forum.php?m ... 6026&extrapage%3D1 香港大学化学系夏令营&a…