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

4.4 KiB
Raw Blame History

第 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

#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. 怎么编译和运行

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 节)。