---
课时: 11
主题: 涂鸦PK（四）— 班级锦标赛
核心能力: [表达力, 共创力]
核心工具: [Trae IDE, Kimi]
时长: 90分钟
透明化层级: 结果层
适用路线: AICODE-06
---

### 1. 课程目标

**知识目标：**
- 理解「数据驱动设计」的核心思想：角色数据与游戏代码分离，加新角色只需加文件，代码不用改
- 理解角色选择界面是「数据读取 + UI 展示」的组合，而非把所有角色写死在代码里
- 理解路演的核心是「设计决策」而非「功能列表」：说清楚「为什么这样做」比「做了什么」更有价值

**能力目标：**
- 能用增量需求文档描述 roles 系统，并经过窗口B审核、窗口C执行（共创力）
- 能在班级锦标赛中用语言分析胜负原因，做出有依据的复盘（表达力）
- 能按「展示角色→设计意图→精彩瞬间→设计复盘」结构完成3分钟路演（表达力）

**情感目标：**
- 感受到「自己的角色和全班的角色一起对战」的真实社交激励
- 建立「输了是迭代的起点」而非「输了说明设计失败」的成长心态
- 对「数据和代码分离」产生直觉性认同——这是真实工程师的设计方式

---

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

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

| 概念 | 学生类比 | 认知层级 |
|------|---------|---------|
| 数据驱动设计 | 游戏皮肤系统——你换皮肤不需要重新下载整个游戏，皮肤是「数据」，游戏逻辑是「代码」，两者分离 | 理解层 |
| 硬编码 | 把菜单直接印在餐厅墙上——想加一道菜要重新刷墙 | 识别层 |
| roles 系统 | 班级花名册——班里来了新同学，只需要在花名册上加一行，不需要改班级的所有规则 | 理解层 |
| 增量需求 | 在已有房子里加一个房间——不是推倒重建，而是在现有结构上扩展 | 应用层 |
| 路演设计决策 | 苹果发布会不说「这个手机有摄像头」，而是说「为什么这个摄像头改变了拍照方式」 | 应用层 |

**典型误概念表：**

| 编号 | 误概念 | 正确认知 | 激发策略 |
|------|--------|---------|---------|
| M1 | 加新角色需要改代码 | 数据驱动设计：加一个 json 文件 = 加一个角色，代码不用改 | 演示：不改一行代码，只在 roles/ 文件夹里加一个新 json，新角色就出现在选择界面 |
| M2 | 路演就是说「我做了什么功能」 | 路演要说「我为什么这样设计」——设计决策比功能列表更有价值 | 类比苹果发布会：发布会不说「手机有摄像头」，而是说「为什么这颗摄像头改变了拍照方式」 |
| M3 | 属性随便分的角色不可能赢认真分的 | 「奇怪」的属性分配有时会产生意外的克制效果；游戏平衡比绝对强度更重要 | 展示一个「全部堆 HP」的坦克型角色用消耗战赢了「全部堆 ATK」的爆发型角色 |
| M4 | 输了说明自己设计失败了 | 输了是迭代的起点；「如果重来属性怎么分」才是最有价值的问题 | 强调：世界上最厉害的游戏设计师也在持续迭代，没有「一次设计就完美」的 |

---

### 3. 教学准备

**工具与环境：**
- 每台电脑已安装 Trae IDE，第10课的战斗游戏项目可以正常运行
- 每台电脑有学生自己的角色图片（.png）和角色数据（.json）
- 投影可切换至任意学生屏幕，用于锦标赛投屏
- 教师电脑预建好 `roles/` 文件夹结构（用于演示数据驱动）

