> **GESP等级：三级 | 考级考点：GESP Python 三级**

# 第20节 模拟法

**课程主题**：模拟算法思想入门
**课时**：60分钟
**授课对象**：7-10岁少儿
**教学形式**：五段式教学（10min导入 + 20min知识点 + 10min演示 + 15min实操 + 5min小测）

---

## 一、教学目标

### 知识与技能
1. 理解模拟法的核心思想——按规则一步步演
2. 掌握模拟四步法：确定状态→确定规则→循环推进→输出结果
3. 能用变量跟踪状态变化
4. 能用while或for循环实现模拟推进
5. 理解模拟和枚举的区别

### 过程与方法
- 通过"过家家"游戏类比理解模拟
- 通过"蜗牛爬井"可视化模拟过程
- 通过"猜数字"体验交互式模拟

### 情感态度价值观
- 培养"按规则做事"的逻辑思维
- 理解计算机是"听话的演员"——你编剧本它演
- 体会模拟在科学计算中的重要性

---

## 二、教学重难点

### 重点
- 模拟四步法：状态→规则→循环→结果
- 用变量记录状态变化
- 循环推进模拟过程

### 难点
- 如何设计状态变量
- 如何将自然语言规则翻译成代码
- 模拟与枚举的区别辨析

---

## 三、教学准备

| 项目 | 内容 |
|------|------|
| 硬件 | 电脑（每生一台）、投影仪 |
| 软件 | Python IDLE 或 VS Code |
| 教具 | 玩具蜗牛、井的图片、骰子、小棋子 |
| 素材 | 无特殊文件需求 |

---

## 四、教学过程

---

### 第一阶段：故事导入（10分钟）

#### 1.1 "过家家"故事

**老师**：小朋友们，你们玩过过家家吗？

**学生**：玩过！

**老师**：过家家的时候，你们会怎么做？

**学生**：一个人当爸爸/妈妈，一个人当宝宝，做饭、照顾宝宝...

**老师**：对了！过家家就是**模拟**——你来当导演，让事情按照你想的剧本一步步发生。

电脑也是一样！我们可以给电脑写一个"剧本"，让电脑按照规则一步步"演"出来。这就叫**模拟法**！

#### 1.2 生活中的模拟

| 场景 | 模拟什么？ | 规则是什么？ |
|------|-----------|-------------|
| 过家家 | 家庭生活 | 谁做饭谁带娃 |
| 飞行棋 | 棋盘游戏 | 掷骰子走格子 |
| 天气预报 | 天气变化 | 温度湿度变化规律 |
| 红绿灯 | 交通流量 | 红灯停绿灯行 |

#### 1.3 身体锚点

**"踏步走"动作**：
- 全班起立，老师喊"1、2、1、2..."
- 学生跟着踏步
- "每走一步，我们都在模拟走路的过程！"
- 加速、减速、停止

**状态变量**：走了多少步？（用伸出的手指表示步数）

#### 1.4 引出课题

"今天我们就来学**模拟法**——让电脑当演员，按我们的剧本一步步演！"

---

### 第二阶段：知识点讲解（20分钟）

---

#### 2.1 模拟四步法

**老师板书**：

```
模拟四步走：
  ① 确定状态 —— 有哪些变量要跟踪？
  ② 确定规则 —— 每步怎么变？
  ③ 循环推进 —— 一步步走
  ④ 输出结果 —— 最后怎么样了？
```

**口诀**：
> "状态→规则→循环→结果，模拟四步不犯错"

---

#### 2.2 第一步：确定状态

**状态** = 要跟踪记录的变量。

**例子——蜗牛爬井**：
```
蜗牛在井底（深度10米）
每天白天爬3米，晚上滑2米

要跟踪的状态：
  - 当前高度（current_height）
  - 过了几天（day）
  - 是否已出井（escaped）
```

**老师举例**：打游戏时，你也要跟踪状态——
- 血量（HP）
- 金币数
- 等级
- 当前位置

---

#### 2.3 第二步：确定规则

**规则** = 每一步怎么变化的规则。

```
蜗牛爬井规则：
  - 白天：高度 += 3
  - 如果高度 >= 井深，爬出来了！
  - 晚上：高度 -= 2
  - 但高度不能小于0（蜗牛不会掉到井底以下...好吧其实会）
```

**把规则写成伪代码**：
```
每天：
  高度 += 3          # 白天爬
  如果 高度 >= 井深：成功！
  高度 -= 2          # 晚上滑
  天数 += 1
```

