---
课时: 8
主题: 涂鸦PK（一）— 画图工具 + 角色设计
核心能力: [拆解力, 审美力]
核心工具: [Trae IDE, Kimi]
时长: 90分钟
透明化层级: 过程层
适用路线: AICODE-06
---

### 1. 课程目标

**知识目标：**
- 理解「精准需求 > 冗余需求」：需求文档的价值在于可测试性，不在于篇幅长短
- 理解「新窗口审核」的本质：不同上下文的 AI 才能发现你看不见的漏洞
- 理解角色属性是「打法定位」的策略设计，不是随意填写的数字

**能力目标：**
- 能用 Plan Mode 三步（窗口A整理→窗口B审核→窗口C执行）完成画图工具的需求文档（拆解力）
- 能用自己生成的画图工具画出两帧角色（帧1待机 + 帧2攻击），差异度清晰可见（审美力）
- 能根据20分预算制，选定自己的打法定位，合理分配属性点（拆解力）

**情感目标：**
- 建立「工具是自己做的」的自豪感——不是用别人的软件，而是先造工具再用工具
- 发现「像素画」的审美乐趣：小小的64×64格子里也能表达角色个性
- 体验「打法定位」带来的策略感：我的角色是有设计意图的，不是随便画的

---

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

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

| 概念 | 学生类比 | 认知层级 |
|------|---------|---------|
| Spritesheet（精灵图集） | 动画书里的一页纸上排了多幅连续图，快速翻动就成了动画；Spritesheet 就是把所有帧拼成一张图，程序按顺序裁取每一帧 | 识别层 |
| 帧（Frame） | 动画里每一张静止的画面；两帧之间的差异越大，动画的动感越强 | 识别层 |
| 属性预算制 | 创建角色时只有20个技能点，花在HP多了ATK就少——这就是策略，不是加法题 | 理解层 |
| 需求可测试性 | 「字要好看」不可测试；「字体大小16px、颜色白色」可以测试。只有写得出来测试步骤的需求，才是写清楚了的需求 | 应用层 |
| 打法定位 | 篮球队里有中锋/控卫/得分手，分工不同；坦克型靠血厚扛伤害，刺客型靠高攻一击必杀——每种打法都有对应的属性分配 | 应用层 |

**典型误概念表：**

| 编号 | 误概念 | 正确认知 | 激发策略 |
|------|--------|---------|---------|
| M1 | 需求写得越多越好，越详细越安全 | 冗余需求会制造更多歧义和 bug；精准的需求才是关键——每条需求都要能写出测试步骤 | 展示一份100行需求文档生成的混乱代码 vs 精准15行需求生成的干净代码；问「这条需求，你怎么测试它对不对？」 |
| M2 | 让 AI 直接写代码更快，需求文档浪费时间 | 没有需求文档，验收时你不知道从哪里查；出了 bug 无法溯源，只能靠直觉瞎改 | 问：「如果 AI 做出来画布不是64×64，你怎么知道是哪条需求没说清楚？」 |
| M3 | 需求审核就是自己再读一遍 | 新窗口审核：上下文不同的 AI 能发现你看不见的漏洞；自己审等于让同一个人既出题又判卷 | 演示：把需求文档发给同一窗口的 AI，它说「没问题」；发给新窗口，它提了3个你没想到的问题 |
| M4 | 两帧画一样就行，动画不重要 | 帧1待机姿势 + 帧2攻击姿势，差异越大动画越有冲击力；帧2完全复制帧1等于没有动画 | 打开 demo-3-animation：展示两帧相同 vs 帧2明显前冲的动画对比，让学生自己感受差距 |
| M5 | 属性随便填，反正都是数字 | 属性是角色的「打法定位」，这是策略设计，不是填表格；20分预算是有限资源，怎么分配决定了这个角色的战斗风格 | 类比：篮球队里有中锋/控卫/得分手，不是每个人都练同一个技能；问「你是想先手打爆对方，还是慢慢耗死对方？」 |

---

### 3. 教学准备

**工具与环境：**
- 每台电脑已登录 Kimi（网页版），网络正常
- 每台电脑装有 Trae IDE，可以创建 HTML 文件并用浏览器预览
- 教师电脑准备好 demo-pk 目录下的两个 demo 文件：
  - `demo-1-draw-tool.html`（完整画图工具，备用展示）
  - `demo-3-animation.html`（角色动画展示，Connect 环节使用）

