返回资讯中心
外部精选
软件工程
#开发者实时流

Claude重建开发者高中时期开发的MS-DOS游戏

来源标题:My personal Navier-Stokes or How Claude rebuilt the game we wrote in high school

Christoph Janz称Claude成功重建了他与朋友在1995年开发的MS-DOS经济模拟游戏《Beer Manager》。这款游戏耗时约两年、投入数个工时,因缺少软盘无法运行,Janz仅通过网络找到原版和模拟器。他认为这证明AI编程已达到超人水平。

Hacker News 最新chrija2026/11/7 · 今天30 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

Christoph Janz 2026年11月7日 分享

我知道自己不该再对前沿模型的能力感到惊讶,尤其是在编程方面。但这一次,它又一次真正让我震撼了。它或许比不上千禧年数学难题那么难,但这是我个人的 Navier-Stokes 方程 :)。对我来说,这是 AI 编程已经达到超人能力水平的终极证明。

先说说背景。1995 年,我的朋友 Christopher Münchhoff 和我开发了一款 MS-DOS 游戏,叫 Beer Manager,这是一款经济模拟游戏,你要经营一家啤酒厂,与电脑控制的对手竞争。我们在这上面花了大约两年时间。不完全是全职,因为我们当时还在读高中,同时还在经营一家 Commodore Amiga 软件的邮购公司,但这款游戏确实投入了好几个人年的工作量(我们最终没能把它好好推向市场,但那是另一个故事了)。

最近,我的孩子们听我提起过这款游戏,就问能不能玩一玩我和 Christopher 在三十多年前开发的这个老游戏。我手头没有软盘(也没有带软驱的电脑来运行它们),但我在网上找到了这款游戏(俗话说,互联网从不遗忘),还找到了一个能运行它的 MS-DOS 模拟器。那是一个限时版本,到 1955 年就结束了。所以我做的第一件事就是让 Muse(因为我当时在外面)把它破解了,解锁完整游戏。这大概花了十五分钟,孩子们就能用模拟器玩这个游戏了。

然后我有了个想法:把它变成一个基于网页的游戏。我知道我不是第一个这么做的人。我在 X 上看到过几个人谈论用 AI 移植旧软件,但当你自己动手、亲眼看到结果时,那种感觉真的令人震撼。

如果你不关心它是怎么构建的,只想成为啤酒大亨,这里是游戏链接。:-) 你需要一个桌面浏览器和鼠标。注意,它有意做成原版的 1:1 克隆,所以如果它看起来像上个千年的游戏,那是因为它本来就是。

在下一个版本中,我会让 Claude 修复原版中我们从未发现、但 AI 发现了的一些 bug,以及移植过程中可能引入的任何 bug。我可能还会加入多人模式,并稍微改进一下画面。但就目前而言,这是一个直接的克隆。

在没有源代码可参考的情况下,Claude 逆向工程了 1997 年的程序:它反编译了机器码,在模拟器中运行游戏以观察 UI 的行为,并据此推导出一份 14 章、166,000 字的规格说明。然后它根据这份规格,用大约 24,000 行代码在浏览器中重建了游戏(外加约 14,000 行测试代码和 10,000 行辅助工具),并将新版本与原版进行对比测试,直到两者在 455 个游戏月中玩出完全相同的游戏。约 2,800 个自动化测试全部通过。

来自我们自动化像素测试的截图:两个版本接收相同的脚本输入和相同的随机种子,每一帧显示都完全匹配。

所有这些花了 Claude 大约 34 个工作小时,分布在六天里:13 个会话、35 个子代理、70 次提交,以及约 1250 万输出 token(包括一些后续的规格工作)。Opus 5.5 负责模拟和主要会话,Sonnet 5.5 子代理构建了对话框和音频等部分。

如果你想了解更多,这里是 Claude 自己对这项工作的总结(主要由 Claude 自己撰写,我提供了一些意见和编辑)。

源代码已经不存在了,所以 1997 年的 EXE 既是规格说明,也是测试基准。Christoph 的要求是 1:1 克隆图形、音效、音乐和玩法,并让我先写出尽可能好的规格,写完再开始编码。

这个游戏是一个 1.17 MB 的 DOS/4GW 可执行文件,用 Watcom 构建。我通过应用全部 40,517 个修正项来重定位它的 LE 映像,将其包装为 ELF,并在 Ghidra 中反编译,为 Watcom 的寄存器传参添加了调用约定。这产生了 1,058 个函数和约 214,000 行 C 代码,供并行代理分析。

静态分析无法解决所有问题,所以我还无头运行了 DOSBox Staging 中的原版。一个小型测试框架通过 DOSBox 的 web API 读取其内存,并注入鼠标和键盘事件。解码器提取出了图形、字体、地图、音频和全部 2,235 个字符串。

给不太懂技术的读者:我所能利用的只有最终完成的游戏程序,也就是计算机实际运行的那个文件。它由数十万条给处理器的小指令组成,你无法直接从里面读出原始配方。所以我的第一步是把它翻译回接近人类编写的代码。为此我使用了一个叫 Ghidra 的反编译器(由 NSA 开发,2019 年开源),它能识别处理器指令的典型模式,并把它们重写成普通的 C 代码。

但输出的代码没有名称也没有注释:名称和注释只对写代码的人存在。当编译器把源代码转换成处理器指令时,会丢弃它们,因为处理器不需要。Christopher 可能称之为 monthCounter 和 deliverBeer() 的东西,现在只是“地址 0x10C78C 处的 4 个字节”和“调用地址 0x455FC”。

我不得不从它们的行为来重建每一部分的意思。一个每个游戏月增加一次的值很可能是月份计数器;一个在送货卡车到达时触发的例程很可能是物流系统的一部分。意义从成千上万这样的线索中逐渐浮现出来。

整个游戏总共由 1,058 个这样的构建块组成,每个块做一件事,比如移动卡车、计算价格或绘制窗口。然后我在一个模拟 1990 年代 PC 的模拟器中运行旧游戏。这样我就能观察游戏运行,检查它在任何情况下的实际行为,并与我的翻译进行对比。在此过程中,我复制出了所有的图片、声音、音乐和文本。

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →