save code
This commit is contained in:
@@ -0,0 +1,139 @@
|
||||
# 第 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 节)。
|
||||
Reference in New Issue
Block a user