**教学资源：**
- 教师准备：打开 `demo-3-animation.html`，导入一个提前画好的临时涂鸦角色 Spritesheet，用于 Connect 导入
- 教师准备：「画图工具需求文档模板」文字版（见第5节，投屏展示）
- 教师准备：一份「属性分配表」展示四种打法定位（见第5节）
- 学生资源：上节课完成的俄罗斯方块作品（精神延续，不需要文件）

**教师备课体验任务：**
> 备课前，教师必须亲自完成以下操作：
>
> 1. 走完完整的 Plan Mode 三步：用窗口A整理画图工具需求文档 → 窗口B审核（记录 AI 问了哪些你没想到的问题）→ 窗口C生成画图工具
> 2. 用生成的画图工具画一个角色（帧1待机 + 帧2攻击），感受64×64像素格子的限制和乐趣
> 3. 故意画一个「两帧完全相同」的角色，导出预览，体验「没有动画感」的效果——备用作为 M4 反例
> 4. 验证 `demo-3-animation.html` 的导入功能是否正常，准备一张 128×64 的 Spritesheet PNG

---

### 4. 教学流程

---

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

*本幕目标：用上周挑战回顾激活工程思维记忆；用 demo-3-animation 的动画展示制造「哇！」的感受，建立今天的项目目标*

**【环节】上节课挑战回顾 (3分钟)**

**师：** 上节课我布置了一个5分钟挑战——给测试脚本补一条没有被覆盖的规则。谁补了？补了什么？

**生：** （预期 A：我补了一条，测试「方块碰到左边界不能出去」）

**师：** 具体怎么补的？你是发现了哪条规则测试脚本没写？

**生：** （预期：测试脚本里没有检查边界，我就加了一个模拟按键到最左边的测试）

**师：** 很好——你不只是「加了一条」，你先发现了漏洞，再去补。这就是工程师的思维方式：不是随便加，而是找到没覆盖的地方补上去。

【诊断点：学生能否清晰描述「我发现了什么漏洞 → 我用什么方法补上去了」，而不只是「我加了一条测试」】【理解层】

**【分支A】若学生能说出具体的漏洞和补法：**
**师：** 这条补得很到位。以后做任何项目，验收脚本里「没写到的地方」就是最容易漏 bug 的地方。

**【分支B】若学生说「我没有补，不知道怎么补」：**
**师：** 没关系，今天我们马上会用到同样的思路——先写需求，需求就是验收的标准。你今天会自己搞清楚这个流程。

**【分支C】若没有学生做了挑战：**
**师：** 好，我来快速过一遍——测试脚本的核心作用是什么？

**生：** （预期：验证游戏规则有没有做对）

**师：** 对。「没被覆盖的规则」就是「测试脚本没想到的情况」。记住这个概念，今天会继续用到。

---

**【环节】情景导入 (7分钟)**

**师：** 上节课我们用 Plan Mode 完成了俄罗斯方块。今天我们开启一个全新项目——涂鸦PK。

**师：** 先不解释「PK」是什么，我先让你们看一个东西。

【投屏打开 demo-3-animation.html】

**师：** 这是一个角色动画展示器。你们看——这两个角色在做什么？

**生：** （预期：在动！/ 一个在走路，一个在打架）

**师：** 对，这是两帧动画——帧1是待机状态，帧2是攻击状态，快速交替播放就有了动感。但是这两个角色，是我临时画的，我花了大概5分钟。

**师：** 现在，我要把这个临时角色换成你们自己画的角色。

【教师演示导入提前准备的临时涂鸦 Spritesheet，动画播放起来】

**师：** 这个动画里的角色，是用一个 HTML 画图工具做的。这个画图工具——是我们今天自己写出来的。

**师：** 今天的任务，两件事：第一，用 Plan Mode 做出一个画图工具；第二，用这个工具画你自己的战斗角色——帧1待机，帧2攻击。

**师：** 上节课用的 Plan Mode 三步，还记得吗？

**生：** （预期：记得！窗口A整理需求，窗口B审核，窗口C执行）

**师：** 对，一模一样的流程。只是这次做的不是游戏，而是工具。先造工具，再用工具。

【诊断点：学生是否能自己说出 Plan Mode 三步，而不是被教师提示】【识别层】

---

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

*本幕目标：完整走完 Plan Mode 三步生成画图工具；逐条验收画图功能；用生成的工具画出两帧角色并填写属性 JSON*

---

**【分段一：Plan Mode — 画图工具需求文档】(25分钟)**

*本段重点：引导学生从「我要做什么」出发，用窗口A整理需求文档，再用窗口B（新窗口审核工程师）发现漏洞，补充完整后准备提交*

**预设误概念：**
- 误概念 M1：需求写得越多越好，越长越安全
- 误概念 M2：直接让 AI 写代码更快，不需要文档
- 误概念 M3：需求审核就是自己再读一遍，不用开新窗口

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

**师：** 开始 Plan Mode 第一步——整理需求。我们要做的画图工具有哪些功能？先不急着写，我们来想一想，这个工具要能做什么。

**师：** 用这个画图工具，最后要交出一张图。这张图有什么要求？

**生：** （预期：要是方块组成的 / 要有两帧 / 颜色要能选）

**师：** 我来把这些需求点梳理一下，一共6个部分。你们跟着我一起确认每个部分的内容，然后我们用 AI 整理成规范文档——

**师：** 第一部分——画布大小。我们用 64×64 像素，但显示的时候放大 8 倍显示，这样格子就有 512×512 的大小，不会太小看不清。

**师：** 第二部分——工具。需要三个：画笔（点击涂色）、橡皮（把像素变透明或白色）、填充桶（把一片同色区域一起换色）。

**师：** 第三部分——调色板。至少 16 种颜色，支持自定义颜色选择器。

**师：** 第四部分——多帧编辑。这是最关键的——我们有两帧，帧1是待机姿势，帧2是攻击姿势，可以切换编辑，而且可以把帧1复制到帧2作为修改起点。

**师：** 第五部分——动画预览。在工具里就能看到两帧切换的动画效果，不用每次都导出去看。

**师：** 第六部分——导出。生成一张 128×64 的 PNG 图片，两帧横向拼在一起，就是 Spritesheet。

**师：** 这 6 个部分，每一个都有一个关键问题：「怎么测试它做对了？」这叫需求可测试性。比如「画布 64×64 像素」——怎么测试？

**生：** （预期：在画布上画一条线，看有没有 64 格 / 在画布最边上点，看坐标是不是（63，63））

**师：** 对，能说出测试步骤，说明需求写清楚了。如果是「颜色要好看」——怎么测试「好看」？

**生：** （停顿）……好像测不了……

**师：** 对，「好看」不可测试。所以需求文档里不能出现「好看」「流畅」「方便」这类词。要写具体的、能测试的描述。
【理解层：建立「需求可测试性」的直觉，澄清 M1 误概念】

**师：** 现在看一下今天用的三步流程——

**师：** 窗口A——打开 Kimi，把这6个需求要点告诉 AI，请它整理成规范的需求文档（五部分格式：功能描述/触发条件/功能规则/交互规则/验收标准）。

**师：** 窗口B——全新 Kimi 对话，把文档发给「审核工程师」，让它只问问题不给答案，找出所有描述不清楚的地方。

**师：** 窗口C——再新一个 Kimi 对话，把补充完整的需求文档发给它，生成画图工具的 HTML 代码。

**师：** 我来演示窗口A这一步。

【教师打开 Kimi，用保底提示词一（见第5节）提交，投屏展示 AI 整理出来的需求文档结构】

**师：** 你看 AI 给我整理出来的格式——每个功能都有「功能规则」和「验收标准」。你们对比一下：AI 加的这些验收标准，我在口头说的时候有没有提到？

**生：** （预期：有几条我没说 / 填充桶的那条我没想到边界情况）

**师：** 对，AI 帮我补了一些我没说清楚的细节。但注意——AI 整理的内容可能有你不想要的，也可能漏掉你想要的。整理完之后要自己过一遍，确认每条都是你真正想要的。
【应用层：学生开始区分「AI 帮我补充的」和「我自己想要的」】

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

学生操作：
1. 打开 Kimi，新建对话（窗口A）
2. 根据教师给出的保底提示词一，补充自己想要的特殊需求，提交
3. 拿到 AI 整理的需求文档，自己读一遍，圈出「这条我没提到的」和「这条说法我不认可的」
4. 打开新的 Kimi 对话（窗口B），把文档和审核提示词一起提交