---

#### 2.4 第三步：循环推进

用 **while 循环**一步步推进。

```python
# 蜗牛爬井的模拟
well_depth = 10   # 井深10米
height = 0        # 初始在井底
day = 0           # 第0天

while height < well_depth:
    day += 1
    # 白天爬
    height += 3
    print(f"第{day}天白天：爬到{height}米")
    
    # 检查是否出井
    if height >= well_depth:
        print(f"第{day}天成功出井！")
        break
    
    # 晚上滑
    height -= 2
    print(f"第{day}天晚上：滑到{height}米")
```

---

#### 2.5 第四步：输出结果

```python
print(f"蜗牛用了{day}天爬出{well_depth}米深的井！")
```

---

#### 2.6 经典问题1：模拟蜗牛爬井

完整程序：

```python
well_depth = 10
height = 0
day = 0

print(f"井深{well_depth}米，每天爬3米滑2米")
print("=" * 30)

while height < well_depth:
    day += 1
    height += 3
    print(f"第{day}天白天：爬到{height}米")
    
    if height >= well_depth:
        print(f"\n成功！第{day}天爬出井口！")
        break
    
    height -= 2
    print(f"第{day}天晚上：滑到{height}米")
```

**学生互动**：猜猜10米深需要几天？
（答案：第8天，因为第7天爬到9米滑到7米，第8天爬到10米就出去了）

---

#### 2.7 经典问题2：模拟小猫分鱼

**故事**：5只小猫分一堆鱼。
> 小猫们轮流来分鱼：第一只把鱼分成5份，多一条扔掉，拿走一份；
> 第二只来了，以为自己是第一个，也分成5份，多一条扔掉...

问：原来至少有多少条鱼？

**分析**：
```
状态：当前鱼的数量
规则：鱼数-1 再分成5份，拿走1份，剩下4份
条件：每次都能被5整除余1
```

**代码**：
```python
# 从最后往前推（逆向模拟）
fish = 1  # 最后剩下的

while True:
    total = fish
    ok = True
    for _ in range(5):  # 5只猫
        if (total - 1) % 5 != 0:
            ok = False
            break
        total = (total - 1) // 5 * 4
    if ok:
        print(f"原来至少有{fish}条鱼")
        break
    fish += 1
```

---

#### 2.8 经典问题3：模拟猜数字

```python
import random

secret = random.randint(1, 100)
guess = None
attempts = 0

print("我想了一个1-100的数字，你猜！")

while guess != secret:
    guess = int(input("你的猜测："))
    attempts += 1
    
    if guess < secret:
        print("小了！")
    elif guess > secret:
        print("大了！")

print(f"猜对了！就是{secret}，用了{attempts}次！")
```

---

#### 2.9 模拟 vs 枚举的区别

| 对比项 | 模拟法 | 枚举法 |
|--------|--------|--------|
| 核心 | 按时间一步步推演 | 一次性试所有可能 |
| 适合 | 过程变化的问题 | 选择/筛选类问题 |
| 循环 | while居多，条件驱动 | for居多，范围驱动 |
| 比喻 | 过家家、剧本表演 | 一把钥匙一把把试 |

**记忆口诀**：
> "模拟是导演，按剧本一步步演"
> "枚举是考官，把所有答案都看一遍"

---

### 第三阶段：教师演示（10分钟）

#### 3.1 演示1：蜗牛爬井

运行代码，展示每天蜗牛爬和滑的过程。

**老师**用黑板画图配合：
```
井口 ___
      |
第1天  3 → 1（滑2米）
第2天  4 → 2
第3天  5 → 3
...
第8天  10 → 出去！
```

#### 3.2 演示2：turtle蜗牛爬井

运行 `03_模拟法.py` 的turtle演示，乌龟每天往上爬一段再滑下来。

#### 3.3 演示3：猜数字游戏

和全班一起玩——老师当电脑，学生猜，记录次数。

---

### 第四阶段：学生实操（15分钟）

#### 实操任务1：模拟存钱罐（5分钟）

**要求**：
1. 每天往存钱罐里放5元
2. 每7天（一周）要花掉10元
3. 模拟30天，看看最后有多少钱

**参考代码**：
```python
money = 0
for day in range(1, 31):
    money += 5  # 每天存5元
    if day % 7 == 0:  # 每7天花10元
        money -= 10
    print(f"第{day}天：{money}元")
print(f"30天后一共有{money}元")
```

