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

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 语 言 编 程,激 发 你 在 编 程 世 界 中 不 断 探 索 和 创 新 的 热 情 。


http://www.kler.cn/a/573235.html

相关文章:

  • 数据挖掘校招面经二
  • HarmonyOS 中 Navigation 组件的应用困境与应对策略
  • Checkpoint 模型与Stable Diffusion XL(SDXL)模型的区别
  • 使用 Deepseek + kimi 快速生成PPT
  • 盛铂科技SCP4000射频微波功率计与SPP5000系列脉冲峰值 USB功率计 区别
  • SPL 和 SQL 能不能融合在一起?
  • 低空经济中,软件服务业 和 物联网(IoT) 的融合尝试
  • 与中国联通技术共建:通过obdiag分析OceanBase DDL中的报错场景
  • C语言:51单片机 结构体系(带最小系统设计图)
  • Ubuntu 上设置 iptables 规则开机自启
  • 【大模型基础_毛玉仁】1.1 基于统计方法的语言模型
  • Gradle 配置 Lombok 项目并发布到私有 Maven 仓库的完整指南
  • 备忘录模式(Memento Pattern)
  • 读写分离架构下的一致性挑战
  • Unity3D主程入职90天工作计划
  • PHP 将图片url,写入到文件夹中,导出到zip下载到桌面
  • SpringBoot Actuator
  • 4. Prometheus监控数据持久化
  • Spring Boot中对接Twilio以实现发送验证码和验证短信码
  • Redis 篇