---
课时: 7
主题: 魔幻俄罗斯方块（下）— 魔改升级 + AI 自动测试
核心能力: [拆解力, 共创力, 韧性力]
核心工具: [Kimi 2.5]
时长: 90分钟
透明化层级: 过程层
适用路线: AICODE-06
---

### 1. 课程目标

**知识目标：**
- 理解「自动化测试」的概念：不靠人工玩，让代码自己验证代码，更快更全面
- 理解「测试覆盖」：需求文档里每一条规则，都应该有一条对应的测试
- 理解功能扩展的增量思维：新功能只写「增量」，不重写整体

**能力目标：**
- 能把需求文档转化为测试条件，交给 AI 生成测试脚本（拆解力）
- 能读懂测试脚本的 ✅❌ 结果，把失败的测试溯源到需求文档（韧性力）
- 能独立完成「需求 → 审核 → 生成 → 测试 → 修复」完整闭环（共创力）

**情感目标：**
- 体验「一键跑测试，马上知道哪里有问题」带来的效率感
- 建立「测试通过才算完成，不是能玩就算完成」的质量意识
- 感受从「每次手动点来点去找 bug」到「测试脚本自动找 bug」的升级

---

### 2. 核心概念与误概念预设

**核心概念认知层级：**

| 概念 | 学生类比 | 认知层级 |
|------|---------|---------|
| 自动化测试 | 与其自己每次手动检查作业有没有写对，不如写一个「答案核对程序」，把你的答案输进去，自动判断对错 | 理解层 |
| 测试覆盖 | 需求文档里写了10条规则，测试脚本就要测10件事——少测一条，那条出了 bug 你就不知道 | 应用层 |
| 边界条件 | 不只测「正常情况」，还要测「极端情况」——比如方块刚好在边角旋转、同时消4行、积木堆到最顶 | 应用层 |
| 增量需求文档 | 只写「新加的部分」，不重写整体——就像给手机升级系统，不是重新买一台手机 | 理解层 |
| 新窗口原则 | 让同一个人既写方案又审方案，他永远找不出大问题——审核和测试必须开新窗口，让没有上下文的新 AI 来做，才能客观找出漏洞 | 应用层 |

**典型误概念表：**

| 编号 | 误概念 | 正确认知 | 激发策略 |
|------|--------|---------|---------|
| M1 | 测试就是自己玩一遍，没出问题就算通过 | 手动测试只能发现你刚好测到的问题；自动测试每次都覆盖所有条件，不会遗漏 | 「你刚才玩的时候，有没有特意测『同时消4行的得分是不是800』？」 |
| M2 | 测试脚本是程序员才会写的东西 | 把你的需求文档给 AI，AI 就能帮你把每条需求变成一个测试 | 现场演示：需求文档→AI→测试脚本，5分钟完成 |
| M3 | 加新功能要把整个游戏重新做一遍 | 增量需求文档只写新加的部分，在已有代码上加，不是重做 | 演示增量需求文档的写法 |
| M4 | 测试通过了就说明没有 bug | 测试只能覆盖你想到的情况；没覆盖的情况仍然可能有 bug——所以需求文档要写详细 | 「你的测试脚本有没有测『反重力期间消行』？」 |
| M5 | 测试失败说明代码写错了 | 测试失败可能是代码问题，也可能是需求文档没说清楚——先溯源，再决定改哪里 | 展示一个「测试失败但代码没错，是需求文档漏写了」的案例 |
| M6 | 需求审核、测试脚本生成可以在写需求的同一个窗口里做 | 上下文污染——AI 会受之前对话影响，不会客观审核自己生成的东西。审核和测试必须开新窗口 | 演示：同一窗口让 AI 审核自己写的需求，回答很保守；新窗口审核，问题暴露更多 |

---

### 3. 教学准备

**工具与环境：**
- 每台电脑已登录 Kimi 2.5，网络正常
- 学生上节课（第6课）完成的俄罗斯方块 HTML 文件保存在桌面
- 投影可切换至任意学生屏幕
- 准备路演计时器（3分钟倒计时）

**教学资源：**
- 教师准备：增量需求文档模板（见第5节）
- 教师准备：生成测试脚本的提示词（见第5节）
- 教师准备：一份提前生成好的测试脚本演示（包含1个 ✅ 和1个 ❌，用于导入展示）
- 教师准备：功能灵感参考清单（见第5节）
- 教师准备：路演结构引导卡（见第5节）
- 学生资源：第6课完成的俄罗斯方块 HTML 文件 + Level 0 需求文档