> 教师走动观察重点：
> - 学生在窗口A拿到文档后，有没有真的读了一遍？还是直接复制粘贴给窗口B？「读一遍」是诊断这步的关键行为。
> - 窗口B的 AI 问了哪些问题？有没有学生对某个问题感到惊讶——「这个我真的没想过」是好信号。
> - 是否有学生在同一个对话窗口里同时做整理和审核？这是 M3 误概念的表现，需要介入。

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

**师：** 窗口B审核出来了，AI 问了你哪个最意外的问题？谁来说一下？

**生：** （预期 A：它问我「橡皮是把像素变透明还是变白色」，我没想过这两种不一样）

**师：** 好——这两种有什么区别？

**生：** （预期：透明就是真的没颜色，白色就是变成白色格子）

**师：** 对，区别很重要。如果背景是黑色的，你用橡皮想抹掉一块，变成「白色」就是留了个白点，变成「透明」才是真正删掉。你准备选哪个？

**生：** 透明！

**师：** 那就在你的需求文档里补上：「橡皮擦除后像素变为透明（alpha=0）」。

【诊断点：学生能否说出一条「因为 AI 审核问了这个问题，我补充了这条描述」，而不是「AI 问了很多，我不知道填哪些」】【理解层】

**【分支A】若学生能说出具体补充了什么：**
**师：** 很好。需求每补充一条，代码出问题的概率就降低一点点。这就是 Plan Mode 的价值。

**【分支B】若学生说「AI 问了很多但我觉得都不重要」：**
**师：** 好，拿出来看看。最意外的那条是哪个？我们一起判断——这条如果不补，代码生成出来会发生什么？
（引导学生预测后果，建立「需求漏洞→代码行为异常」的因果感）

**【分支C】若学生在同一窗口做了整理和审核：**
**师：** 我注意到你在同一个对话框里做的审核。还记得上节课说的「上下文污染」是什么意思吗？现在再开一个全新对话，把文档重新发过去，对比一下这次 AI 问的问题和刚才有没有不同。

---

**【分段二：窗口C生成画图工具 → 逐条验收 → 溯源修复】(20分钟)**

*本段重点：提交需求文档生成画图工具；建立「按需求逐条验收」的习惯；遇到问题先溯源需求再修改*

**预设误概念：**
- 误概念 M2：直接改代码比溯源需求更快
- 误概念：看起来能用就算完成，不需要逐条验收

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

**师：** 需求文档补完了，进入窗口C——提交生成。把补充完整的需求文档粘贴进新的 Kimi 对话，加上保底提示词三，提交。

**师：** 生成完之后，你会拿到一段 HTML 代码。把这段代码复制出来，在 Trae 里新建一个 `draw-tool.html` 文件，粘贴进去，保存，用浏览器打开。

**师：** 打开之后——不要急着画。先做一件事：用你的需求文档，逐条验收。验收方式：你需求文档里写了什么，就测什么。

**师：** 我给你们一个最快的验收清单——五条最关键的：

【投屏展示验收清单】

```
1. 画笔工具：选颜色，点击画布能涂色
2. 橡皮工具：点击有颜色的格子，变为透明/白色
3. 填充桶：点击一片同色区域，整体换色
4. 多帧切换：点「帧1」「帧2」Tab，画的内容各自独立
5. 动画预览：点播放，两帧交替显示
```

**师：** 这五条，每条真的去操作一次，不能只「看起来好像对」。有一条不通过就标叉，写下「实际看到了什么现象」。
【应用层：建立「验收 = 逐条测试 + 记录现象」的习惯】

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

学生操作：
1. 在 Trae 新建 `draw-tool.html`，粘贴 AI 生成的代码，浏览器打开
2. 按五条验收清单逐条测试，记录「通过✓」或「不通过✗ + 实际现象」
3. 遇到「不通过」先不改代码——找回需求文档，找到是哪条需求没说清楚，标注出来
4. 把找到的漏洞描述清楚（「步骤→预期→实际」格式），让 AI 针对性修复

> 教师走动观察重点：
> - 有没有学生遇到 bug 直接问 AI「帮我改这个 bug」，而没有先溯源需求？主动走过去问「你知道是哪条需求没说清楚吗？」
> - 有没有学生卡在代码生成失败（如 AI 输出不完整）？准备好备用的 demo-1-draw-tool.html，但先引导学生尝试重新生成
> - 验收清单有没有学生不知道「如何测试填充桶」？示范：先用画笔画一个封闭区域，再用填充桶点内部

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

