我是如何在第一款登月游戏中发现一个 55 年前的漏洞的
内容提要
1969年,Jim Storer开发了一款文字游戏“登月”,成为当时最受欢迎的计算机游戏之一。退休软件工程师Martin C. Martin最近发现了这款游戏的一个55年前的漏洞,导致登月器没有软着陆。研究发现,Jim Storer在计算平方根时少了一个2,导致计算错误。尽管有这个漏洞,这款游戏仍然很有趣。
延伸解读
漏洞的根源:一个缺失的2
Martin发现,Jim Storer在计算平方根时,分母中少了一个2。这个错误导致游戏低估了到达轨迹最低点所需的时间,进而使着陆判断出现偏差。具体来说,当登月舱接近地面时,程序无法准确检测到触地时刻,从而造成硬着陆或错过地面。这个看似微小的数学错误,在55年后才被注意到。
为何“自杀式燃烧”成为最优解
由于游戏使用齐奥尔科夫斯基火箭方程,而非简单的欧拉积分,燃料消耗与速度变化呈非线性关系。因此,理论上最省燃料的策略是:先自由落体,最后时刻全推力反推,即“自杀式燃烧”。但受限于漏洞,玩家无法实现完美软着陆,最佳结果也只能以1.66英里/小时的速度着陆,略高于游戏设定的1英里/小时完美标准。
漏洞的补偿与影响
为了弥补计算错误,Jim Storer在代码中增加了0.05秒的补偿,并从新的位置重新估算。但这导致第一次估算时登月舱还在下降,第二次估算时已到达最低点并开始上升,时间差不到0.05秒,因此错过了着陆时机。即使修复漏洞,由于泰勒展开只取前两项,着陆精度仍有限,但游戏依然可玩,只是无法达到理论上的完美着陆。
历史背景与作者评价
1969年,17岁的Jim Storer在PDP-8上用FOCAL语言编写了这款游戏,当时没有计算机代数系统,他只能手算推导。Martin认为,对于那个年代的高中生来说,这已是非常了不起的成就。尽管存在漏洞,游戏仍然有趣,吸引玩家探索最佳策略。这个错误存在了55年才被发现,也反映了早期编程环境的局限。
Q&A
《登月游戏》的开发背景是什么?
《登月游戏》由Jim Storer于1969年开发,灵感来源于阿波罗登月任务,成为当时最受欢迎的计算机游戏之一。
Martin C. Martin发现了什么漏洞?
Martin发现游戏中计算平方根时缺少一个2,导致登月器无法实现软着陆。
《登月游戏》的主要玩法是什么?
玩家需要操控登月器,通过输入燃料消耗量来实现月球的软着陆。
为什么游戏中的着陆计算会失败?
游戏在接触地面后,火箭方程的计算方法不再适用,导致着陆失败。
Jim Storer在游戏设计中使用了什么数学方法?
Jim Storer使用了齐奥尔科夫斯基火箭方程和泰勒展开式进行计算。
尽管存在漏洞,为什么Martin仍认为游戏有趣?
Martin认为游戏仍然吸引玩家探索最佳策略,尽管有技术缺陷。