4.1 KiB
4.1 KiB
第 6 课:循环与多抽(for)
本课目标:把第 3 课的「输入次数」、第 4~5 课的「随机 + 稀有度」合在一起:玩家输入 n,程序用 for 循环 连续抽 n 次,每次结果可以不同。
复习:cin 读整数;srand 只设一次;rand % 100 与 if 判断。
1. 这一课要搞懂什么
-
循环:同一段代码想做很多遍,不用复制粘贴很多行。
-
for句型(本课用这个):for (起点; 是否继续; 每轮结束时做什么) { 循环体 } -
本课常用写法:
for (int i = 1; i <= n; i++) { ... }含义可以记成:「
i从 1 开始,只要i还小于等于n,就执行大括号里的话,每做完一轮让i加 1」。 -
i常用来当「第几抽」的序号,正好可以打在屏幕上:第1抽、第2抽……
2. 随机数要放在循环里面还是外面?
std::srand(std::time(nullptr));:仍在main开头只写一次(和前面一样)。int r = std::rand() % 100;:要写在for的循环体里面——每抽一次,重新得到一个r。若写在循环外,r只算一次,多抽就全一样了。
3. 完整示例(输入次数 + 连抽 + 稀有度)
保存为 lession6.cpp:
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
std::srand(std::time(nullptr));
int n = 0;
std::cout << "抽几次?";
std::cin >> n;
for (int i = 1; i <= n; i++) {
int r = std::rand() % 100;
std::cout << "第" << i << "抽:";
if (r < 70) {
std::cout << "普通\n";
} else if (r < 95) {
std::cout << "稀有\n";
} else {
std::cout << "超稀有\n";
}
}
return 0;
}
运行后输入一个整数(如 5),应看到 5 行结果,每行稀有度可不同。
4. for 三格分别是什么?(对号入座)
以 for (int i = 1; i <= n; i++) 为例:
| 位置 | 本课含义 |
|---|---|
int i = 1 |
循环变量 i 从 1 开始。 |
i <= n |
只要 i 不超过 n 就继续抽。 |
i++ |
每抽完一轮,i 加 1(++ 表示加 1)。 |
5. 和抽卡游戏的关系
| 本课组合 | 游戏效果 |
|---|---|
cin >> n |
玩家决定十连、百连等 |
for 里每次新的 r + if |
每一抽独立判稀有度 |
打印 i |
清楚是第几抽 |
第 7 课会给卡片 起名字(数组);本课先熟练「多抽」。
6. 怎么编译和运行
clang++ -std=c++17 -o lession6 lession6.cpp
./lession6
输入正整数。若输入 0,循环体一次都不执行,属于正常;负数本课不专门处理,可和家长讨论「该做哪些判断」当拓展。
7. 本课课堂小练习
- 在每一抽的输出里,顺便打印本次的 点数
r(和i一起),多运行几次,对照第 5 课区间是否一致。 - 把
for里i从 1 开始 改成从 0 开始、条件改成i < n(需同时改cout里显示第几抽,如i + 1)。能做出来说明你在思考「下标从 0」。
8. 本课课后作业(选做)
- 统计这一轮里 出了几次「超稀有」:在
main里加一个int变量,在else(超稀有的分支)里加 1,循环结束后cout打印总次数。 - 问家长:
while和for有什么不一样? 本课只用for就够;知道「另一种循环名」即可。
9. 常见小问题
- 只随机了一次:检查
r = ...rand...是否在for的{ }里。 - 想抽「固定 10 次」不写
cin:可以把n = 10;写死,仍然用for循环。 - 输入很大的
n:会打印很多行,可以先用小数字测。
10. 下一课预告
第 7 课学 数组 和 std::string:用编号对应「皮卡丘、小火龙」等名字,抽到稀有时打印具体卡名。
学完请家长在 学习进度与状态.md 里更新第 6 课的状态与作业完成情况。
下一课文档:第07课-卡片与数组.md