**师：** 五条验收，全部通过的举手。

**师：** 好。有没有人验到「不通过」的？说一下你发现了什么。

**生：** （预期 A：帧1和帧2切换，但画的内容是共用的，切换没效果）

**师：** 好，你溯源到需求文档了吗？哪条需求没写清楚？

**生：** （预期：我写了「可以切换帧」，但没写「两帧的数据是独立存储的」）

**师：** 对，这就是漏洞。「切换帧」和「数据独立」是两件事，你只说了一件。现在补上这条，用「步骤→预期→实际」格式描述给 AI，让它修复。

【诊断点：学生能否从「出了 bug」出发，溯源到「是哪条需求没写清楚」，而不是直接「AI 帮我改一下」】【应用层】

**【分支A】若学生完成了溯源并修复了 bug：**
**师：** 这是真正的工程师思维——不是改代码，是改需求，然后重新生成。

**【分支B】若学生直接把代码发给 AI 说「帮我改」：**
**师：** 先停一下。你现在让 AI 改的是代码，但 AI 不知道你要的是什么效果。你能不能先找到需求文档里「两帧切换」那一条，把它描述得更清楚再提交？

**【分支C】若 AI 生成的代码完全无法运行（语法错误）：**
**师：** 遇到这种情况，先用「步骤→预期→实际」描述给 AI：「我打开 HTML 文件，浏览器显示空白/报错，期望看到画图工具界面」。让 AI 自己排查哪里有问题。如果还不行，可以用老师电脑上的备用 demo 继续后面的步骤——画角色才是今天更重要的部分。

---

**【分段三：用工具画角色（帧1待机 + 帧2攻击）+ 填属性JSON】(20分钟)**

*本段重点：用画图工具完成角色设计；理解两帧差异的审美原则；用20分预算制选定打法定位并填写属性*

**预设误概念：**
- 误概念 M4：两帧画一样就行，动画不重要
- 误概念 M5：属性随便填，反正都是数字

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

**师：** 画图工具做好了。现在正式开始画你的战斗角色。

**师：** 先确认一件事——帧1和帧2要画什么？

**师：** 帧1是「待机」姿势——就是角色站在那里，什么都没发生。这一帧决定了角色的整体外形和配色。

**师：** 帧2是「攻击」姿势——角色在出击的那一瞬间。这一帧决定了动画的冲击感。

**师：** 我让你们看一个对比。

【投屏打开 demo-3-animation.html，分别导入两个角色：一个帧1和帧2完全一样，一个帧2明显前冲】

**师：** 哪个更有打击感？

**生：** 第二个！第一个完全没动……

**师：** 对，帧1和帧2差异越大，动画的冲击感越强。帧2复制帧1不修改，等于没有动画。攻击帧要做什么？肢体前冲、武器伸出去、颜色变化——让角色看起来「正在做某件事」。
【识别层：建立「帧1待机 vs 帧2攻击」的视觉差异意识，澄清 M4 误概念】

**师：** 画完之后，我们要给角色填属性。属性系统用的是「20分预算制」——你有20分，分配完就没了，怎么分是你的策略。

**师：** 四个属性：

【投屏展示属性表】

```
HP（生命值）：1分 = 10血  范围 3-10分
ATK（攻击力）：1分 = 5伤害  范围 2-10分
DEF（防御力）：1分 = 3减伤  范围 0-6分
SPD（速度）：1分 = 1速度值  范围 1-6分
```

**师：** 我给你们四种打法定位参考，你选一种，或者自己设计——

```
坦克型：HP 8 + ATK 4 + DEF 6 + SPD 2 = 20分（耗死对方）
刺客型：HP 4 + ATK 10 + DEF 0 + SPD 6 = 20分（一击毙命）
平衡型：HP 5 + ATK 5 + DEF 4 + SPD 6 = 20分（没有弱点）
速攻型：HP 6 + ATK 7 + DEF 1 + SPD 6 = 20分（先手压制）
```

**师：** 注意——你的角色外观要和你的打法定位「匹配」。刺客型画个超大的圆圆的胖角色，感觉不对；坦克型画个细细的小人，也感觉不对。角色的视觉设计要传达出它的战斗风格。