**教师备课体验任务：**
> 备课前，教师必须亲自完成以下操作：
>
> 1. 用自己的俄罗斯方块代码 + 需求文档，让 Kimi 生成测试脚本，实际运行并记录结果
> 2. 故意在需求文档里漏写一条规则，观察测试脚本是否能发现对应的 bug
> 3. 准备一个演示用的「测试结果页面」，包含至少1个 ✅ 和1个 ❌，用于课堂导入
> 4. 提前试跑「炸弹方块」功能的增量需求文档完整流程，记录 AI 审核会问什么问题

---

### 4. 教学流程

---

**第一幕：联系 (Connect) — 10分钟** 🔗

*本幕目标：用每人的功能构想激活学生兴趣，制造「今天不只是加功能，还要学一个新技能」的认知悬念*

**【环节】上节课回顾 (4分钟)**

**师：** 上节课结束前，我让你们想一个今天要加的功能，而且在出门前每人说了一句话。我们来回顾一下——上节课我们用了 Plan Mode，它有几步？谁来说？
【诊断点：检测 Plan Mode 三步流程的记忆保持度】【识别层】

**生：** （预期：打开 Plan Mode → 写需求文档 → 让 AI 审核……）

**【分支A】若学生能说出三步（写文档、审核、执行）：**
**师：** 说得很准。今天还是这三步，但是有一点不一样——今天写的是「增量需求文档」，不是重新写整个游戏。等会儿我会解释区别在哪里。

**【分支B】若学生只说出一两步：**
**师：** 没关系，我帮你补一下。Plan Mode 三步：第一步，写需求文档，把你想做的东西说清楚；第二步，需求审核，让 AI 扮演审核工程师找漏洞；第三步，执行，生成代码。今天还是这三步，我们继续。

**师：** 好，现在说说你想加的功能——每人说一个，我把它们写在黑板上。
【每人快速说一个，教师写在白板/投屏上，列成一列】

**生：** （各自说出功能：炸弹方块、速度加成、冻结方块、彩虹消行……）

**师：** 大家看一下黑板——（指着功能列表）这里有六个不同的功能方向，没有两个人做一样的。你们今天各自在做一个完全不同的版本。

**师：** 我们来做一件有趣的事——互相评一下别人的功能想法。你觉得黑板上哪一个功能听起来最难描述清楚？
**生：** （讨论，指出某个功能）
**师：** 为什么觉得难？
**生：** （例如：「重力反转不知道要怎么写规则」「炸弹不知道爆炸范围算不算消行」）
**师：** 你们刚才说的这些「不知道」，就是今天需求文档里必须写清楚的部分。不写清楚，AI 就会自己决定，结果可能跟你想的完全不一样。

**【环节】引发认知冲突 + 悬念铺垫 (6分钟)**

**师：** 我再问你们——你刚才说想加的功能，你觉得最难描述清楚的规则是哪一条？比如你想加炸弹方块，「炸弹爆炸」这件事，你要怎么告诉 AI？
【诊断点：探测学生对「把直觉转化为精确规则」的困难点认知】【理解层】

**生：** （各自说出难点——爆炸范围？爆炸后消行吗？得分怎么算？）

**师：** 很好，你已经在思考这个问题了。等会儿写需求文档的时候，那条规则要特别仔细。

**师：** 今天除了加功能，我们还会学一个新技能。上节课你们手动测试游戏——自己玩、自己找 bug，对吗？手动测试有一个问题，一会儿让你们自己感受。
【故意不展开，制造悬念】

**师：** 我问你们——你的游戏有5条规则，你在手动测的时候，你能保证5条都测到了吗？
**生：** （预期：不一定……有点难……）
**师：** 等会儿让你们亲身体验这个问题，我们先进建构。

**师：** 打开你上节课的游戏文件，确认能正常运行。我们进入建构阶段。

---

**第二幕：建构 (Construct) — 65分钟** 🛠️

---

**【分段一：增量需求文档 + 需求审核】(15分钟)**

*本段重点：理解「增量」思维，写出可测试的需求文档，尤其是交互规则和验收标准*

**预设误概念：**
- 误概念 M3：加新功能要把整个游戏重做
- 误概念：验收标准可以写成「功能正常」这种模糊的话

**讲解与演示 (Teach & Demo): (5分钟)**

**师：** 今天继续用 Plan Mode。但今天写的是「增量需求文档」——只写新加的部分，不重写整个游戏。

**师：** 类比一下——你手机升级系统，是重新买一台手机，还是只更新改变的那一部分？
**生：** （预期：只更新改变的部分）
**师：** 对。增量需求文档就是这个意思：你的游戏核心逻辑不动，你只描述「要在这个基础上加什么」。

**师：** 增量需求文档有一个特别重要的部分，叫「与原有功能的交互规则」。我举一个具体例子——你加了炸弹方块。炸弹落地，爆炸了。爆炸之后刚好把整行都消干净了——这算消行吗？得多少分？是按炸弹规则算，还是按消行规则算，还是两个叠加？

**师：** 如果你没写清楚，AI 自己决定，结果可能跟你想的完全不一样。所以交互规则必须写。

