从想法到作品 / 章节 03
第三章|为了改好它,我们需要学什么
读完这一章,你可以
理解计时与状态,写出可以逐项检查的暂停需求。
上一章,我们把“更适合新手”变成了明确的速度档规则。你已经能通过几轮对话推进一次修改。现在再加一个暂停功能,很容易脱口而出:“帮我加个暂停按钮。”
但暂停之后哪些东西停下、哪些东西保留,游戏结束后能否继续,重新开始是否清除暂停状态?如果这些还说不清,Agent 就需要替我们作决定。
我想在这一章带大家练习:为了提出更精确的修改要求,主动学习与这次修改有关的知识,再把学到的东西用回作品。 找代码、请 AI 解释、查文档、作预测,都是为这个目的服务。
这次要学到的,是把“暂停”说准确
先把最初的愿望放在这里:
帮我加一个暂停按钮,点一下停下来,再点一下继续。如果只看这句话,可能觉得已经很清楚。再往下问两步,就会发现它还没有覆盖完整的行为:
- 游戏还没开始,点暂停会怎样?
- 游戏正在运行,暂停时蛇的位置是否保留?
- 暂停后点重开,是继续旧一局,还是从头开始?
- 游戏已经结束,再点继续能不能恢复?
这些问题决定了功能怎样实现。要回答它们,我们需要认识游戏在不同阶段的情况,以及一次移动怎样被触发。
所以,这一轮学习先围绕两个问题:当前游戏怎样运行;暂停会改变其中哪些关系。 先学到能够作出这些判断,再决定要不要继续深入其他语法和原理。
沿着这次修改,把需要的知识学到能用
下面的几轮对话是一段完整的学习过程。我们始终围绕“把暂停做准确”往前走。
第一轮:先请它指出当前实现
我准备增加暂停功能,但还不清楚当前游戏怎样运行。
请先阅读现有代码,找到:
- 开始一局后,蛇的移动怎样被持续触发?
- 当前怎样记录游戏是否已经开始或结束?
- 重新开始时,哪些数据和运行过程会重置?
标出相关文件与函数,并沿一次“开始—移动—结束”的顺序解释。
这一轮先帮助我理解,暂时不要修改。拿到回答后,打开它指出的位置,对照着看。先把过程连起来:这里接收开始操作,这里安排移动,这里判断结束,这里负责重新开始。
当前实现可能用定时器,也可能用动画循环。先让 Agent 说明这份项目采用哪种方式。我们需要理解的是眼前这份代码,才能判断暂停应该插入哪里。
如果它一次讲了很多陌生词,可以接着发:
先只解释暂停需要用到的关系。
请用“什么触发移动、什么情况下停止、恢复时需要保留什么”来说明,
并把术语对应到当前代码的位置。这条补充让解释回到当前目的。你也在决定自己这一轮先学什么。
第二轮:把不同情况摆出来,再作选择
请结合当前实现,帮我区分待开始、运行中、已暂停、已结束四种情况。
分别说明:蛇是否移动、当前位置是否保留、哪些按钮可以使用。
先列出来让我作选择,暂时不实现。我们可以把希望得到的行为整理成下面这样:
| 游戏处于什么情况 | 蛇是否移动 | 点击暂停或继续 | 点击重新开始 |
|---|---|---|---|
| 待开始 | 否 | 暂不使用 | 开始新一局 |
| 运行中 | 是 | 暂停,保留当前局面 | 开始新一局 |
| 已暂停 | 否 | 从当前局面继续 | 放弃旧局面,开始新一局 |
| 已结束 | 否 | 暂不使用 | 开始新一局 |
这里,我们开始用“状态”描述游戏当前处于哪一种情况。把情况分清,按钮和移动逻辑就有了共同依据。比如“已暂停”和“已结束”都不移动,但前者可以继续,后者需要重开。
你现在已经比“加一个按钮”多理解了一层:暂停功能需要处理不同情况之间的变化。 下一条修改要求,就可以把这些选择写进去。
暂停与继续
第三轮:用一个预测检查自己的理解
先别急着让它改。挑一个最容易混淆的情况,试着解释会发生什么:
我的理解是:暂停保留当前蛇、食物、分数和档位;
继续是在这些内容不变的情况下恢复移动。
重开则结束旧一局,重置蛇、食物和分数,再使用当前档位开始。
请结合代码检查我的理解,指出遗漏。
再给我一个需要预测结果的小问题,我先回答。比如它问:“如果每次继续都新建一个移动循环,却没有处理旧循环,可能出现什么?”你可以先预测,再去看循环怎样开始和停止。
若预测是“可能同时有多个循环,移动节奏异常”,继续确认当前代码是否会出现这个情况。若还无法解释,就把这一点作为新的学习问题,请它单独展开。
我希望大家在这里形成一个习惯:能跟着听懂之后,再试着自己解释或预测。预测与实际不一致的地方,就是下一步值得弄明白的地方。
第四轮:对不确定的细节查一段文档
假设当前代码使用 setInterval 安排移动,你想确认怎样停止它,可以这样问:
当前实现使用 setInterval。我想确认停止旧循环的方式。
请给出对应的官方文档,指出我应该先读哪一段,
再解释它与当前开始、暂停和重开代码的关系。读到 clearInterval 时,把它与代码中保存的计时器标识联系起来。然后再看:暂停时会停止什么,继续时怎样恢复,重开会不会遗留旧循环。需要时回看计时与暂停的小例子。
如果当前代码采用其他机制,就跟着它查对应文档。需要确认的关系仍然是:谁在触发更新,暂停怎样停止更新,恢复怎样继续。
查文档不是另开一轮漫长学习,而是解决当前解释中一个明确的不确定点。把这一点确认后,就回到修改任务。
第五轮:把理解写回修改要求
现在可以发出比开头更准确的任务:
请按刚才讨论的行为增加暂停与继续:
1. 运行中点击暂停,停止本局的移动更新,保留蛇、食物、分数和档位。
2. 已暂停时点击继续,从保留的局面恢复,避免重复启动移动循环。
3. 待开始和已结束时,暂停/继续按钮不可用于恢复游戏。
4. 重开会结束旧一局的运行过程,重置本局数据,再按当前档位开始。
5. 按钮文字与当前情况一致:运行中显示暂停,暂停后显示继续。
请先说明需要调整的位置,再实施。
保留已有速度选择、计分和碰撞规则。对比“帮我加一个暂停按钮”,这里多出的条件来自刚才的学习。你理解了要保留哪些内容、何时可以继续,也开始知道重复启动为什么值得检查。
这样,技术知识已经变成了你控制作品的能力。即使具体代码由 Agent 完成,你也能作出更明确的选择。
第六轮:用操作检查要求,也检查理解
改完之后,先按自己作出的选择体验:
请把刚才的暂停要求转成检查步骤。
重点覆盖:运行→暂停→继续、暂停→重开、结束→尝试继续。
同时列出需要顺带检查的已有行为。随后实际操作,比较结果。例如,暂停后蛇不动,但重开仍显示“继续”,就把这条现象反馈回去;如果重开后移动异常,可以检查旧循环的处理。
每次反馈尽量对应前面的一条要求。你既在验证功能,也在确认自己学到的关系能否解释实际表现。
再看这条“为修改而学习”的路径
这次我们从一个模糊功能出发,依次做了这些事:
指出想改什么 → 找到当前实现 → 理解相关关系 → 作预测、确认疑问 → 写出准确要求 → 运行检查。
“学到什么程度才能继续修改”,也可以放在这条路径里判断:你能否解释当前要改变的行为,能否说明哪些已有行为要保留,能否提出检查方法?如果还不能,就继续补与这个判断有关的一小块知识。
这里的学习有很明确的去向。读完一段解释,马上可以用来改写需求;查完一个接口,马上可以用来判断方案;作出一个预测,马上可以安排检查。
我建议留下三行记录:这次要改什么,学懂了什么关系,怎样用它改变了要求。以后回到项目,也能找回当时作决定的理由。
把同一种方法用到其他任务
这条路径也适用于后面的 Skill、MCP 和 API:
| 你想作出的修改 | 为了改准确,需要先弄清什么 | 学完之后可以提出什么要求 |
|---|---|---|
| 让一个 Skill 在合适任务中触发 | 工具怎样发现技能,描述怎样表达适用场景 | 调整描述,并用相关、无关任务比较触发结果 |
| 让 Agent 使用一个外部工具 | 服务提供哪些操作,需要哪些输入 | 指定工具要完成的任务,并检查返回结果 |
| 改善 API 生成的点评 | 程序传入了什么,怎样取出回答 | 调整消息与数据,再用固定输入比较效果 |
| 改变表格统计规则 | 每列含义、缺失值与统计范围 | 写清计算规则,并用小样本核对 |
先从你想改变的结果反推要学什么,知识就会与自己的任务建立联系。
练习:把一句愿望推进一轮
从“游戏按钮不好用”“生成的点评太空泛”“整理出来的表格不对”中选一个,或者写自己的问题。
先写最初那句愿望,再写下一条准备发给 Agent 的 prompt。说明你要了解哪一部分,学懂之后准备作出什么更精确的决定。
想好以后,看看参考思路
参考思路:“点评太空泛”可以继续问程序传入了哪些本局数据。若只传分数,就先理解输入范围,再决定补数据还是调整要求。学习的结果应体现在下一条任务里。
PS|阅读时可以回来看
PS 1:状态。 状态描述程序当前处于什么情况。状态变化会影响允许执行的操作和界面呈现。这里用它解释暂停、继续与重开的关系;具体采用哪些变量,取决于当前实现。
PS 2:定时器与循环。 定时器可以按安排重复触发处理,动画循环也可以组织连续更新。先读当前项目采用的机制,再查它对应的启动、停止和恢复方式。
PS 3:代码与文档怎样配合。 代码告诉我们这个项目实际怎样写,文档帮助确认所用接口的规则。让 Agent 解释时,把二者对应到同一次操作,就容易检查是否理解。
现在,暂停的要求已经更清楚了。接下来如果实现后仍有故障,或者一轮修改影响了原有功能,我们就需要第四章的复现、排错和版本恢复。
停一下,检查自己的理解
RECALL / 一分钟回忆
先凭自己的理解选一项,再看解释。