**师：** 还有一个特技系统——每个角色可以选一个特技，不占预算：

```
🔥燃烧：每回合额外-5血，持续3回合
🛡护甲：首次受击伤害归零
⚡连击：25%概率攻击两次
💉吸血：攻击回复伤害30%血量
❄️冰冻：每场一次，对方跳过下回合
🎯穿透：一次攻击无视防御
```

**师：** 选好了吗？现在开始画。先定打法定位，再动手画角色外形。
【应用层：学生开始从策略角度设计角色，而不是「随便画一个」】

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

学生操作：
1. 在画图工具里，先选定自己的打法定位（坦克/刺客/平衡/速攻，或自定义）
2. 在帧1画待机姿势——确定角色外形、配色、整体风格
3. 点「复制帧1到帧2」，在帧2的基础上修改攻击姿势（肢体前冲、武器伸出、颜色变化等）
4. 预览动画，确认帧1和帧2有明显差异
5. 完成后，在 Trae 新建一个 `character.json`，填写属性数据：

```json
{
  "name": "你的角色名",
  "hp": 50,
  "atk": 25,
  "def": 12,
  "spd": 4,
  "special": "⚡连击",
  "description": "一句话描述你的打法"
}
```

> 教师走动观察重点：
> - 有没有学生帧2完全没改，只是复制了帧1？走过去问「攻击的时候角色在做什么动作？」
> - 有没有学生分配完属性后发现「总分超了20分」？引导他重新算一下
> - 关注速度慢的学生：如果卡在画角色，帧2可以暂时只改一两个像素，保证完成基本的两帧结构；细节可以之后优化

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

**师：** 谁的帧2跟帧1有明显不同的，把动画预览给大家看一下。

**生：** （学生展示动画预览）

**师：** 帧2里，角色做了什么动作？

**生：** （预期：他的手臂伸出来了 / 整个身体往前倾了）

**师：** 这就是攻击感。你们的打法定位是什么型？

**生：** 刺客型！

**师：** 刺客型——高攻低血。碰到坦克型怎么办？

**生：** （预期：先手攻击！速度快，先打对方）

**师：** 好，这说明你的策略是清晰的。你知道你的角色能赢谁，也知道怕谁——这才是策略设计。

【诊断点：学生能否说出自己的打法定位，并能解释「这个定位的优势和弱点」，而不只是「我觉得这个好看」】【应用层】

---

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

*本幕目标：2-3名学生展示角色并说出打法定位的策略思考；让其他学生从「对抗」角度给出评价*

**【环节】成果展示 (6分钟)**

**师：** 现在我们来做一个角色路演。每个人只说三件事：第一，你的角色叫什么名字；第二，你的打法定位是什么型；第三，你的特技是什么，为什么选这个。

**师：** 谁先来？

【1-2名学生上来展示角色动画，说出三件事】

**师：** （对展示的学生）你是刺客型，特技选了「穿透」。你的思路是什么？

**生：** （预期：因为刺客型攻击高，加上穿透直接无视防御，坦克型也扛不住）

**师：** 这个搭配有意思——高攻 + 穿透，专门克制高防御的坦克。但是你血量很少，碰到先手比你快的角色怎么办？

**生：** （预期：就……输了？ / 要速度快才行）

**师：** 所以你的角色有一个明显弱点。这不是坏事——有弱点才有对抗的乐趣。

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

**师：** 大家来评价刚才展示的这个角色——一个优点 + 一句「如果我拿XX型去打他，我的策略是」。

**生：** （预期：优点是攻击穿透很厉害；如果我用速攻型，速度比他快，先手打他，因为他血少可能一下就输了）

**师：** 很好——你在想「反制策略」了。这就是涂鸦PK的乐趣：不只是画角色，而是设计一个有自己思考的战斗方案。

**师：** 帧2动画有一个想问的——你们觉得帧2改变得最大、最有攻击感的是哪个角色？

【学生投票或说出谁的】

**师：** 为什么你觉得那个最有攻击感？

**生：** （预期：因为他帧2整个身体都往前扑了，和帧1差别很大）

**师：** 对——**差异越大，冲击感越强。** 这是今天审美设计的核心原则，记住它。

---

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

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