**师：** 还有一个字段叫「验收标准」。它的格式是这样的：
**「[情况] → [预期结果]」**
比如：「炸弹落地时周围没有积木 → 爆炸动画播放，得分+50，无消行」。
验收标准必须是可以测试的——能测试 = 说清楚了具体情况，说清楚了预期结果。不能写「功能正常运行」，那不是验收标准，那是废话。

**师：** 我来考考你们——以下两条验收标准，哪条是可测试的？
- A：「炸弹功能运行正常」
- B：「炸弹落地后，落点周围3×3格内的积木清除，得分+50」

**生：** （预期：B）
**师：** 对，B 是可测试的——它告诉了 AI「清除3×3范围」和「+50分」。A 是废话——AI 不知道「正常」是什么意思。你的验收标准必须全部像 B 这样写。
【投屏展示增量需求文档模板，见第5节】

**学生实践 (Practice): (8分钟)**

1. 学生填写增量需求文档（重点：功能规则 + 交互规则 + 验收标准）
2. **⚠️ 开新窗口**：复制需求文档内容，打开全新的 Kimi 对话，执行「需求审核」提示词
   - 不能在写需求的同一个窗口里审核——AI 会受上下文影响，不会客观指出问题
3. 回答 AI 的问题，把答案补充进需求文档（回到原来的窗口补充）

> 教师走动：检查以下三项——是否写了「与原有功能的交互规则」？验收标准是否是「情况 → 预期结果」格式？验收标准条数是否至少3条？

**进度同步 (Checkpoint): (2分钟)**

**师：** AI 审核出了什么？有没有让你意外的问题？
**生：** （分享，例如：「AI 问我炸弹同时触发消行怎么算」）

**【分支A】若学生说 AI 问出了没想到的问题：**
**师：** 这个问题你之前有想到吗？
**生：** 没有……
**师：** 所以 AI 审核是真的有用的——它问的问题不是废话，是你确实需要回答的问题。

**【分支B】若学生说 AI 没审出什么问题：**
**师：** 把你的需求文档发我看一下。（观察）——你的验收标准里有没有写边界情况？比如「功能触发时恰好也消行」这种情况？如果没有，让 AI 专门针对边界情况再审一遍。

**师：** 好，需求文档基本确认了，进入执行阶段。

---

**【分段二：生成第一版 → 手动测试 → 感受痛点】(15分钟)**

*本段重点：先让学生亲身体验手动测试的局限，再自然引出「让电脑帮我们测」的需求*

**预设误概念：**
- 误概念 M1：手动玩一遍没出问题就算通过
- 误概念：测试只需要测「好不好玩」，不需要逐条对照需求

**讲解与演示 (Teach & Demo): (2分钟)**

**师：** 把确认好的增量需求文档提交 Kimi，基于上节课的代码增加新功能。
【投屏展示「增量生成」提示词，见第5节】

**师：** 生成之后，先手动测几条——自己玩一玩，看看新功能有没有按需求做出来。特别注意：不是随便玩，是对照着你的验收标准一条条测。

**学生实践 (Practice): (10分钟)**

1. 提交增量需求文档 + 旧代码给 Kimi，生成第一版
2. 打开游戏，手动测试：新功能触发了吗？原有消行/得分还正常吗？
3. 对照验收标准逐条检查，记录发现的问题

> 教师走动观察：故意不干预，让学生自己感受「手动测试的局限」。观察：是否有学生只是「玩了一会儿」而没有逐条对照验收标准？是否有学生根本没有测「新功能和消行同时触发」的边界情况？是否有学生测了3条就觉得「差不多了」？

**进度同步 (Checkpoint): (3分钟)**

**师：** 手动测了哪几条？对照你的验收标准，你测了几条？
**生：** （预期：2条、3条……）

**师：** 你的验收标准里一共有几条？
**生：** 5条……

**师：** 你测了3条，还有2条没测。你确定那2条没有问题吗？
**生：** 不确定……

**师：** 还有一个问题——就算今天你把所有5条都测了，下次你改了代码，你还要重新手动测一遍。如果你做了第二版、第三版，每次都要从头手动测一遍。需求文档越来越长，要测的条数越来越多，手动测试需要的时间也越来越长。

**师：** 有没有办法，让电脑帮我们测，而且每次都自动把所有条件测完？

**【分支A】若有学生说「那肯定有程序能做这个」：**
**师：** 你说对了！这个东西叫测试脚本。我们现在就去做一个。

**【分支B】若学生面面相觑，不知道答案：**
**师：** 答案就是——用 AI 帮我们写一个测试脚本。这个脚本会自动运行你的游戏逻辑，逐条对照需求文档，告诉你哪条通过了、哪条失败了。我来给你们看一下它长什么样。

---