#### 实操任务2：模拟跑步（5分钟）

**要求**：
1. 小明每天跑1公里
2. 每3天状态好，多跑1公里
3. 每5天状态差，少跑1公里
4. 模拟15天，输出每天跑的里程

```python
# 学生自己写
```

#### 实操任务3：模拟红绿灯（5分钟）

**要求**：
1. 红灯亮30秒
2. 绿灯亮25秒
3. 黄灯亮5秒
4. 模拟2分钟，输出每一秒的状态

```python
# 提示：用循环模拟每一秒
for second in range(1, 121):
    # 计算当前是哪个灯在亮
    cycle = second % 60
    if cycle <= 30:
        color = "红灯"
    elif cycle <= 55:
        color = "绿灯"
    else:
        color = "黄灯"
    print(f"第{second}秒：{color}")
```

---

### 第五阶段：小测验（5分钟）

#### 题目1（选择题）
模拟法的核心是什么？
A. 把所有可能都试一遍  B. 按规则一步步推演  C. 用公式直接算  D. 随机猜测

**答案**：B

#### 题目2（填空题）
模拟四步法是：①确定____ ②确定____ ③____推进 ④输出____

**答案**：状态、规则、循环、结果

#### 题目3（判断题）
模拟法和枚举法是同一种算法。（对/错）

**答案**：错。模拟是按时间一步步推演，枚举是一次性试所有可能。

#### 题目4（分析题）
蜗牛爬井，井深10米，白天爬3米，晚上滑2米。
问：第几天能爬出井口？

**答案**：第8天。模拟过程：
第1天：爬到3→滑到1
第2天：爬到4→滑到2
第3天：爬到5→滑到3
第4天：爬到6→滑到4
第5天：爬到7→滑到5
第6天：爬到8→滑到6
第7天：爬到9→滑到7
第8天：爬到10→出井！

#### 题目5（选择题）
以下哪个场景**不适合**用模拟法？
A. 模拟天气预报  B. 模拟交通流量  C. 从100个数里找最大的  D. 模拟病毒传播

**答案**：C。找最大的适合用枚举或直接比较。

---

## 五、板书设计

```
+========================================+
|          模拟法（过家家算法）            |
+========================================+
|                                         |
|  四步法：                               |
|  ① 状态 —— 要跟踪什么变量             |
|  ② 规则 —— 每步怎么变                 |
|  ③ 循环 —— 一步步推进                 |
|  ④ 结果 —— 最后输出                   |
|                                         |
|  例子：蜗牛爬井                        |
|  井深10m，白天+3m，晚上-2m            |
|  第8天出井！                           |
|                                         |
|  模拟 vs 枚举：                         |
|  模拟=演连续剧  枚举=刷题库           |
+========================================+
```

---

## 六、课后作业说明

参见《课后练习_第20节.md》文件。

**作业要点**：
1. 基础模拟练习——巩固四步法
2. 蜗牛爬井变式——举一反三
3. 创意挑战——自己设计模拟游戏

---

## 七、常见错误与应对

| 错误 | 原因 | 解决方法 |
|------|------|---------|
| 死循环 | 忘记更新状态变量 | 检查循环体内是否有状态更新 |
| 状态变量不够 | 漏了需要跟踪的量 | 先列清单再写代码 |
| 边界条件错误 | 大于小于搞混 | 用纸笔画图验证 |
| 忘记初始值 | 变量没有初始值 | 在循环前设置好初始状态 |

---

## 八、教学反思（教师填写）

| 维度 | 评价 | 备注 |
|------|------|------|
| 导入环节 | ___/5 | 过家家比喻是否合适 |
| 四步法讲解 | ___/5 | 学生是否理解 |
| 蜗牛爬井 | ___/5 | 是否引起兴趣 |
| 实操环节 | ___/5 | 完成度 |
| 小测 | ___/5 | 正确率 |

---

## 九、拓展延伸

### 模拟的应用领域
- 天气预报（模拟大气变化）
- 飞行模拟器（训练飞行员）
- 流行病传播模拟（COVID-19）
- 经济金融模拟（股市走势）

### 家庭互动
- 和爸妈一起模拟：一个月家庭开支
- 模拟一个星期的天气变化

---

*教案编写日期：2026年6月*
*适用阶段：19_文件与算法入门*