**师：** 今天我们做了两件事：先用 Plan Mode 做出了画图工具，然后用工具画了角色、填了属性。我来问你们——今天用的三步流程（窗口A整理、窗口B审核、窗口C执行），和上节课做俄罗斯方块时有什么一样的地方？

**生：** （预期：流程完全一样 / 都是先写需求再生成）

**师：** 对——**流程是可以迁移的。** 这套流程不只用来做游戏，不只用来做画图工具。以后你们要做任何稍微复杂一点的项目，都可以用这三步。

**师：** 今天还有一个新东西——「先造工具，再用工具」。你们不是下载别人的画图软件来用，而是自己写了一个。这个思路以后还会用到：当你发现某个工具不好用，或者根本没有，你可以自己造。

**师：** 今天的「审美力」训练，核心是什么？

**生：** （预期：帧1和帧2差异要大 / 攻击帧要有动感）

**师：** 对，帧2差异越大，动画越有冲击感。这条原则不只用在像素画——你以后做任何动画、做任何交互，「差异对比产生冲击感」都是一条通用的审美原则。

【迁移层：将「先造工具」「差异产生冲击感」提炼为可迁移的思维模型】

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

**师：** 下节课——涂鸦PK（二）。你们今天画好的角色和属性，会被真正用来对战。我们要搭建一个战斗引擎，让你的角色和同学的角色打起来，看看谁的策略赢。

**师：** 想一想——你的打法定位，碰到哪种对手会输？下节课我们来验证。

**师：** 本周 5 分钟挑战：用你今天做的画图工具，帮一个同学画一个角色，然后对比和他自己画的有什么不同——外形、配色、攻击姿势，哪里不一样？拍照或截图，下节课分享。

---

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

**教师演示用提示词（需求文档整理，窗口A）：**
```
你是一个需求分析师。我要做一个HTML5像素画图工具，功能是：64×64画布、8倍缩放显示、支持画笔/橡皮/填充桶、有调色板、两帧编辑（帧1待机/帧2攻击）、可复制帧1到帧2、有动画预览、能导出128×64 Spritesheet PNG。请把这些需求整理成规范的需求文档，包含：功能描述、触发条件、功能规则、交互规则、验收标准五个部分。
```

**审核用提示词（窗口B——新窗口，不要在整理窗口里使用）：**
```
你是一个挑刺工程师。下面是一份画图工具的需求文档，请只提出你觉得描述不清楚或有遗漏的问题（每个问题一行），不要给答案，不要写代码：

[粘贴需求文档]
```

**学生保底提示词（生成画图工具，窗口C）：**
```
请帮我用HTML5 Canvas做一个像素画图工具：64×64像素画布、8倍缩放显示、支持画笔/橡皮/填充桶、有颜色调色板（至少16色）、有两帧（帧1待机/帧2攻击）可切换编辑、可复制帧1到帧2、有动画预览（循环播放）、能导出128×64 Spritesheet PNG。单文件HTML，不用任何外部库。
```

**进阶提示词（属性 JSON 生成辅助）：**
```
我的角色是刺客型，打法是先手高爆发。20分预算制：HP/ATK/DEF/SPD各有范围限制（HP:3-10，ATK:2-10，DEF:0-6，SPD:1-6）。请帮我给出一个满足20分总预算、符合刺客型定位的属性分配方案，并说明每个属性为什么这样分配。
```

**属性分配参考表（投屏展示用）：**

| 打法定位 | HP | ATK | DEF | SPD | 合计 | 核心优势 |
|---------|----|----|-----|-----|-----|---------|
| 坦克型 | 8 | 4 | 6 | 2 | 20 | 血厚扛伤害，慢慢耗死对方 |
| 刺客型 | 4 | 10 | 0 | 6 | 20 | 先手高爆发，一击毙命 |
| 平衡型 | 5 | 5 | 4 | 6 | 20 | 无明显弱点，应对各种对手 |
| 速攻型 | 6 | 7 | 1 | 6 | 20 | 先手压制，中等爆发 |

---

### 6. 教师指南

**本课技术备注：**

- **Spritesheet 格式**：128×64 PNG，左半（0-63像素宽）是帧1，右半（64-127像素宽）是帧2。对战引擎会按这个坐标裁取每帧。导出时必须确保两帧横向拼接，否则下节课的战斗引擎无法正确读取。