**【分段三：AI 生成测试脚本 → 跑测试 → 修复】(25分钟)**

*本段重点：生成并运行测试脚本，学会读懂 ✅❌ 结果并溯源，建立「测试才算完成」的质量意识*

**预设误概念：**
- 误概念 M2：测试脚本是程序员才会写的
- 误概念 M5：测试失败说明代码写错了，不可能是需求问题
- 误概念：看不懂代码就没法用测试脚本

**讲解与演示 (Teach & Demo): (6分钟)**

**师：** 我来给你们看一个东西。
【投屏展示教师提前准备好的测试结果页面，显示 ✅❌ 列表】

**师：** 在看之前，先讲一个重要规则——**生成测试脚本必须开新窗口。** 这和上节课需求审核的原因一样：AI 不会承认自己的问题。你在写游戏代码的同一个窗口里让 AI 生成测试，它会倾向于「测试通过」，因为它觉得自己写的代码没问题。换新窗口，让新的 AI 来测，它才会客观地发现问题。

**师：** 整个项目的窗口规则是这样的：写需求一个窗口、审核需求一个新窗口、生成代码一个新窗口、生成测试一个新窗口。**每个独立的任务，都在自己干净的窗口里做，避免上下文污染。**

**师：** 这是一个测试脚本跑出来的结果。你们来读一下——
- ✅ 消1行得分100分：通过
- ✅ 消2行得分300分：通过
- ✅ 消4行得分800分：通过
- ❌ 炸弹爆炸得分：期望50，实际得到0
- ✅ 游戏结束条件：通过
- ❌ 炸弹+消行叠加得分：期望150，实际得到100

**师：** 它自动测了6条规则，告诉我哪些通过了、哪些失败了，还说明了失败的具体原因——期望是多少，实际是多少。我没有玩游戏，是代码自己测自己。

**师：** 你们说，这个测试脚本是怎么工作的？它是怎么知道「消1行应该得100分」的？
**生：** （预期：从需求文档里知道的？）
**师：** 对！测试脚本的工作方式就三步：第一步，构造一个具体的场景——比如「棋盘最底行全满了一行」；第二步，调用游戏里的消行函数；第三步，对比结果和需求文档里写的数字。需求文档说100分，结果也是100分，就是 ✅；结果是别的数字，就是 ❌。

**师：** 你不需要看懂每一行代码。你只需要：能读 ✅❌ 结果、能看懂失败原因、能判断是代码问题还是需求文档问题。

**师：** 怎么判断失败原因？方法是这样的——
**师：** 如果 ❌ 显示「期望50，实际0」，你先查需求文档：文档里有没有写「炸弹爆炸得50分」？
**师：** 如果需求文档写了，但代码算出来是0，那是代码问题——让 AI 修代码。
**师：** 如果需求文档漏写了这条规则，那是需求问题——先补需求文档，再重新生成代码。

【投屏展示「生成测试脚本」提示词，见第5节】

**学生实践 (Practice): (15分钟)**

1. 把需求文档 + 游戏代码提交 Kimi，生成 `test.html`
2. 双击打开 `test.html`，查看测试结果
3. 对每一个 ❌，按以下步骤处理：
   - 读失败原因：「期望 X，实际 Y」
   - 查需求文档：这条规则文档里写清楚了吗？
   - 如果是代码问题 → 告诉 Kimi「这个测试失败了：[失败信息]，帮我修复」
   - 如果是需求问题 → 先补充需求文档，再让 AI 重新生成代码
4. 修复后重新跑测试，目标：全部 ✅

> 教师走动观察重点：
> - 学生是否看到 ❌ 就直接让 AI「修代码」，而没有先判断是需求问题还是代码问题？
> - 是否有学生测试结果全是 ✅，但游戏实际上还有问题？此时引导：「哪条 bug 对应的规则，在需求文档里没有写到？」
> - 是否有学生 `test.html` 打开是空白？提示使用「测试失败溯源」提示词

**进度同步 (Checkpoint): (4分钟)**

**师：** 你的测试脚本发现了几个 ❌？哪一个让你最意外？
【诊断点：学生是否发现了手动测试时没有发现的问题】【应用层】

**【分支A】若测试发现了手动没发现的 bug：**
**师：** 这个 bug 你刚才手动玩的时候发现了吗？
**生：** 没有……
**师：** 这就是自动测试的价值——你没想到去测的地方，它帮你测了。想象一下，如果你发布了这个版本，别人玩到这个 bug 会怎么样？
**生：** 会觉得游戏有问题……
**师：** 但是因为你有测试脚本，你在发布之前就知道了。这就是「安全网」。

