Files
chouka/old/第05课-稀有度与判断.md
2026-05-16 11:09:02 +08:00

131 lines
4.0 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.
# 第 5 课:稀有度与判断(`if` / `else`
**本课目标**:根据第 4 课得到的随机整数 **`r`**,用 **`if` / `else if` / `else`** 判断「抽到哪种稀有度」,并在屏幕上打印出来。这是抽卡游戏的 **核心逻辑**
**复习**:第 4 课 `rand` + `% 100` 得到 099 的 `r`。本课不问键盘,先专注 **分支判断**
---
## 1. 这一课要搞懂什么
- **`if (条件) { ... }`**:条件成立,就执行大括号里的语句。
- **`else if (条件) { ... }`**:前面都不成立,再试这一个条件。
- **`else { ... }`**:上面所有条件都不成立,就走这里(最后一档)。
- **比较运算符**(本课常用):`<` 小于、`>` 大于、`<=` 小于等于、`>=` 大于等于、`==` 等于、`!=` 不等于。
条件外面要加 **圆括号** `()`,语句块外面要加 **花括号** `{}`(本课先养成「每档都写 `{}`」的习惯)。
---
## 2. 稀有度怎么和数字对应?
下面用 **099**`r` 分成三档(概率只是举例,以后你可以改数字):
| `r` 的范围 | 约占比 | 结果 |
|------------|--------|------|
| 069 | 约 70% | 普通卡 |
| 7094 | 约 25% | 稀有卡 |
| 9599 | 约 5% | 超稀有卡 |
代码里写成:
- `r < 70` → 普通(069
- `r < 95` → 稀有(70~94)——注意:能进到这里时,`r < 70` 已经不成立了,所以实际是 70~94
- 剩下的 → 超稀有(9599
---
## 3. 完整示例程序
保存为 `lession5.cpp`
```cpp
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
std::srand(std::time(nullptr));
int r = std::rand() % 100;
std::cout << "你抽到了:";
if (r < 70) {
std::cout << "普通卡\n";
} else if (r < 95) {
std::cout << "稀有卡\n";
} else {
std::cout << "超稀有卡!!\n";
}
return 0;
}
```
多运行几次,观察三种结果都会出现(超稀有会较少,属正常)。
---
## 4. 调试小技巧:先看 `r` 是多少
不确定区间对不对时,可以先打印随机数:
```cpp
std::cout << "本次点数 r = " << r << "\n";
```
加在 `if` 之前,方便对照「数字落在哪一档」。
---
## 5. 和抽卡游戏的关系
| 本课学会 | 以后可以 |
|----------|----------|
| 分档判断 | 普通 / 稀有 / 传说 |
| 改数字 | 调概率(更难或更容易出稀有) |
| 加 `else if` | 多加一档「史诗」等 |
第 6 课会加 **循环**,按次数连续抽;第 7 课用 **数组** 给每档起卡名。
---
## 6. 怎么编译和运行
```bash
clang++ -std=c++17 -o lession5 lession5.cpp
./lession5
```
---
## 7. 本课课堂小练习
1.`if` 前增加一行,输出本次的 `r`(或「点数」),再运行多次,对照上一节的表格看是否合理。
2. 把「超稀有」条件改严一点:例如只有 `r >= 98` 才是超稀有(想想 `else` 里要对应哪一段 `r`)。
---
## 8. 本课课后作业(选做)
- 把三档概率改成你自己喜欢的比例(例如更容易出稀有),记录你改的 `<` 旁边的数字。
- 问家长:**为什么要先写 `r < 70` 再写 `r < 95`**,而不能把两个条件反过来?(提示:判断顺序像从上往下筛。)
---
## 9. 常见小问题
- **`if (r < 70);`** 后面多写了分号:可能导致大括号里的内容**总是**执行或逻辑错乱,本课每档用 `{ }` 包住最清晰。
- **用 `=` 代替 `==`**`if (r = 70)` 是赋值不是比较,容易出 bug;比较数字是否相等要用 `==`
- **想判断「是否等于 100」**:本课 `r` 最大是 99,若要 1~100 的范围要改 `rand` 那一行,以后可以再扩展。
---
## 10. 下一课预告
第 6 课学 **循环**`for`):按玩家输入的次数,连续抽很多次,不用复制粘贴很多遍 `if`
---
*学完请家长在 `学习进度与状态.md` 里更新第 5 课的状态与作业完成情况。*
**下一课文档**`第06课-循环与多抽.md`