- **Canvas 像素操作**：画图工具底层用 `getImageData/putImageData` 操作像素数组。每个像素有 RGBA 四个值（各0-255）。橡皮设为「透明」等于把该像素的 alpha 通道设为 0。这部分不需要传达给学生，但教师需要了解，以便解释「橡皮变透明 vs 变白色」的区别。

- **填充桶（洪水填充）**：用 BFS 或 DFS 算法扩展同色区域。如果学生报告「填充桶没有反应」，可能是起点像素和周边颜色完全相同导致；让学生先用画笔画一个封闭区域再测试。

- **帧数据独立存储**：每帧用一个独立的 `Uint8ClampedArray` 存储像素数据。切换帧时先保存当前帧数据，再加载目标帧数据。如果生成的代码两帧共用数据，需要在需求里补充「每帧像素数据独立存储，互不影响」。

- **导出 PNG**：用 `canvas.toDataURL('image/png')` 获取 base64 编码后触发下载。导出前需要把两帧数据拼接到一个 128×64 的临时 canvas 上再导出。

**常见问题 FAQ：**

| 问题 | 应对 |
|------|------|
| 「AI 生成的代码报错，打开是空白页」 | 让学生把报错信息（浏览器 F12 控制台）截图给 AI，用「步骤→预期→实际」描述问题让 AI 修复 |
| 「橡皮擦了但颜色还在」 | 先确认是否切换到了橡皮工具；如果工具选对但无效，可能是代码把橡皮当成了「白色画笔」，需要溯源需求文档里橡皮的功能描述 |
| 「填充桶整个画面都变色了」 | 这是填充桶「溢出」问题——起点像素周围没有封闭边界，颜色扩散到整个画布。让学生先用画笔封闭区域再用填充桶 |
| 「帧1和帧2切换后内容一样」 | 需求文档里需要补充「两帧像素数据独立存储」；溯源后让 AI 修复数据存储逻辑 |
| 「导出的 PNG 只有一帧」 | 需求里「128×64 Spritesheet」的描述可能没说清楚是「两帧横向拼接」；补充描述后重新生成导出功能 |
| 「20分分配不够，不知道怎么算」 | 给学生纸笔，列出四个属性的分值，加减法算一遍；主要目的是让学生思考优先级，不是数学练习 |
| 「帧2不知道怎么画才有攻击感」 | 给三个具体操作方向：1）身体/手臂前倾；2）把武器或特效从帧1的位置移动到「伸出去」的位置；3）帧2加一些颜色特效（爆炸光晕、冲击线条） |

**课堂风险预案：**

- **AI 服务不可用**：使用 `demo-1-draw-tool.html` 作为备用画图工具，跳过 Plan Mode 生成步骤，直接让学生用 demo 画角色。Plan Mode 三步可以在白板上演示讲解，不需要真的生成。
- **学生进度差异过大**：画图工具生成完成的学生直接开始画角色；还在 Plan Mode 阶段的学生可以在分段三时使用教师备用的 demo-1-draw-tool.html 画角色，保证每位学生都能产出两帧角色。
- **属性分配争议（学生觉得某个定位「必胜」）**：预先告知下节课会有实际对战，不同对手克制关系不同，没有「必胜型」。这个问题留到实战后讨论，今天重点是把角色画完。

---

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

**本周挑战：** 用画图工具帮同学画一个角色，然后对比差异

**挑战说明：**
用你今天做好的画图工具，帮一个同学（家人或朋友也行）画一个角色（帧1待机 + 帧2攻击），然后让他自己也画一个版本，对比两个版本有什么不同：外形、配色、攻击姿势，哪里不一样？想一想：为什么会不一样？是因为你们对「好看」的标准不同，还是因为对「攻击感」的理解不同？

**下节课分享：** 下节课选2-3位同学展示「你画的版本」和「同学画的版本」，说出最大的一处差异是什么。

---

### 8. 拓展任务

**拓展一（推荐）：** 设计一个「克制链」——你的角色克制哪种打法定位的对手，被哪种打法定位克制？用文字写出来：「我是XX型，我克制XX型，因为……；我怕XX型，因为……。」然后想想下节课对战时要不要调整属性。

**拓展二（挑战）：** 给你的角色再画一帧「受伤帧」——当角色被攻击时显示的状态（帧3）。试着修改画图工具的代码，让它支持三帧编辑，并在动画预览里加入「受伤」动画。