**【分支B】若测试全部通过：**
**师：** 全部通过——说明你的需求文档写得很清楚，AI 也执行得准确。但我再问一下：测试脚本测了几条？你的验收标准里有几条？
**生：** （如：测了5条，文档里写了7条……）
**师：** 有2条没有被测到。是不是那2条在生成测试脚本的时候，AI 没找到对应的逻辑？或者写得不够清楚，没办法生成测试？把那2条拎出来，让 AI 单独补测。

**【分支C】若测试脚本打不开或全是错误：**
**师：** 不要慌，这种情况很正常。我们用「最小化调试法」——不是让 AI 修整个测试脚本，而是只请它「单独测一条最简单的规则，比如消1行得100分」，先让一条测试跑起来，再逐步扩展。

---

**【分段四：有了安全网，放心魔改——第二版、第三版】(10分钟)**

*本段重点：建立「跑测试 → 确认安全 → 再改代码」的迭代习惯，鼓励学生大胆扩展*

**预设误概念：**
- 误概念：有了测试脚本，每次改完不用跑，「应该没问题」
- 误概念：第一版做到及格就行，没必要做第二版

**讲解与演示 (Teach & Demo): (3分钟)**

**师：** 你现在有了一个测试脚本。这个测试脚本是你的「安全网」。它的具体意义是什么？

**师：** 没有安全网的时候，你怕改出问题，所以不敢改太多。每次改完要自己手动测半天，万一改出新 bug 还得找半天。结果是——你不敢大胆加功能。

**师：** 有了安全网之后：每次改完代码，双击 `test.html`，10秒钟看结果。全部 ✅，说明原有功能没被破坏，可以继续加。出现 ❌，马上知道哪里出问题，立刻修。这就是「安全网」的具体作用——让你敢放心改代码。

**师：** 所以现在，有了安全网，我们才敢做更大胆的第二版。去做——比第一版更酷、更复杂。每加完一个功能，跑一遍测试，确认 ✅ 再继续加下一个。

**学生实践 (Practice): (5分钟)**

1. 在第一版基础上继续扩展——加第二个功能，或者把第一个功能做得更完整
2. 每次生成新代码后，跑 `test.html`，确认没有破坏原有逻辑
3. 有余力的学生继续做第三版，目标：做出功能灵感清单里「⭐⭐⭐」的功能

> 教师走动：鼓励学生跑测试，发现有学生只靠手动玩来验证时，提示：「跑一遍测试脚本，10秒就有答案，比手动玩快多了。」

**进度同步 (Checkpoint): (2分钟)**

**师：** 做了第二版的举手。你加了什么？跑测试了吗？结果怎样？
【诊断点：学生是否形成「加功能 → 跑测试 → 检查结果」的迭代习惯】【应用层】

**【分支A】若学生说「跑了测试，全部通过，然后继续加」：**
**师：** 这就是正确的迭代节奏。以后做任何项目都是这个节奏。

**【分支B】若学生说「加了功能但忘记跑测试」：**
**师：** 现在跑一遍。——有没有 ❌？
**生：** （跑完结果）
**师：** 如果有 ❌，这就是「不跑测试的代价」——你可能在不知情的情况下，新加的功能破坏了原来的逻辑。

---

**第三幕：反思 (Contemplate) — 10分钟** 🤔

*本幕目标：通过路演和互评，让学生反思「测试覆盖」的本质，以及「需求文档质量 = 测试质量」的核心认知*

**【环节】成果路演 (7分钟)**

**师：** 每人1.5分钟路演（6人小班）。路演有引导卡，大家拿一张。
【发放路演结构引导卡，见第5节】

**师：** 路演不是「打开游戏给大家看」——那只是演示，不是路演。路演要讲三件事：你加了什么功能、测试脚本发现了什么、你怎么修的。开始。

（每人依次路演，教师计时。路演要点：）
- 展示最终版本游戏（20秒演示）
- 展示测试脚本的 ✅❌ 结果（告诉大家发现了几个 ❌）
- 重点讲：最意外的那个 ❌ 是代码问题还是需求问题？怎么修的？
- 一句话总结：「如果重来一次，需求文档哪里会写得不一样？」

> 教师观察：是否有学生的路演只说了「我加了炸弹方块」，但没有说测试相关的内容？提示：「测试脚本发现了什么？」

**【环节】互评与讨论 (3分钟)**

**师：** 刚才大家的路演里，哪一个测试脚本发现的问题最有价值？
**生：** （讨论）

**师：** 我们来做一个结构化互评——选一位刚才路演的同学，给他的作品说「一个你觉得做得好的地方」和「一个你觉得可以改进的地方」。
**生：** （互评，例如：「他的炸弹功能很酷，但是我觉得爆炸范围可以更大一点」）
**师：** 「更大一点」——具体怎么大？你能告诉他怎么写到需求文档里吗？
**生：** （尝试表达：「爆炸范围从3×3改成5×5」）
**师：** 这就是一条可测试的需求改进建议。他可以把这条加到需求文档里，然后让 AI 重新生成。