**教师备课必做（课前）：**
> 1. 提前向每位学生收集角色文件（角色名.png + 角色名.json），放入教师电脑 `roles/` 文件夹
> 2. 在教师电脑上跑一遍 roles 系统生成流程，确保角色选择界面正常读取所有角色
> 3. 准备好「花名册投屏」：一个展示全班角色名字 + 特技的页面或截图
> 4. 准备好锦标赛对阵表（单淘汰制，根据班级人数提前画好括号）
> 5. 备用方案：如果 roles 系统生成失败，手动在代码里加角色选择下拉菜单（15分钟内可完成）

**教学资源：**
- 教师准备：全班 roles/ 文件夹（含所有 png + json）
- 教师准备：锦标赛对阵表（投屏用）
- 教师准备：保底提示词（见第5节）
- 学生资源：第10课的战斗游戏项目文件（index.html）

---

### 4. 教学流程

---

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

*本幕目标：用「角色花名册」制造全班兴奋感，引出数据驱动概念，建立「今天是全班大乱斗」的期待*

**【环节】角色花名册 + 今日导入 (10分钟)**

**师：** 课前我收集了大家的角色文件。我现在打开，给大家看看今天的「选手花名册」。

【投屏展示花名册——所有角色的名字、HP/ATK/DEF/SPD 属性、特技名称】

**师：** 你们来数一数，今天一共有多少个角色参赛？

**生：** （数人数）……XX 个！

**师：** XX 个角色，今天全部都要上场对战。谁是最强的？我们今天锦标赛见真章。

【停顿 3 秒，让兴奋感发酵】

**师：** 但我现在遇到一个问题。大家的游戏现在只能用「硬编码」的两个角色。什么叫硬编码？就是角色数据直接写死在代码里，像这样——

【投屏展示代码片段】

```javascript
// 角色数据写死在代码里
const player = { name: '章鱼怪', hp: 80, atk: 15, def: 5, spd: 8 };
```

**师：** 这种写法，想换一个角色，要去代码里改数字。想加一个新角色，要再写一段代码。如果班里有 8 个角色要互相打，要改多少次代码？
【识别层：让学生感受到硬编码的局限性】

**生：** （预期：很多次……要改来改去）

**师：** 对，非常麻烦。今天我们要做一件事——用「数据驱动」的方式重新设计这个系统。做完之后，加新角色只需要加一个 json 文件，代码一行都不用改。我们先做好这个系统，然后——锦标赛开始。

【诊断点：学生是否感受到「数据驱动」和「硬编码」的差别，还是觉得无所谓】【识别层】

**【分支A】若学生问「数据驱动是什么意思」：**
**师：** 你知道游戏皮肤吗？比如王者荣耀，你换一个皮肤，不需要重新下载整个游戏对吧？皮肤就是「数据」，游戏逻辑是「代码」，两个东西分开存放。我们今天就是要把角色数据从代码里分离出来，放进独立的 json 文件。

**【分支B】若学生觉得「改代码也没什么，反正能跑」：**
**师：** 如果你做的游戏将来要卖给别人，需要经常更新角色，每次更新都要改代码，那维护成本是很高的。数据驱动就是为了让「扩展」变得简单——这是真实游戏公司的标准做法。

---

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

*本幕目标：完成 roles 系统（数据驱动角色选择）；举办班级锦标赛*

---

**【分段一：roles 系统——数据驱动设计实战】(20分钟)**

**预设误概念：**
- 误概念 M1：加新角色需要改代码（核心要破除的误概念）
- 学生可能认为「从文件夹读取 json」很难实现，需要很复杂的代码

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

**师：** 现在我们用三个窗口来完成这个系统。还记得三窗口原则吗？

**生：** （预期：窗口A写需求，窗口B审核，窗口C执行）

**师：** 对。今天的需求是「增量需求」——不是从头做，而是在现有战斗游戏上加一个新模块。我先给大家看增量需求文档长什么样。

【投屏展示增量需求文档内容，逐条讲解】

