我的俄罗斯方块全通关之旅
速览
这是一篇个人体验记录,作者试图完整探索经典游戏俄罗斯方块的所有可能场景和状态,包括各种方块组合、关卡变化等。文章可能涉及游戏机制分析和挑战过程中的思考,但并非AI相关话题。
AI 深度解读
背景
2026 年初,Antithesis 公司的作者正陷入焦灼。几年前,他曾宣称公司已经“打败”了《Tetris》,按照传统,被“打败”的游戏名称会被用来命名会议室——自 2021 年起,办公室就有一间名为“Tetris”的房间。然而,这一胜利宣言很快被现实超越:青少年玩家们学会了如何将人类操作延伸到游戏更深层次,而公司的产品尚未触及这些区域。作者因此将“追上这些青少年”作为自己的副线任务。
这场追逐的目标是“重生”(Rebirth)——打通《Tetris》所有关卡,直到等级计数器从 255 翻转为 0。当这一时刻发生,游戏会回到第 0 级的速度和配色方案,然后重新开始攀升等级。作者认为,如果能“看尽整个《Tetris》”,就足以声称已经打败了它。不幸的是,他们的探索卡在了第 160 级。作者即将加入一个新部门,一旦成行,可能再也没有时间研究《Tetris》了——但他偏偏就被卡在那里。
不过,这个故事最终有 happy ending,尽管解决“卡关”的过程令人极其沮丧。一切要从头说起。
核心内容
为什么是《Tetris》?
在 Antithesis 早期,新工程师会经历一个“入门仪式”:通过使用公司系统来游玩并希望打败一款经典 NES 游戏,从而学会系统操作。团队已攻克了许多经典作品,包括《Mario》《Zelda》《Metroid》。作者 2019 年加入时选择了《Arkanoid》(这是他第二喜欢的 NES 游戏),而他最爱的《Tetris》则早有人尝试过。
作者在上世纪 90 年代因出差欧洲而半上瘾于《Tetris》。当时的机上娱乐系统革命性地提供了座位端游戏,他享受用空间推理来旋转和定位方块的过程,看着完整行消失、分数增加,获得了即时满足感。当然,《Tetris》不会让你舒适太久——当你刚进入节奏时,方块下落速度加快。一旦犯错(比如用新方块盖住空缺),你就不得不转入防守,用未来的健康换取当前不崩溃。没有终点线:你只能一直玩直到输掉。没有人能全身而退。
此前团队尝试打败《Tetris》时取得了一些进展,但并未深入太远。然而,“打败《Tetris》”的想法一直萦绕在作者心头,成为一个长期副项目。但什么才算“打败”?在 Antithesis,通常“打败”一个游戏意味着发现一组用户输入,使游戏走向胜利结局。由于《Tetris》没有胜利状态,准确定义“打败”有些模糊——这一理解在过程中逐渐演变,部分得益于青少年玩家的贡献。
Antithesis 如何玩游戏
Antithesis 以不寻常的方式玩《Tetris》:它既不是典型的工具辅助竞速(TAS,从头构建一组完美用户输入),也不是创建一个能观看屏幕并作出反应的机器人。相反,它运行小规模的随机输入试验,从已知起始游戏状态出发,评估每个试验对游戏的影响,并记住那些被认为对目标“有趣”的游戏情境。
NES 游戏的行为完全由接收的用户输入决定,这允许公司吝啬地保存游戏快照。只要保存发送给游戏的每一个输入,就可以从状态历史中最近的一个快照开始,通过回放所需的输入,重建任意游戏状态。
典型测试运行设置中,一个 Antithesis fuzzer 会同时喂养 32 个模拟的 NES 会话,每个会话加载目标游戏。每个会话通过 fceux 模拟器托管,并利用 fceux 的 Lua 集成创建一个“驾驭脚本”(harness script)以无头模式运行模拟器。fuzzer 内部有一个名为“战术”(tactic)的组件,负责生成针对游戏的输入;另一个“策略”(strategy)组件则观察输入产生的结果,并引导 fuzzer 下一步的操作。
为了理解整体工作流程,可以放大到单个帧来看。NES 游戏以每秒 60 帧的速率循环,每帧包含以下动作:
- 驾驭脚本从输入管道接收来自 fuzzer 的一个输入字节。
- 驾驭脚本读取该字节并发送给等待的模拟器。
- 模拟器处理该字节,修改游戏内存,生成新的游戏画面,然后返回给驾驭脚本。
- 驾驭脚本查询模拟器,捕获特定游戏内存位置的值(可选地包括新的游戏画面),并将结果放入输出管道,异步返回给 fuzzer 处理。
- 驾驭脚本循环处理下一个输入。
fuzzer 与此循环异步工作:它预先为驾驭脚本生成输入批次,并在返回结果到达时进行观察。
有了这套机制,打败一个游戏归结为两点:
- 找到正确的战术(生成输入的算法)
- 找到正确的策略(引导 fuzzer 获胜)
对于无终点的《Tetris》,团队最初认为“打败”意味着做得和最好的人类一样好。但他们没有考虑到人类中的“其他人”。
第一回合:学习
同事 Alex Pshenichkin 此前已尝试让 fuzzer 玩《Tetris》。他通过读取模拟器内存弄清楚了如何获取当前方块布局,并基于找到的关于玩《Tetris》的研究,计算出了第一个“良好度”(goodness measure)。这个版本运行非常慢,因为生成输入的战术基本是随机输入。当把结果转换为录像时,观察方块下落就像观察飘在微风中的雪花——它们慢慢飘下屏幕,左右摇摆,最后落在随机位置。
他们的策略测量每一帧的棋盘状态,并并行探索多种多样的棋盘布局模式。结合随机战术,这完全押注在随机性上。在投入的时间中,他们从未能消除超过几行。
Alex 完成了核心设置的出色工作,但他的本职工作占用了时间,后来他成为产品核心(确定性虚拟机)的关键人物。《Tetris》项目只能搁置,直到一场全球大流行将其再次推到台前。
第二回合:天真的成功
2020 年,因 COVID-19 困在家中,作者开始将《Tetris》作为副项目。他想让战术和策略表现得更像最优的人类玩家。目标是彻底打败游戏,通过第 29 级——传统上击败人类玩家的关卡。在第 29 级,方块下落速度突然翻倍(从每行 2 帧变为每行 1 帧),方块从顶部掉落到底部仅需约三分之一秒。在这种速度下,标准按住左或右的移动方式无法在方块到达底部前将其从生成点移到最远端。因此几十年来,第 29 级被认为不可存活——一个“杀屏”(kill screen)……
(原文在此处截断,后续内容未提供。)
关键要点
- “打败”《Tetris》的定义模糊:由于游戏没有胜利状态,Antithesis 团队将“看尽所有关卡”视为目标,即等级计数器从 255 翻转为 0 的“重生”时刻。
- Antithesis 的独特游戏方法:不同于 TAS 或视觉机器人,它使用随机输入 fuzzing、状态快照、战术(生成输入)和策略(引导探索)的组合,在模拟器上并行测试。
- 人类玩家的突破:青少年玩家将人类操作扩展到产品未达到的区域(如第 160 级),迫使公司重新定义“胜利”。
- 瓶颈在第 160 级:作者的副项目卡在等级 160,而他将调任新部门,时间紧迫。
- 早期学习阶段效率极低:随机生成输入只能消除几行,远不及目标。
- 第 29 级的“杀屏”:传统上人类无法超越第 29 级,因为方块下落速度极快,标准操作无法应对。
意义与影响
- 对游戏 AI 测试的启示:Antithesis 的方法展示了如何用随机 fuzzing 探索无终点游戏的极限状态,而非依赖预定义完美输入。这为测试复杂系统(尤其是非确定性问题)提供了新思路。
- 人机协同的进化:人类玩家(青少年)突破了传统“杀屏”,推动了 AI 测试目标的重新定义——机器需要追赶人类的创造力,而非仅模仿历史最佳。
- 长期副项目的价值:看似简单的游戏背后隐藏着深度技术挑战,反映出现实系统中“无明确胜利条件”的探索,对软件测试和自动化有隐喻意义。
- 疫情影响下的副业转向:COVID-19 使作者有机会
