Skip to content

从想法到作品 / 章节 03

第三章|为了改好它,我们需要学什么 ​

读完这一章,你可以

理解计时与状态,写出可以逐项检查的暂停需求。

上一章,我们把“更适合新手”变成了明确的速度档规则。你已经能通过几轮对话推进一次修改。现在再加一个暂停功能,很容易脱口而出:“帮我加个暂停按钮。”

但暂停之后哪些东西停下、哪些东西保留,游戏结束后能否继续,重新开始是否清除暂停状态?如果这些还说不清,Agent 就需要替我们作决定。

我想在这一章带大家练习:为了提出更精确的修改要求,主动学习与这次修改有关的知识,再把学到的东西用回作品。 找代码、请 AI 解释、查文档、作预测,都是为这个目的服务。

这次要学到的,是把“暂停”说准确 ​

先把最初的愿望放在这里:

text
帮我加一个暂停按钮,点一下停下来,再点一下继续。

如果只看这句话,可能觉得已经很清楚。再往下问两步,就会发现它还没有覆盖完整的行为:

  • 游戏还没开始,点暂停会怎样?
  • 游戏正在运行,暂停时蛇的位置是否保留?
  • 暂停后点重开,是继续旧一局,还是从头开始?
  • 游戏已经结束,再点继续能不能恢复?

这些问题决定了功能怎样实现。要回答它们,我们需要认识游戏在不同阶段的情况,以及一次移动怎样被触发。

所以,这一轮学习先围绕两个问题:当前游戏怎样运行;暂停会改变其中哪些关系。 先学到能够作出这些判断,再决定要不要继续深入其他语法和原理。

沿着这次修改,把需要的知识学到能用 ​

下面的几轮对话是一段完整的学习过程。我们始终围绕“把暂停做准确”往前走。

第一轮:先请它指出当前实现 ​

text
我准备增加暂停功能,但还不清楚当前游戏怎样运行。

请先阅读现有代码,找到:
- 开始一局后,蛇的移动怎样被持续触发?
- 当前怎样记录游戏是否已经开始或结束?
- 重新开始时,哪些数据和运行过程会重置?

标出相关文件与函数,并沿一次“开始—移动—结束”的顺序解释。
这一轮先帮助我理解,暂时不要修改。

拿到回答后,打开它指出的位置,对照着看。先把过程连起来:这里接收开始操作,这里安排移动,这里判断结束,这里负责重新开始。

当前实现可能用定时器,也可能用动画循环。先让 Agent 说明这份项目采用哪种方式。我们需要理解的是眼前这份代码,才能判断暂停应该插入哪里。

如果它一次讲了很多陌生词,可以接着发:

text
先只解释暂停需要用到的关系。
请用“什么触发移动、什么情况下停止、恢复时需要保留什么”来说明,
并把术语对应到当前代码的位置。

这条补充让解释回到当前目的。你也在决定自己这一轮先学什么。

第二轮:把不同情况摆出来,再作选择 ​

text
请结合当前实现,帮我区分待开始、运行中、已暂停、已结束四种情况。

分别说明:蛇是否移动、当前位置是否保留、哪些按钮可以使用。
先列出来让我作选择,暂时不实现。

我们可以把希望得到的行为整理成下面这样:

游戏处于什么情况蛇是否移动点击暂停或继续点击重新开始
待开始否暂不使用开始新一局
运行中是暂停,保留当前局面开始新一局
已暂停否从当前局面继续放弃旧局面,开始新一局
已结束否暂不使用开始新一局

这里,我们开始用“状态”描述游戏当前处于哪一种情况。把情况分清,按钮和移动逻辑就有了共同依据。比如“已暂停”和“已结束”都不移动,但前者可以继续,后者需要重开。

你现在已经比“加一个按钮”多理解了一层:暂停功能需要处理不同情况之间的变化。 下一条修改要求,就可以把这些选择写进去。

暂停与继续

0 分
位置0
触发器
状态待开始

第三轮:用一个预测检查自己的理解 ​

先别急着让它改。挑一个最容易混淆的情况,试着解释会发生什么:

text
我的理解是:暂停保留当前蛇、食物、分数和档位;
继续是在这些内容不变的情况下恢复移动。
重开则结束旧一局,重置蛇、食物和分数,再使用当前档位开始。

请结合代码检查我的理解,指出遗漏。
再给我一个需要预测结果的小问题,我先回答。

比如它问:“如果每次继续都新建一个移动循环,却没有处理旧循环,可能出现什么?”你可以先预测,再去看循环怎样开始和停止。

若预测是“可能同时有多个循环,移动节奏异常”,继续确认当前代码是否会出现这个情况。若还无法解释,就把这一点作为新的学习问题,请它单独展开。

我希望大家在这里形成一个习惯:能跟着听懂之后,再试着自己解释或预测。预测与实际不一致的地方,就是下一步值得弄明白的地方。

第四轮:对不确定的细节查一段文档 ​

假设当前代码使用 setInterval 安排移动,你想确认怎样停止它,可以这样问:

text
当前实现使用 setInterval。我想确认停止旧循环的方式。
请给出对应的官方文档,指出我应该先读哪一段,
再解释它与当前开始、暂停和重开代码的关系。