**师：** 有没有人的测试结果全是 ✅，但路演时我们发现游戏还是有问题？
**生：** （可能有学生举手）
**师：** 这说明什么？
**生：** （预期：测试没有覆盖到那个情况……）
**师：** 对。测试只能发现「你写进需求文档的问题」。你没写的，它不知道要测。这就是为什么需求文档要尽量详细——需求文档越完整，测试覆盖越全，漏掉的 bug 越少。

**师：** 给今天的工作做一个评分——需求文档 100 分、测试脚本 100 分、游戏功能 100 分，你自己的三项各给多少分？
（让学生自评，不需要出声，心里有数就好）

**师：** 哪位愿意说说自己的分？
**生：** （分享，例如：「需求文档70，测试80，功能90」）
**师：** 三项里面，哪一项你觉得下次会做得更好？
**生：** （分享）
**师：** 记住这个答案。这就是你下一个项目要重点改进的地方。

---

**第四幕：延续 (Continue) — 5分钟** 🚀

**【环节】抽象总结 (3分钟)**

**师：** 两节课，我们走了一个完整的流程。谁来说说是哪几步？
**生：** Plan Mode → 需求文档 → 审核 → 生成 → 测试 → 修复……

**师：** 对。这个流程有个名字：需求 → 实现 → 测试 → 修复。真实的工程师每天都在走这个循环。
**师：** 今天最重要的一句话：**「测试通过才算完成，不是能玩就算完成。」**
**师：** 能玩是 60 分，测试通过是 90 分，需求文档里每一条都有测试覆盖是 100 分。

**师：** 还有一件事——今天你们体验了什么是「安全网」。这不只是测试脚本的概念，这是一种工作方式：在做危险操作之前，先建立一个保护机制。以后你们做任何项目，都可以问自己：「我有没有安全网？」

**师：** 最后，我想让你们想一个问题——今天学到的「需求文档 → 测试 → 修复」这个流程，除了做游戏，还能用在哪里？
**生：** （讨论：做网站？做 App？……）
**师：** 对。你们今天走的这个流程，和真实的工程师在公司里走的流程是一样的。只不过他们的项目更大、需求文档更长、测试脚本更复杂。但方法是一样的。

**【环节】下节预告 + 5分钟挑战 (2分钟)**

**师：** 接下来的课程，你们会做更大的项目。今天学到的——Plan Mode、需求审核、自动测试——会一直用到，只是项目变得更复杂。你们已经有了完整的工具箱。

**师：** 本周5分钟AI挑战：找到你需求文档里一条没有被测试覆盖到的规则，把它补进需求文档，然后让 Kimi 给测试脚本加上这条测试，跑一下看是 ✅ 还是 ❌。下节课说出你补的是哪条规则，测试结果是什么。

---

### 5. AI 助教使用指南

**⚠️ 新窗口使用规则（必须遵守）：**

```
本课四个阶段的窗口规则：

窗口 A：写增量需求文档（整理新功能需求用这个窗口）
窗口 B：需求审核（全新窗口——AI 不会承认自己写的有问题）
窗口 C：执行生成（全新窗口——基于原代码增加新功能）
窗口 D：生成测试脚本（全新窗口——让新 AI 客观测试）

核心原则：审核、测试必须换新窗口。在同一个窗口里又写又审
又测，叫「上下文污染」——AI 会偏向为自己生成的内容辩护，
找不出真正的问题。
```

**增量需求文档模板（学生填写）：**

```
# 新功能需求文档：[功能名称]

## 功能描述
[用一两句话说清楚这个功能是什么]

## 触发条件
[什么情况下这个功能会出现/触发？]

## 功能规则
[这个功能具体怎么运作？每条规则尽量具体]

## 与原有功能的交互规则
- 与消行的交互：[这个功能触发时，如果同时消了行，怎么处理？]
- 与得分的交互：[这个功能会影响得分吗？怎么影响？]
- 与游戏结束的交互：[游戏结束时，这个功能有没有特殊处理？]

## 验收标准（每条都要能自动测试）
1. [情况] → [预期结果]
2. [情况] → [预期结果]
3. [情况] → [预期结果]
```

**「增量生成」提示词：**

```
我已经有一个俄罗斯方块游戏（代码在下面）。
现在需要在这个基础上增加一个新功能，需求如下：

[粘贴增量需求文档]

要求：
1. 在已有代码基础上增加，不要改变原有功能的行为
2. 严格按照需求文档实现，不要添加文档里没有提到的内容
3. 核心逻辑函数（collides、clearLines、rotate 等）必须保持独立，
   不要把逻辑和渲染混在一起（方便后续生成测试脚本）
4. 输出完整的 HTML 文件（内联 CSS 和 JS）

已有代码：
[粘贴游戏 HTML 代码]
```