**师：** 这份需求文档有四条核心要求。我来念一遍：
第一，从 roles/ 文件夹读取所有 .json 文件，每个文件包含 name、hp、atk、def、spd、skill 字段。
第二，显示角色选择界面：左边选玩家角色，右边选 AI 角色，每个角色显示名字和属性。
第三，有「开始战斗」按钮，点击后进入战斗，加载选中角色对应的同名 .png 作为 Spritesheet。
第四，不需要重写整个游戏——只增加角色选择这一层，原来的战斗逻辑不动。

**师：** 注意最后一条——「不重写整个游戏」。这就是增量需求的核心。我们不推倒重来，我们在现有基础上扩展。

现在我演示一下最重要的一步——数据驱动设计的关键代码思路。

【投屏展示两种写法对比】

```
硬编码方式（现在）：
代码里直接写 { name: '角色A', hp: 80, atk: 15 ... }
→ 想加角色：改代码

数据驱动方式（今天要做）：
读取 roles/角色A.json → 代码只负责读取，不存储数据
→ 想加角色：在 roles/ 文件夹里加一个新 json 文件，代码不变
```

**师：** 看到区别了吗？现在窗口A的需求文档大家已经看到了，我们直接去窗口B审核。

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

【教师打开窗口B（新的 Kimi 对话），投屏展示审核提示词】

**师：** 窗口B的提示词是——

```
你是一个严格的需求审核工程师。我有一份增量需求文档，请找出其中可能的漏洞和没说清楚的地方。每个问题单独列出来，只问问题，不给解决方案。

需求文档：
[粘贴增量需求内容]
```

**师：** 大家现在把窗口B打开，把这个提示词加上你自己的增量需求，提交审核。我来演示一遍，你们同步做。

> 教师同步演示窗口B审核过程，投屏展示 AI 找出的问题（如：roles/ 文件夹里没有 png 文件只有 json 怎么处理？同一个角色能选两次吗？）

**师：** AI 找到了这几个问题。大家对照一下，你的窗口B找到了什么问题？

**生：** （预期：找到类似问题，或发现自己的需求文档有遗漏）

**师：** 好，把 AI 问的问题答案补充进需求文档。然后开窗口C执行。窗口C的提示词见屏幕。

【投屏展示保底提示词，学生复制使用】

> 教师巡视：谁的屏幕 3 分钟没变化就主动过去。重点关注窗口C是否用了「只输出新增/修改的代码」指令，避免 AI 重写整个游戏。

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

**师：** 谁的角色选择界面已经出来了？截图或者展示屏幕。

【让 1-2 位学生展示屏幕】

**师：** 你试试——现在不改一行代码，把一个新的 json 文件放进 roles/ 文件夹，刷新页面，新角色出现了吗？
【诊断点：验证学生是否真正实现了数据驱动，而不只是在选择界面里把角色名字硬编码进去】【应用层】

**【分支A】若角色自动出现了：**
**师：** 这就是数据驱动。你的代码现在可以无限扩展角色，不需要碰代码本身。这是真实游戏公司的标准做法。