读到 clearInterval 时,把它与代码中保存的计时器标识联系起来。然后再看:暂停时会停止什么,继续时怎样恢复,重开会不会遗留旧循环。需要时回看计时与暂停的小例子。

如果当前代码采用其他机制,就跟着它查对应文档。需要确认的关系仍然是:谁在触发更新,暂停怎样停止更新,恢复怎样继续。

查文档不是另开一轮漫长学习,而是解决当前解释中一个明确的不确定点。把这一点确认后,就回到修改任务。

第五轮:把理解写回修改要求 ​

现在可以发出比开头更准确的任务:

text
请按刚才讨论的行为增加暂停与继续:

1. 运行中点击暂停,停止本局的移动更新,保留蛇、食物、分数和档位。
2. 已暂停时点击继续,从保留的局面恢复,避免重复启动移动循环。
3. 待开始和已结束时,暂停/继续按钮不可用于恢复游戏。
4. 重开会结束旧一局的运行过程,重置本局数据,再按当前档位开始。
5. 按钮文字与当前情况一致:运行中显示暂停,暂停后显示继续。

请先说明需要调整的位置,再实施。
保留已有速度选择、计分和碰撞规则。

对比“帮我加一个暂停按钮”,这里多出的条件来自刚才的学习。你理解了要保留哪些内容、何时可以继续,也开始知道重复启动为什么值得检查。

这样,技术知识已经变成了你控制作品的能力。即使具体代码由 Agent 完成,你也能作出更明确的选择。

第六轮:用操作检查要求,也检查理解 ​

改完之后,先按自己作出的选择体验:

text
请把刚才的暂停要求转成检查步骤。
重点覆盖:运行→暂停→继续、暂停→重开、结束→尝试继续。
同时列出需要顺带检查的已有行为。

随后实际操作,比较结果。例如,暂停后蛇不动,但重开仍显示“继续”,就把这条现象反馈回去;如果重开后移动异常,可以检查旧循环的处理。

每次反馈尽量对应前面的一条要求。你既在验证功能,也在确认自己学到的关系能否解释实际表现。

再看这条“为修改而学习”的路径 ​

这次我们从一个模糊功能出发,依次做了这些事:

指出想改什么 → 找到当前实现 → 理解相关关系 → 作预测、确认疑问 → 写出准确要求 → 运行检查。

“学到什么程度才能继续修改”,也可以放在这条路径里判断:你能否解释当前要改变的行为,能否说明哪些已有行为要保留,能否提出检查方法?如果还不能,就继续补与这个判断有关的一小块知识。

这里的学习有很明确的去向。读完一段解释,马上可以用来改写需求;查完一个接口,马上可以用来判断方案;作出一个预测,马上可以安排检查。

我建议留下三行记录:这次要改什么,学懂了什么关系,怎样用它改变了要求。以后回到项目,也能找回当时作决定的理由。

把同一种方法用到其他任务 ​

这条路径也适用于后面的 Skill、MCP 和 API:

你想作出的修改为了改准确,需要先弄清什么学完之后可以提出什么要求
让一个 Skill 在合适任务中触发工具怎样发现技能,描述怎样表达适用场景调整描述,并用相关、无关任务比较触发结果
让 Agent 使用一个外部工具服务提供哪些操作,需要哪些输入指定工具要完成的任务,并检查返回结果
改善 API 生成的点评程序传入了什么,怎样取出回答调整消息与数据,再用固定输入比较效果
改变表格统计规则每列含义、缺失值与统计范围写清计算规则,并用小样本核对

先从你想改变的结果反推要学什么,知识就会与自己的任务建立联系。

练习:把一句愿望推进一轮 ​

从“游戏按钮不好用”“生成的点评太空泛”“整理出来的表格不对”中选一个,或者写自己的问题。

先写最初那句愿望,再写下一条准备发给 Agent 的 prompt。说明你要了解哪一部分,学懂之后准备作出什么更精确的决定。

想好以后,看看参考思路

参考思路:“点评太空泛”可以继续问程序传入了哪些本局数据。若只传分数,就先理解输入范围,再决定补数据还是调整要求。学习的结果应体现在下一条任务里。

PS|阅读时可以回来看 ​

PS 1:状态。 状态描述程序当前处于什么情况。状态变化会影响允许执行的操作和界面呈现。这里用它解释暂停、继续与重开的关系;具体采用哪些变量,取决于当前实现。

PS 2:定时器与循环。 定时器可以按安排重复触发处理,动画循环也可以组织连续更新。先读当前项目采用的机制,再查它对应的启动、停止和恢复方式。

PS 3:代码与文档怎样配合。 代码告诉我们这个项目实际怎样写,文档帮助确认所用接口的规则。让 Agent 解释时,把二者对应到同一次操作,就容易检查是否理解。

现在,暂停的要求已经更清楚了。接下来如果实现后仍有故障,或者一轮修改影响了原有功能,我们就需要第四章的复现、排错和版本恢复。

停一下,检查自己的理解 ​

RECALL / 一分钟回忆

暂停贪吃蛇时,怎样处理计时与状态更合理?

本站点基于 MIT License 发布