131 lines
4.0 KiB
Markdown
131 lines
4.0 KiB
Markdown
# 第 5 课:稀有度与判断(`if` / `else`)
|
||
|
||
**本课目标**:根据第 4 课得到的随机整数 **`r`**,用 **`if` / `else if` / `else`** 判断「抽到哪种稀有度」,并在屏幕上打印出来。这是抽卡游戏的 **核心逻辑**。
|
||
|
||
**复习**:第 4 课 `rand` + `% 100` 得到 0~99 的 `r`。本课不问键盘,先专注 **分支判断**。
|
||
|
||
---
|
||
|
||
## 1. 这一课要搞懂什么
|
||
|
||
- **`if (条件) { ... }`**:条件成立,就执行大括号里的语句。
|
||
- **`else if (条件) { ... }`**:前面都不成立,再试这一个条件。
|
||
- **`else { ... }`**:上面所有条件都不成立,就走这里(最后一档)。
|
||
- **比较运算符**(本课常用):`<` 小于、`>` 大于、`<=` 小于等于、`>=` 大于等于、`==` 等于、`!=` 不等于。
|
||
|
||
条件外面要加 **圆括号** `()`,语句块外面要加 **花括号** `{}`(本课先养成「每档都写 `{}`」的习惯)。
|
||
|
||
---
|
||
|
||
## 2. 稀有度怎么和数字对应?
|
||
|
||
下面用 **0~99** 的 `r` 分成三档(概率只是举例,以后你可以改数字):
|
||
|
||
| `r` 的范围 | 约占比 | 结果 |
|
||
|------------|--------|------|
|
||
| 0~69 | 约 70% | 普通卡 |
|
||
| 70~94 | 约 25% | 稀有卡 |
|
||
| 95~99 | 约 5% | 超稀有卡 |
|
||
|
||
代码里写成:
|
||
|
||
- `r < 70` → 普通(0~69)
|
||
- `r < 95` → 稀有(70~94)——注意:能进到这里时,`r < 70` 已经不成立了,所以实际是 70~94
|
||
- 剩下的 → 超稀有(95~99)
|
||
|
||
---
|
||
|
||
## 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`
|