一个连续的猜数字游戏C语言入门练习
该猜数字小游戏采用模块化 + 菜单驱动循环架构,分menu game main三大函数,各司其职。main函数初始化随机数种子,通过do-while循环展示菜单,用switch-case处理玩家选择。game函数生成两个 1-100 随机数,设计分阶段猜数逻辑:玩家先猜第一个数(5 次机会),猜对后进入第二阶段猜第二个数(5 次机会),双重猜对即通关,任一阶段次数用尽则失败并提示正确答案。整体通过
概要
模块化架构设计
采用模块化拆分与菜单驱动循环的双重设计,确保代码结构清晰且易于维护。将程序分解为三个独立模块:main函数负责初始化与流程控制,menu函数专注菜单展示,game函数处理核心游戏逻辑。这种分离设计降低了模块间的耦合度,便于后续功能扩展。
菜单循环使用do-while结构实现,确保首次运行时必定显示菜单。循环终止条件绑定用户输入值,当选择退出选项时自动结束程序。菜单选项匹配采用switch-case结构,相比if-else链具有更高的执行效率和可读性。
随机数生成机制
通过组合srand(time(NULL))与rand()函数实现真随机效果。种子初始化仅在程序启动时执行一次,避免重复调用导致的随机性衰减。数值范围控制采用数学公式转换:
目标数值 = rand() % 100 + 1
该公式先将随机数映射到0-99区间,再通过加1运算调整为1-100范围。游戏过程中会生成两个完全独立的随机数变量,确保两次猜测过程互不干扰
目录结构补充说明
一个完整的目录结构通常包含以下关键部分,适用于项目、文档或代码库的组织:
根目录
- 项目核心文件(如
README.md、LICENSE、.gitignore) - 配置文件(如
package.json、config.yaml)
源码目录
src/或lib/:存放主要源代码tests/:单元测试或集成测试代码scripts/:构建或部署脚本
文档目录
docs/:技术文档、API 参考examples/:使用示例或教程
资源目录
assets/:静态资源(图片、字体等)data/:原始数据或数据库脚本
构建输出目录
dist/或build/:编译后的输出文件logs/:运行时日志文件
示例目录树
project-root/
├── README.md
├── LICENSE
├── .gitignore
├── src/
│ ├── main.js
│ └── utils/
├── tests/
│ └── unit/
├── docs/
│ └── api.md
├── assets/
│ └── images/
└── dist/
└── bundle.js
最佳实践
- 保持目录名称简洁且语义化(如用
src而非source)。 - 避免深层嵌套(通常不超过 3-4 层)。
- 在
README中说明目录用途,方便协作。
根据项目类型(如前端、后端或数据分析),可调整目录结构。例如,Python 项目可能增加 requirements.txt,而 React 项目可能包含 public/ 和 components/。
。
分阶段游戏流程
游戏分为两个递进阶段,每个阶段设置独立的尝试计数器。第一阶段成功后才解锁第二阶段,两阶段共享以下核心逻辑:
- 每次尝试后减少剩余次数
- 实时反馈猜测结果(偏大/偏小)
- 次数耗尽时揭示正确答案
- 阶段转换时显示醒目分隔提示
通关需要同时满足两个条件:第一阶段5次内猜中数字,且第二阶段5次内再次猜中数字。失败条件则分为两种情况:任一阶段次数用尽,或主动退出游戏。
控制结构优化
根据场景特性选择最佳控制结构:
- 菜单循环采用do-while保证首次执行
- 猜数循环使用while(count)控制尝试次数
- 数值比较使用if-else if阶梯判断
- 菜单选择采用switch-case分支处理
循环终止设置双重保障:尝试次数归零或正确猜中数字。输入处理包含错误容忍机制,非预期输入仅触发提示而不会导致程序异常退出。
交互体验优化
设计多层次交互反馈系统:
- 菜单界面明确标注功能选项
- 每次猜测前显示剩余尝试次数
- 操作错误时给出友好提示
- 关键节点使用视觉分隔符
- 成功时显示特殊庆祝符号
输入引导采用统一提示符">",重要信息间保持适当换行间距。结果反馈包含详细数值对比,帮助玩家理解游戏状态。所有文本提示避免专业术语,使用日常化表达方式。
代码功能概述
这段代码实现了一个简单的猜数字游戏,用户需要连续猜两个1-100之间的随机数。游戏提供菜单选项,允许用户选择继续游戏或退出。
主要组成部分分析
随机数生成
srand((unsigned int)time(NULL)); // 设置随机数种子
int ret_1 = rand() % 100 + 1; // 生成1-100的随机数
int ret_2 = rand() % 100 + 1; // 生成1-100的随机数
srand()使用当前时间作为种子,确保每次运行程序时生成的随机数不同rand() % 100 + 1将随机数范围限定在1-100
游戏菜单函数
void menu()
{
printf("*******************************\n");
printf("******* 1.继续游戏 ******\n");
printf("******* 2.结束游戏 *****\n");
printf("*******************************\n");
}
- 显示简单的文本菜单界面
- 提供两个选项:继续游戏(1)和结束游戏(2)
游戏逻辑函数
void game()
{
// 变量初始化
int guess_1 = 0, guess_2 = 0;
int ret_1 = rand() % 100 + 1;
int ret_2 = rand() % 100 + 1;
int count = 5, count1 = 5;
// 第一个数字猜测循环
while (count) {
// 提示剩余次数和获取输入
if (guess_1 < ret_1) {
printf("猜小了\n");
} else if (guess_1 > ret_1) {
printf("猜大了\n");
} else {
// 第一个数字猜中后进入第二个数字猜测
while (count1) {
// 类似第一个数字的判断逻辑
}
break;
}
count--;
}
// 机会用尽后的处理
if (count == 0) {
printf("很遗憾...");
}
}
- 每个数字有5次猜测机会
- 提供"猜大了"或"猜小了"的反馈
- 成功猜中第一个数字后才能开始猜第二个数字
- 机会用尽后会显示正确答案
主函数
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do {
menu();
scanf("%d",&input);
switch (input) {
case 1: game(); break;
case 2: printf("退出游戏\n"); input = 0; break;
default: printf("选择错误请重现选择");
}
} while (input);
return 0;
}
- 使用do-while循环实现游戏菜单的重复显示
- 根据用户输入调用相应功能
- 输入2时通过设置input=0退出循环
代码特点
- 模块化设计:将菜单和游戏逻辑分离到不同函数
- 用户友好:提供明确的提示信息和反馈
- 错误处理:对无效菜单选项有提示
- 机会限制:每个数字最多尝试5次

完整代码链接:
(https://e.gitee.com/lanhua_1/repos/lanhua_1/practice/blob/master/text-3/text-3/text-3.c)
更多推荐


所有评论(0)