**「生成测试脚本」提示词（本课核心）：**

```
我有一个俄罗斯方块游戏，代码如下：

[粘贴游戏 HTML 代码]

我的需求文档如下：

[粘贴需求文档]

请帮我生成一个独立的 test.html 文件，要求：
1. 把游戏的核心逻辑函数（碰撞检测、消行、得分计算等）提取出来
2. 根据需求文档里的每一条规则，编写一个对应的测试
3. 每个测试构造一个具体的场景，调用函数，验证结果是否符合需求
4. 在页面上显示测试结果：✅ 通过 / ❌ 失败（失败时说明期望值和实际值）
5. 不需要任何外部依赖，双击 test.html 就能在浏览器里运行

重点测试的边界条件：
- 方块在左/右边界的碰撞
- 底部锁定
- 消1行/2行/4行的得分是否符合需求文档
- 消行后上方积木是否正确下移
- 游戏结束条件
- [新功能]的触发条件和结果
```

**测试脚本示例输出（教师用于课堂展示）：**

```
俄罗斯方块测试结果
───────────────────────────────────
✅ 消1行得分 100 分              通过
✅ 消2行得分 300 分              通过
✅ 消4行（Tetris）得分 800 分    通过
✅ 游戏结束条件（积木超出顶行）   通过
❌ 炸弹方块落地得分               失败
   期望：50   实际：0
   → 提示：clearBomb() 函数未返回得分
✅ 消行后积木正确下移             通过
❌ 炸弹 + 消行叠加得分            失败
   期望：150（50+100）  实际：100
   → 提示：爆炸触发消行时，炸弹得分未累加
───────────────────────────────────
6/8 通过  2/8 失败
```

**「测试失败溯源」提示词：**

```
我的测试脚本显示这个测试失败了：
测试名称：[测试名称]
期望结果：[期望值]
实际结果：[实际值]

我的需求文档里关于这条规则写的是：
[粘贴相关需求]

请帮我分析：
1. 是代码实现有问题？还是需求文档没有说清楚？
2. 如果是代码问题，具体是哪里需要修改？
3. 如果是需求问题，我需要在需求文档里补充什么？
```

**测试失败溯源示例对话：**

```
学生输入：
测试名称：炸弹方块落地得分
期望结果：50
实际结果：0
需求文档写的是：炸弹方块落地时，播放爆炸动画，得分+50

AI 回答：
这是代码问题。你的需求文档写得很清楚——「落地得分+50」。
问题出在 clearBomb() 函数：当前函数只处理了爆炸效果，
没有调用得分更新逻辑。建议修改：
在 clearBomb() 函数末尾加一行 score += 50 并调用 updateScore()。
```

**功能灵感参考清单：**

| 功能 | 复杂度 | 一句话说明 |
|------|--------|---------|
| 炸弹方块 | ⭐⭐ | 落地后炸掉周围3×3范围 |
| 速度加成方块 | ⭐⭐ | 碰到就让下落速度加快5秒 |
| 冻结方块 | ⭐⭐ | 碰到就让当前方块暂停3秒 |
| 彩虹消行 | ⭐ | 消行时屏幕闪彩虹色 |
| 方块预言家 | ⭐⭐ | 显示接下来3个方块 |
| Boss 行 | ⭐⭐⭐ | 每隔10行出现一行无法普通消除的行 |
| 重力反转 | ⭐⭐⭐ | 消4行触发5秒方块往上飞 |

**路演结构引导卡（路演前发给学生）：**

```
我的路演（每人约1.5分钟）

1. 我做了几个版本，加了什么功能（20秒）
   → 演示给大家看

2. 需求文档改了几版（20秒）
   → AI 审核问了我什么让我意外的问题？

3. 测试脚本发现了什么（30秒）
   → 发现了几个 ❌？
   → 最意外的 ❌ 是什么？是代码问题还是需求问题？怎么修的？

4. 如果重来一次（10秒）
   → 需求文档哪里会写得不一样？
```

---

### 6. 教师指南

**本课技术备注：**

测试脚本的原理：游戏的核心逻辑函数（`collides`、`clearLines`、`rotate`）是纯函数——给定输入，返回确定的输出，不依赖渲染。测试脚本把这些函数复制出来，构造特定的棋盘状态作为输入，调用函数，然后检查输出是否符合需求文档的描述。整个过程在浏览器里运行，不需要任何安装。

需求文档与测试的关系：测试脚本的质量取决于需求文档的质量。需求文档里写「消行得分」但没写具体数字，AI 就无法生成有意义的测试。这是本课的核心教学点——需求越具体，测试越有效。

