# 第 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 #include #include #include 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 节)。