**【分支B】若角色没有自动出现（角色名写死在选择界面里）：**
**师：** 看一下你的选择界面代码，角色名是直接写在 HTML 里还是从文件里读的？如果是写在 HTML 里，说明还是硬编码，需要让 AI 改成读取 json 文件的方式。提示词这样说：「我的角色选择界面现在是把角色名硬编码在 HTML 里的，请改成从 roles/*.json 文件里读取，动态生成选择列表。」

**【分支C】若 AI 把整个游戏重写了：**
**师：** 这是常见的情况——AI 有时候会把整个代码重写一遍。发现这个情况后，告诉 AI：「请不要重写整个游戏，只输出 roles 系统的新增部分，我自己复制进去。」然后把新增部分手动粘贴到原来的代码里。

---

**【分段二：班级锦标赛——全班大乱斗】(30分钟)**

**预设误概念：**
- 误概念 M3：属性随便分的角色不可能赢认真分的
- 误概念 M4：输了说明自己设计失败了

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

**师：** roles 系统已经完成了。现在游戏可以选任意角色对战了。我们正式开始今天的班级锦标赛！

【投屏展示锦标赛对阵表】

**师：** 规则说明。单淘汰赛制。每场对战：一方选自己的角色，另一方选自己的角色，战斗5回合。5回合后谁 HP 多谁赢；如果有一方 HP 归零，提前结束。每场大约 2-3 分钟。赢的人晋级，输的人直接进入路演准备。

**师：** 在每场开始之前，我会给大家介绍两个角色的属性和打法，然后问你们——你们觉得谁会赢？

**师：** 有没有问题？

> 如果学生有问题，简短回答；如果没有，直接开始第一场

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

【锦标赛主持逐字稿，每场 2-3 分钟】

**第一场开始前：**

**师：** 第一场对阵：[角色A] vs [角色B]。我来介绍一下这两位选手——

[角色A] 是 [学生名] 设计的，[角色名]，属性是 HP[数字]、ATK[数字]、DEF[数字]、SPD[数字]，特技是[特技名]。从属性看，这是一个[分析：高ATK爆发型 / 高HP坦克型 / 高SPD速攻型]的角色。

[角色B] 是 [学生名] 设计的，[角色名]，属性是 HP[数字]、ATK[数字]、DEF[数字]、SPD[数字]，特技是[特技名]。这是一个[分析]的角色。

你们觉得谁会赢？举手投票——投 [角色A] 的举手……投 [角色B] 的举手……

好，开始！

【由第一个出战的学生上台操作，或者由教师代操，全班围观投屏】

**战斗进行中（教师解说）：**

**师：** 第 1 回合，[角色A] 先手——攻击了 [数字] 点伤害。[角色B] 现在剩 HP [数字]。

**师：** [角色B] 反击……特技触发了！[特技效果]。现在形势[分析]。

**师：** 大家注意这一回合——[角色A] 的 DEF 是 [数字]，所以对方每次攻击被减了 [数字] 点。这就是 DEF 的价值。

**战斗结束后：**

**师：** [赢方角色] 赢了！[学生名] 晋级。

**师：** 分析一下——[赢方角色] 赢的原因是什么？是属性设计好，还是特技时机对，还是单纯运气？

**生：** （预期：因为 HP 多扛住了 / 因为特技打了两次 / 因为 ATK 高秒杀了）

**师：** 对。[具体分析赢的原因]。[输方角色] 输了——如果重来，你觉得属性怎么分会更好？

**生（输方学生）：** （预期：我应该把 DEF 加高一点 / 我应该多加 SPD 先手）

**师：** 这个分析很好。记住这个想法，等会儿路演的时候说出来。

【继续下一场，同样流程】

**半决赛/决赛前：**

**师：** 现在进入[半决赛/决赛]！[角色A] 和 [角色B]，这两位已经赢过了[X]场。来介绍一下他们的战绩——

**师：** [角色A] 在上一场用[什么策略]赢了[谁]。[角色B] 在上一场用[什么方式]赢了[谁]。这场对阵，你们觉得——

**决赛结束后：**

**师：** 恭喜[冠军角色]！[学生名] 拿到今天锦标赛冠军！

**师：** 但我要说一件事——今天冠军不是「最聪明的人」，而是「今天这个对阵顺序下最幸运的人」。如果换一个对阵顺序，冠军可能完全不同。游戏平衡性比绝对强度更重要——这是游戏设计师最核心的命题。

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

**师：** 锦标赛结束了。在进入路演之前，我问大家一个问题：你们觉得，今天的冠军角色「设计得最好」吗？

【诊断点：学生是否理解「赢得比赛」和「设计得好」是两件事，随机因素（对阵顺序）影响结果】【理解层】

**【分支A】若学生说「冠军设计最好」：**
**师：** 如果把今天的对阵顺序换一下，让冠军第一场就对上另一个强角色，他还会赢吗？不一定。所以赢比赛不等于设计最好——游戏平衡设计是一门科学，不是谁 ATK 最高谁就赢。

**【分支B】若学生说「运气成分很大」：**
**师：** 对，你说到一个重点。同样属性的两个角色打十场，赢的次数可能各五场。所以好的游戏设计要让不同风格的角色都有赢的可能，而不是让一种打法通吃所有。这叫「策略多样性」。

---

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

*本幕目标：每人完成3分钟路演，训练「说设计决策」而非「说功能列表」*

**【环节】班级路演 (15分钟)**

**师：** 现在进入路演环节。每个人 3 分钟，包括展示和提问。路演有四段固定内容：

【投屏展示路演结构】

```
第1段（30秒）：展示角色
  说：「我的角色叫 XX，是一个 XX 型，属性分配是……」

第2段（30秒）：设计意图
  说：「我选这个打法是因为……我觉得用 XX 特技可以克制……」

第3段（60秒）：精彩瞬间
  说：「最让我印象深刻的是和 XX 的对战，那一场……」

第4段（60秒）：设计复盘
  说：「如果重来，我会把 XX 调低一点，把 XX 调高……因为我发现……」
```

**师：** 注意——路演不是说「我的角色有什么功能」。路演是说「我为什么这样设计」。这两件事差很多。我来举个例子：

错误示范：「我的角色叫章鱼怪，它有 HP 80、ATK 15、DEF 5、SPD 8，特技是连击。」
正确示范：「我叫它章鱼怪，我把 HP 设高是因为我想让它能扛住对方的连续攻击，用消耗战的方式赢。特技选连击是因为连击在对方 HP 低的时候效果最好，可以一次清掉。」

看到区别了吗？第一个说了什么，第二个说了为什么。

**师：** 好，谁先来？

【6-8人小班建议全员路演；学生逐一路演，教师计时，到 3 分钟给提示】

**路演示例（教师可以第一个先做一遍示范，30秒内）：**

**师：** 我先给大家示范一遍格式。如果我设计了一个角色，我会这样路演——

「我的角色叫石甲龟，是一个防御型角色。HP 设了 100，DEF 设了 20，ATK 只有 5——我知道这样攻击力很弱，但我的想法是：用超高的防御力把对方的输出全部挡掉，靠持久战赢。特技我选了「反弹」——把对方一部分伤害反还给它。最让我印象深刻的是和高 ATK 角色对战，那一场打了整整 5 回合，对方 ATK 30 打在我身上每次只剩 10 点，我靠反弹慢慢把它磨死了。如果重来，我会把 SPD 调高一点，因为我发现先手权在某些情况下比防御更重要——有几场因为后手被秒杀了。」

看到了吗？每一个数字背后都有理由，每一个设计决策都可以说出来。好，现在轮到大家了。谁第一个？

【学生逐一路演，教师计时，到 3 分钟给提示】

**每位学生路演后，教师引导互评：**

**师：** [学生名] 路演完了。谁来给一个「一个优点 + 一个改进建议」？

**生：** （预期：优点是……建议是……）

**师：** 好。[学生名]，你对这个建议怎么看？如果你的下一个版本按照这个建议改，你觉得会怎样？

**生：** （预期：可能会更好 / 但是我担心……/ 我觉得还有另一个问题是……）

**师：** 好，这就是设计思维——不是「改了一定变好」，而是「改了会带来什么新的权衡」。

**学生路演引导词（当学生卡壳时使用）：**

若学生在「设计意图」卡壳：
**师：** 你当时为什么把 HP 设成这个数字？是随机的还是有理由的？

若学生在「精彩瞬间」卡壳：
**师：** 锦标赛里你最紧张的是哪一场？或者最意外的是哪一场？就说那一场。

若学生在「设计复盘」卡壳：
**师：** 你输的那场，对方哪个属性让你最难受？如果把你的属性分配改一下，能不能针对性地克制它？

若学生整体准备不足：
**师：** 好，我给你 30 秒想一下。有一个问题你一定能回答：你和谁打的那一场，最让你印象深刻？说那一场就行。

**路演结束后的整体反思问题：**

**师：** 好，大家都路演完了。我有一个问题——你们今天路演，最难说的是哪个部分？是「展示角色」还是「设计意图」还是「设计复盘」？
【诊断点：学生是否认为「说为什么」比「说是什么」更难，反映其对设计思维的认知层级】【理解层】

**【分支A】若学生说「最难的是设计复盘」：**
**师：** 对，复盘最难。因为复盘要求你承认「我的设计有问题」，然后还要找到具体是什么问题，还要想出怎么改。这个能力叫「反事实推理」——世界上所有的工程师和设计师都在练这个能力。你们今天已经开始练了。

**【分支B】若学生说「最难的是设计意图，因为我当时随便分的」：**
**师：** 没关系，随便分也有设计意图——「我不知道怎么分，所以平均分」本身就是一个决策。下一次你设计角色的时候，在分属性之前先写一句话：「我要做一个什么风格的角色，要克制什么打法」，有了这句话，属性分配就有了方向。

---

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

**【环节】四课主线总结 (3分钟)**

**师：** 最后一个问题——锦标赛结束后，你们觉得游戏平不平衡？有没有某种打法「必赢」？

**生：** （预期：有一点不平衡 / 感觉高 ATK 的更容易赢 / 感觉差不多）

**师：** 游戏平衡是永远做不到「完美」的——哪怕是王者荣耀这种级别的游戏，每个版本也要出「平衡性调整」。你们今天做的游戏也一样，会有某些打法偏强。这是正常的。重要的是你们发现了这个问题，发现了就可以迭代。

好，进入总结。

**师：** 今天是涂鸦 PK 系列的最后一课。我们来回顾一下这四课做了什么——

【投屏展示四课主线总结】

```
第8课：需求文档 → 画图工具
  你用工程流程做了一个工具

第9课：需求文档 → 战斗系统 + 测试验证
  你用数据验证了你设计的规则

第10课：增量需求 → 动画 + 音效
  你用「感觉描述」扩展了系统

第11课：数据驱动 → 角色系统 + 锦标赛
  你让系统可以无限扩展
```

**师：** 但这四课里，你们学到的不是游戏。

你们学到的是——如何把一个想法，变成可以被验证、可以被扩展、可以被迭代的系统。

需求文档让你在动手之前想清楚。
测试验证让你知道自己做的对不对。
增量需求让你在已有基础上扩展，而不是推倒重来。
数据驱动让你的系统可以无限成长，不被代码本身限制。

**师：** 这四件事，就是工程师做事的方式。你们今天用这个方式，做出了一个可以全班对战的游戏。

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

**师：** 下节课，我们开始新的项目。你们在前面学到的这些能力——需求文档、增量迭代、数据驱动——会在接下来的项目里继续用到。

**师：** 本周 5 分钟 AI 挑战——给你的角色设计一个「2.0 版本」：改变属性分配，写下这次你要克制哪种打法，以及你的设计理由。不需要改代码，只需要改 json 文件里的属性数值，然后写一段话说清楚「我为什么这样改」。下节课分享。

---

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

**窗口A——增量需求文档模板（教师投屏用）：**

```
增量需求文档 v1.0
项目：涂鸦PK战斗游戏
新增功能：roles 角色选择系统

1. 从 roles/ 文件夹读取所有 *.json 文件
   - 每个 json 包含字段：name, hp, atk, def, spd, skill
   - 如果文件夹为空或读取失败，显示提示信息「暂无角色，请检查 roles/ 文件夹」

2. 战斗开始前显示角色选择界面
   - 左侧：玩家角色列表（从 json 文件读取，动态生成）
   - 右侧：AI 对手角色列表（同上）
   - 每个角色显示名字 + HP/ATK/DEF/SPD 数值
   - 两侧可选同一个角色（允许镜像对战）

3. 选择确认
   - 点击「开始战斗」按钮进入战斗
   - 战斗时加载对应的同名 .png 文件作为角色图片
   - 如果 .png 不存在，使用默认占位图

4. 不修改原战斗逻辑
   - 只新增角色选择这一层
   - 原来的战斗循环、伤害计算、特技逻辑保持不动
```

**窗口C——保底执行提示词（学生直接使用）：**

```
我已有一个 Phaser.js 战斗游戏，两个角色数据现在是硬编码的。
现在我要加角色选择系统：

1. 从 roles/ 文件夹读取所有 *.json 文件
   （每个文件包含 name/hp/atk/def/spd/skill 字段）
2. 显示角色选择界面：左边选玩家角色（列表），右边选 AI 角色（列表）
3. 每个角色显示名字和属性数值
4. 选好后点「开始战斗」进入游戏，加载对应的同名 .png 作为角色图片
5. 如果 .png 不存在，显示默认占位图

只输出新增/修改的代码部分，不要重写整个游戏。
在代码里加注释说明每段新增代码的作用。
```

**路演辅助提示词（给路演准备不足的学生）：**

```
我的游戏角色数据是：
名字：XX
HP=[数字], ATK=[数字], DEF=[数字], SPD=[数字]
特技：[特技描述]

在班级锦标赛中，我赢了[X]场，输了[X]场。

帮我用 3 个问题引导我做「设计复盘」——只问问题，不给答案。
```

**进阶提示词（给完成基础任务、想进一步扩展的学生）：**

```
我的角色选择系统已经完成了。现在我想加一个「角色详情」功能：
点击角色卡片时，弹出一个详情面板，显示：
1. 角色大图（放大版的 .png）
2. 属性条形图（HP/ATK/DEF/SPD 各用一条进度条表示，满分100）
3. 特技说明（从 json 里读取 skill 字段，格式化显示）
4. 「选择此角色」按钮

只输出新增代码，不改变现有的选择界面逻辑。
```

---

### 6. 教师指南

**本课技术备注：**

**关于浏览器无法直接读取本地文件夹的问题：**

浏览器出于安全原因，无法用 `fetch('roles/角色.json')` 直接读取本地文件夹（会报 CORS 错误）。解决方案：
- 方案A（推荐）：用 Trae IDE 的本地服务器功能启动项目（Trae 内置 Live Server，自动解决 CORS 问题）
- 方案B：让 AI 生成一个简单的 Node.js 本地服务器（`node server.js`），在本地 8080 端口提供文件服务
- 方案C（备用）：改为手动列出所有角色文件名，用 `Promise.all` 批量 fetch（避免了「自动扫描文件夹」的需求，但需要每次加新角色时在列表里加一个文件名）

**备课时务必先在 Trae 里跑通，确认本地服务器正常。**

**关于 Phaser.js 动态加载 Spritesheet：**

Phaser 的 `this.load.spritesheet()` 需要在 `preload()` 阶段调用，不能在游戏运行时动态加载。如果 AI 生成的代码在 `create()` 里加载图片，会报错。解决方案：提示词加上「角色图片需要在 preload 阶段加载，请用 scene.restart() 重新启动场景来实现动态切换角色」。

**锦标赛组织 FAQ：**

| 问题 | 应对 |
|------|------|
| roles 系统没做好，无法进行锦标赛 | 退回到手动改代码换角色，每场由教师提前改好对应角色的数据，坚持锦标赛进行 |
| 某位学生的角色文件损坏/无法加载 | 临时用教师提前准备的备用角色文件替换 |
| 6人以下小班（如只有4人）| 改为双败赛制（输两场才淘汰），增加对战场次 |
| 学生对结果强烈不满（认为Bug导致输了）| 认可情绪，说「你可以在5分钟挑战里设计2.0版本，下次来复仇」 |
| 路演时学生只说功能不说设计意图 | 用引导词打断：「等等，你刚才说了做了什么。现在告诉我，你为什么这样做？」 |

**路演控时技巧：**
- 用手机计时，3分钟倒计时给学生看
- 到2分30秒时轻声提醒：「还有30秒」
- 如果学生还没到「设计复盘」环节，可以跳过「精彩瞬间」直接问：「如果重来你会怎么改？」
- 互评限时 30 秒：「一个优点，一个建议，简短说」
- 路演顺序建议：冠军最后一个路演，制造节奏感；输了第一场的同学第一个路演，减少等待焦虑

**关于「数据驱动设计」的深度追问（给理解快的学生）：**

如果有学生问「为什么要把数据和代码分开，直接写在代码里不是更方便吗？」，这是一个很好的问题，可以这样回答：

「当你只有 2 个角色的时候，写死在代码里确实更方便。但当你有 100 个角色的时候呢？当别人也要给你的游戏加角色的时候呢——你要让他改你的代码吗？数据和代码分离，是为了让扩展和维护变得容易。这个原则不只在游戏里，几乎所有的软件系统都在用——数据库、配置文件、皮肤系统，都是同一个思路。」

**锦标赛后的班级文化建立：**

锦标赛不是为了分出高下，是为了制造「真实战斗测试」的场景。建议在锦标赛结束后强调：
- 不设「最强角色」称号，只设「冠军」（今日锦标赛冠军，不代表绝对最强）
- 鼓励「最有创意设计」：给属性分配最特别、最有设计理由的角色点名表扬
- 鼓励「最佳复盘」：在路演中，给复盘最到位、最有具体改进方案的同学点名表扬

**课堂风险预案：**
- 如果 Trae 本地服务器启动失败：切换到 Kimi 直接生成 HTML，不依赖本地服务器
- 如果锦标赛时间不够（roles 系统做得慢）：缩减锦标赛场次，只打半决赛 + 决赛（两场）
- 如果进度差异过大（有学生roles系统5分钟做完，有学生20分钟还没做好）：先完成的学生做进阶任务（角色详情弹窗），帮进度慢的学生看报错

---

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

**本周挑战：** 给你的角色设计「2.0 版本」

**挑战说明：**
打开你角色的 json 文件，修改属性数值，设计一个新版本。要求写一段话（3-5句）说清楚三件事：
1. 你改了哪些属性，改成了什么数字
2. 这次你想克制哪种打法（比如：克制高 ATK 爆发型 / 克制高 SPD 速攻型）
3. 你觉得这样改会带来什么新的弱点

不需要跑代码验证，只需要写出「设计意图」。

**下节课分享：** 下周课上选 2-3 位同学分享「我的 2.0 设计方案」，其他同学判断：这个改动真的能克制目标打法吗？

---

### 8. 拓展任务

**拓展一（推荐）：角色详情卡**

在角色选择界面里，给每个角色加一个「详情」功能：点击角色名字时，弹出一个小面板，用条形图显示 HP/ATK/DEF/SPD 的比例关系（满分100的进度条），让玩家在选角色前能直观对比属性强弱。

提示：条形图可以用 HTML 的 `<progress>` 标签，或者用 CSS 的 `width` 百分比实现。

**拓展二（挑战）：战斗回放摘要**

每场战斗结束后，自动生成一段「战斗日志」：记录关键回合（如特技触发、HP 归零）的文字摘要。格式参考：

```
第3回合：章鱼怪特技「连击」触发，对火焰鸟造成双倍伤害 28 点
第5回合：火焰鸟 HP 归零，章鱼怪以 HP 34 获胜
```

这个功能需要在战斗循环里加「事件记录」逻辑，是真正的功能扩展挑战。
