54、实战:猜数字游戏(随机数+循环)
猜数字游戏,可以说是C++入门阶段最经典的实战项目之一。它简单,但五脏俱全——随机数、循环、条件判断、用户交互,全都有了。我个人觉得,这个例子特别适合用来理解“程序是怎么跟人玩起来的”。
好,咱们直接开干。
游戏规则
先定个简单的规则:
- 程序随机生成一个 1~100 之间的整数
- 玩家输入猜测的数字
- 程序提示“猜大了”或“猜小了”
- 猜中为止,显示猜的次数
嗯,规则就这么简单。但你别小看它,我在项目里见过不少新手在这个逻辑上翻车。
随机数怎么生成?
C++ 里生成随机数,老办法是用 rand(),但那个东西其实不太“随机”。我早期做一个小游戏时就被坑过——每次运行程序,出来的“随机数”居然一模一样。后来才知道,rand() 需要配合 srand() 来播种。
现代 C++ 推荐用 <random> 库,更安全、更随机。不过为了初学者好理解,咱们先用 rand() 演示,后面再升级。
rand() % 100 + 1生成 1~100 的随机数srand(time(0))用当前时间做种子,保证每次运行不同while循环控制猜的过程if-else判断大小
完整代码实现
#include <iostream>
#include <cstdlib> // rand, srand
#include <ctime> // time
using namespace std;
int main() {
// 初始化随机种子
srand(time(0));
int target = rand() % 100 + 1; // 1~100
int guess;
int attempts = 0;
cout << "猜数字游戏开始!范围 1~100" << endl;
// 循环直到猜中
while (true) {
cout << "请输入你的猜测: ";
cin >> guess;
attempts++;
if (guess > target) {
cout << "猜大了!" << endl;
} else if (guess < target) {
cout << "猜小了!" << endl;
} else {
cout << "恭喜你!猜中了!" << endl;
cout << "你一共猜了 " << attempts << " 次" << endl;
break;
}
}
return 0;
}
代码逐段拆解
1. 随机种子
srand(time(0)) 这行很关键。如果不写,每次运行程序生成的随机数都一样。我曾经见过一个学员,调试了半天,发现每次猜的数字都是 42,还以为程序有 bug。其实就是忘了播种。
2. 循环结构
这里用了 while(true) 无限循环,配合 break 退出。你想想看,如果不用 break,就得在条件里写一个复杂的判断,代码可读性会差很多。
3. 输入验证
这个版本没有做输入验证。如果用户输入了字母或者小数,程序会直接崩掉。我在实际项目中遇到过类似问题——用户手滑输了个字母,整个程序就卡死了。后面我们会加一个 cin.fail() 检查,这里先留个坑。
流程图:猜数字核心逻辑
避坑指南
- 忘记播种: 不写
srand(),每次运行随机数都一样。调试时发现不了,上线就露馅。 - 范围搞错:
rand() % 100生成的是 0~99,不是 1~100。要加 1。 - 死循环: 如果忘记写
break,或者条件写反了,程序会一直跑。我见过一个学员的电脑风扇狂转,就是因为死循环没退出。 - 输入非数字: 用户输入字母时,
cin会进入错误状态,后续所有输入都失效。需要做cin.clear()和cin.ignore()处理。
扩展思路
这个基础版本写完后,你可以试试加点料:
- 限制猜测次数(比如最多 7 次)
- 记录历史猜测,显示已猜过的数字
- 增加难度选择(1~50、1~200)
- 加入计分系统,猜得越少分越高
小结
猜数字游戏虽然简单,但它涵盖了编程中最核心的几个概念:随机、循环、判断、交互。我个人觉得,如果你能把这个例子吃透,后面学什么循环嵌套、数组、函数,都会轻松很多。
嗯,今天就到这里。代码不多,但值得你亲手敲一遍。别复制粘贴,自己打一遍,感受一下每个字符的作用。
公众号:蓝海资料掘金营,微信deep3321