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