Files
chouka/old/第09课-菜单与循环.md
2026-05-16 11:09:02 +08:00

140 lines
4.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第 9 课:菜单与循环(`while` + `break`
**本课目标**:让程序像小游戏一样 **反复显示菜单**,玩家输入数字选择:**抽一次卡 / 看说明 / 退出**。学会 **`while (true)`** 以及 **`break`** 跳出循环。
**复习**:第 8 课的 **`draw_once()`**;第 3 课的 **`cin`**。本课把「输入选项」包在一个 **一直转的大圈** 里。
---
## 1. 这一课要搞懂什么
- **`while (条件)`**:条件成立就反复执行 `{ ... }` 里的代码。
- **`while (true)`**`true` 永远成立 → **无限循环**,除非里面用 **`break`** 强行离开。
- **`break`**:用在循环里,表示 **立刻结束这一层循环**,继续执行循环后面的代码(通常是 `return 0` 结束程序)。
- **菜单**:每一圈先 **`cout` 打印选项**,再 **`cin >> choice`**,再用 **`if` / `else if` / `else`** 判断选了哪一项。
---
## 2. 推荐选项编号(示例)
| 输入数字 | 动作 |
|----------|------|
| `1` | 调用 **`draw_once()`** 抽一次 |
| `2` | 打印几句游戏规则说明 |
| `0` | **`break`** 退出循环(说再见) |
你也可以改成 `3` 退出,只要在文档里写清楚即可。
---
## 3. 完整示例程序
保存为 `lession9.cpp`
```cpp
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
void draw_once() {
int r = std::rand() % 100;
if (r < 70) {
std::cout << "普通卡\n";
} else if (r < 95) {
std::cout << "稀有卡\n";
} else {
std::cout << "超稀有卡\n";
}
}
int main() {
std::srand(std::time(nullptr));
while (true) {
std::cout << "\n===== 抽卡小游戏 =====\n";
std::cout << "1 抽一次\n";
std::cout << "2 说明\n";
std::cout << "0 退出\n";
std::cout << "请选择:";
int choice = 0;
std::cin >> choice;
if (choice == 1) {
draw_once();
} else if (choice == 2) {
std::cout << "随机出普通/稀有/超稀有,选 1 抽一次,选 0 退出。\n";
} else if (choice == 0) {
std::cout << "再见!\n";
break;
} else {
std::cout << "没有这个选项,请重新输入。\n";
}
}
return 0;
}
```
### 程序是怎么跑的?
1. 进入 **`while (true)`**,显示菜单。
2. 等你输入 **`choice`**。
3. 若选 **`0`**:打印再见 → **`break`** → 循环结束 → 执行 **`return 0`**。
4. 否则再回到步骤 1(又是新的一圈菜单)。
---
## 4. 两个循环的区别(回忆)
| 循环 | 适合干什么 |
|------|------------|
| **`for`** | 次数明确,例如「抽 `n` 次」 |
| **`while`** | 次数不固定,例如「一直显示菜单直到选退出」 |
菜单用 **`while`** 很自然;菜单里选「抽十次」可以再写一个 **`for`** 调用 **`draw_once()`**。
---
## 5. 怎么编译和运行
```bash
clang++ -std=c++17 -o lession9 lession9.cpp
./lession9
```
---
## 6. 本课课堂小练习
1. 增加菜单项 **`3`****先问「抽几次?」**,读入 **`n`**,用 **`for`** 调用 **`draw_once()`** `n` 次(把第 6、8 课合在一起)。
2. 把菜单文字改成你喜欢的标题和选项说明。
---
## 7. 本课课后作业(选做)
- 加一个 **`int coins`**:每抽一次扣 10 金币,金币不够时提示并禁止抽卡(需要 **`if (coins >= 10)`** 再抽)。
- 问家长:**为什么退出要用 `break`,而不是直接写 `return 0` 在分支里?**(两种有时都能用;本课先理解 `break` 只跳出 **`while`**。)
---
## 8. 常见小问题
- **退出不了**:检查退出分支里有没有 **`break`**;条件是不是写成了赋值 **`=`** 而不是比较 **`==`**。
- **菜单刷屏**:每一圈开头加一点点分隔线(示例里用了 `\n``=====`)会好看一些。
- **`cin` 输入错了类型**:输入字母可能导致菜单卡住,选做以后再学清理输入流;本课先用数字测试。
---
## 9. 下一课预告
第 10 课是 **综合小项目**:把欢迎语、菜单、金币或次数、统计超稀有等整理成你自己的「迷你抽卡游戏」版本。
---
*学完请家长在 `学习进度与状态.md` 里更新第 9 课的状态与作业完成情况。*
**下一课文档**`第10课-综合小项目.md`(创建后将放在工作区;也可先对照 `教程-抽卡游戏-C++-10课.md` 第 10 节)。