C 语言综合练习一:猜数字游戏
更新时间:2026-08-26。本文是
languages/c/主题入门层第 72 篇。前面几十篇的知识点,是时候串起来打一场仗了。猜数字游戏是 C 入门的"Hello World 2.0":随机数、循环、分支、输入校验、提示反馈,一次练到。本篇按"需求 → 设计 → 实现 → 运行"走一遍,代码已入库demos/c-beginner-practice/guess_number.c(见文末)。
本文要回答的问题
- 一个完整的控制台小游戏要怎么拆解需求?
- 循环、分支、随机数怎么组合?
- 用户输入"abc"这种垃圾怎么处理?
一、需求拆解
游戏规则:
- 程序在 1~100 里随机选一个数;
- 用户输入猜测,程序提示"大了/小了/猜对了";
- 猜对结束,显示猜的次数;
- 输入非数字要提示并重来。
拆成函数:
| 功能 | 函数 |
|---|---|
| 生成目标 | rand() % 100 + 1(配 srand) |
| 读用户输入 | scanf + 检查返回值 |
| 比较反馈 | if / else if / else |
| 循环重试 | while (1) + break |
二、完整代码
c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand((unsigned)time(NULL));
int secret = rand() % 100 + 1; // 1..100
int guess, tries = 0;
printf("猜数字游戏:目标在 1~100 之间\n");
while (1) {
printf("请输入你的猜测:");
if (scanf("%d", &guess) != 1) {
/* 输入不是整数:清掉坏输入,重新读 */
while (getchar() != '\n') { /* 跳过本行 */ }
printf("请输入一个整数!\n");
continue;
}
tries++;
if (guess < secret)
printf("小了\n");
else if (guess > secret)
printf("大了\n");
else {
printf("恭喜!猜对了,共猜 %d 次\n", tries);
break;
}
}
return 0;
}三、关键设计点
1. 随机种子只播一次:
c
srand((unsigned)time(NULL)); // main 开头,别放循环里2. 输入校验:scanf 返回值:
c
if (scanf("%d", &guess) != 1) { ... }用户输入 abc 时 scanf 返回 0,此时缓冲区里还残留 abc\n——用 while (getchar() != '\n') 把坏输入清干净,否则下次循环 scanf 又读到 abc,死循环。
3. 死循环 + break:猜对才退出,逻辑集中在 else 分支。
四、运行演示
$ make run
猜数字游戏:目标在 1~100 之间
请输入你的猜测:50
小了
请输入你的猜测:abc
请输入一个整数!
请输入你的猜测:75
小了
请输入你的猜测:88
大了
请输入你的猜测:82
恭喜!猜对了,共猜 4 次真实输出见 demos/c-beginner-practice/ 下 README.md 的实测记录(Linux 编译运行)。
五、扩展练习
- 加"最佳纪录":记录最少猜中次数,存文件;
- 加难度:1~1000、限制次数;
- 把反馈做成"冷/温/热"分级提示。
六、一句话总结
c
/*
* guess_number.c —— C 语言入门综合练习一:猜数字游戏
* 文档: languages/c/beginner/72-practice-guess-number.md
* 编译: make && ./guess_number
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand((unsigned)time(NULL));
int secret = rand() % 100 + 1; /* 1..100 */
int guess, tries = 0;
printf("猜数字游戏:目标在 1~100 之间\n");
while (1) {
printf("请输入你的猜测:");
if (scanf("%d", &guess) != 1) {
/* 输入不是整数:清掉坏输入,重新读 */
while (getchar() != '\n') { /* 跳过本行 */ }
printf("请输入一个整数!\n");
continue;
}
tries++;
if (guess < secret)
printf("小了\n");
else if (guess > secret)
printf("大了\n");
else {
printf("恭喜!猜对了,共猜 %d 次\n", tries);
break;
}
}
return 0;
}与本站主线衔接
- 随机数细节,见rand 与 srand;
- 循环与分支,见for 循环、if-else;
- 输入处理的坑,见scanf 输入。