增量需求文档的代码实现原理：教师需要了解，增量功能是在已有代码的基础上「插入」新逻辑，而非替换。Kimi 在生成增量代码时会查找合适的插入位置（比如 `clearLines()` 函数内部）并添加新逻辑。如果原有代码结构混乱（逻辑和渲染混在一起），AI 会很难找到插入点，导致生成失败。这就是为什么第6课的「增量生成」提示词里要求「核心逻辑函数保持独立」。

**常见问题 FAQ：**

| 问题 | 应对 |
|------|------|
| 「测试脚本打开是空白页」 | 检查 HTML 文件是否完整；让 Kimi 检查生成的代码有没有语法错误 |
| 「测试全部 ❌」 | 很可能是函数提取时出了问题；让 Kimi「只提取 clearLines 函数写一个最简单的测试」，逐步调试 |
| 「测试全部 ✅ 但游戏还是有 bug」 | 引导学生找到：哪条 bug 对应的规则，在需求文档里没有写到？这就是测试覆盖不足 |
| 「Kimi 生成的测试脚本太复杂看不懂」 | 「你不需要看懂每一行代码，只需要看 ✅❌ 结果和失败原因」；理解结果比理解实现更重要 |
| 「测试失败但不知道是代码问题还是需求问题」 | 使用「测试失败溯源」提示词，让 AI 帮你判断 |
| 「AI 审核问了太多问题，不知道怎么回答」 | 让学生先回答最好回答的那一条，其他的暂时写「待定」，先生成第一版，跑测试的时候再补 |
| 「增量生成后原有消行功能不见了」 | 说明 Kimi 误修改了原有逻辑；把原版代码重新提交，强调「不要改变原有功能的行为」 |
| 「验收标准不知道怎么写」 | 用「情况 → 预期结果」句式套一遍：「[什么情况] → [应该看到什么]」；如果写不出来，说明还没想清楚这条规则 |
| 「第二版加完功能跑测试有 ❌，但不知道是新功能的问题还是旧功能出了问题」 | 先把新功能注释掉，跑测试，确认旧功能全部 ✅；再把新功能打开，重新跑，锁定是新代码引入的问题 |
| 「路演超时怎么办」 | 路演前说清楚：演示只需要展示「最酷的那一个功能」，不需要演示全部；测试部分只说「最意外的 ❌」 |

**课堂节奏控制：**

- 分段一（15分钟）：最容易超时的环节是「AI 审核」——有学生会和 AI 进行很长的对话。给学生一个限制：AI 审核最多回答3轮问题，然后就进入执行。
- 分段二结束时，学生手动测完后，教师主动提问「你需求文档里有几条规则，你测了几条」——制造认知冲突，让学生自己感受手动测试的不完整性，再引出自动测试。
- 分段三的核心是「看懂 ✅❌ 结果并溯源」，不是「让每个学生都把测试写完」。进度慢的学生只要跑出测试结果、理解一个 ❌ 的原因即可。
- 分段四时间有限，对于进度慢的学生，「跑一遍测试确认第一版没问题」就算达标，不强求做第二版。
- 路演时间（第三幕）要严格控制在1.5分钟/人。如果有学生的功能特别复杂，教师可以帮助提炼：「你只需要说最意外的那个 ❌，其他的可以跳过。」

**课堂风险预案：**
- 如果 Kimi 生成的测试脚本无法运行：教师用提前准备好的演示版本讲解概念，让学生理解「测试脚本是什么、能发现什么问题」即可，不强求每人都跑成功。
- 如果学生进度差异大：进度快的学生尝试「给测试脚本加更多边界条件测试」；进度慢的学生重点完成「生成第一版 + 跑一次测试 + 理解结果」。
- 如果网络不稳定导致 Kimi 响应慢：提前在教师电脑上缓存一份完整的增量生成 + 测试脚本生成示例，用于离线演示。

---

### 7. 5分钟日常AI挑战

**本周挑战：** 给你的游戏补一条没有被测试覆盖的规则
**挑战说明：** 找到你需求文档里一条没有被测试脚本覆盖到的规则，把它补进需求文档，然后让 Kimi 给测试脚本加上这条测试，跑一下看是 ✅ 还是 ❌。
**下节课分享：** 说出你补的是哪条规则，测试结果是什么

---

### 8. 拓展任务

**拓展一（推荐）：** 让你的测试脚本覆盖所有需求文档里的规则——对照需求文档逐条检查，补上缺少的测试。目标：测试脚本的条数 = 验收标准的条数。

**拓展二（挑战）：** 在需求文档里加一个你自己想出来的「边界情况」，写清楚预期结果，让 AI 生成对应的测试，看游戏能不能通过。参考方向：「同时消4行 + 炸弹爆炸」这种极端叠加情况的得分是多少？

**拓展三（超级挑战）：** 试着把你的增量需求文档写得让另一个同学能看懂——交换给同桌，让他/她用你的需求文档，在他/她的游戏上生成同样的功能。看看你的需求文档清不清楚。
