爆肝两周,重写 1978 版《超级星际迷航》代码

爆肝两周,重写 1978 版《超级星际迷航》代码

《星际迷航》这个大 IP 在几十年的时间里衍生出了众多电影、小说和游戏,在各个领域遍地开花。自《星际迷航》系列游戏推出以来已经有了多个系列,吸引了不少忠实粉丝。

Emanuele Bolognesi 就是复古游戏、复古编程的忠实爱好者。过去一段时间他利用全部空闲时间全身心的投入到了重写 1978 年的老版《超级星际迷航》中。

image.png

《超级星际迷航》是一个古老的纯文本游戏,是一种用 BASIC 编写的基于回合的空间策略模拟的例子。在这个游戏中,你是 Enterprise 星际飞船的船长,你的任务是侦察联盟空间并消灭所有入侵的 Klingon 飞船。

游戏过程中你必须小心管理飞船的能量,使用相位炮和鱼雷摧毁 Klingon 飞船,并且找到星际基地来修复损坏并补充你的能量。所有这些,都是通过屏幕上的几个角色和丰富的想象力呈现出来的。

尽管它很简单,但它是编程和游戏设计的一个很好的例子。你可以在提示符下控制命令的输入:NAV 移动飞船,PHA 用相位枪开火,LRS 用远程传感器扫描象限等等。

《超级星际迷航》创建于 1974 年,在 1978 年由 Bob Leedom 撰写改进版本,并在 《BASIC COMPUTER GAMES》一书中出版后大受欢迎。

《超级星际迷航》不是一个在磁盘上发行的游戏,这本书中包含了代码,人们不得不在计算机上输入代码。由于当时 BASIC 是一种通用语言,因此游戏代码可以在许多不同的机器上运行。

image.png

37 年后重温经典游戏

1983 年,Emanuele Bolognesi 买了一本意大利出版的书,书名叫《Zap! Pow! Boom! Arcade Games for the VIC-20 by Mark Ramshaw》。它包含用 BASIC 编写的 VIC-20 的 30 款游戏,其中第八个游戏叫做《星际迷航》。

Emanuele Bolognesi 将它全部拷贝到自己的 VIC-20 上。他说:“它很简单,但我立刻爱上了它。这可能是我在那台电脑上玩过的最好的游戏。”
37 年过去了,Emanuele Bolognesi 才意识到这个程序实际上是 Leedom 的《超级星际迷航》的改编版。他立即决定尝试原版的《超级星际迷航》。他在 Vintage BASIC 网站下载了 BASIC 解释器、游戏的源代码然后开始运行它。

重写代码,还原经典

对这款经典游戏重燃兴趣后,Emanuele Bolognesi 开始搜索这些年来是否有人用更易读的格式重写了这个游戏。但 1978 年的代码看起来很神秘,几乎没有注释来解释它的算法。

Emanuele Bolognesi 在互联网上找到了很多游戏端口,但没有一个是 1978 年的《超级星际迷航》。这些新版本采用了隐形装置、超新星、死亡射线等特色。但这些都不是最原始的版本,所以 Emanuele Bolognesi 自己重写它的代码。

最初,他选择用 Perl 来编写,因为它是一种可以在任何 Mac 或 Linux 上运行的脚本语言,并且因为Perl具有 goto 语句。Emanuele Bolognesi 认为,至少在最初,不使用任何 goto 就移植所有原始的 BASIC 代码是不可能的。

但是,即使是简单的翻译也比他预期的要难,移植 500 行 BASIC 代码(尽可能打包)以节省内存,这意味着每行包含用分号分隔的几条指令,并且没有任何空间。例如:

image.png

Emanuele Bolognesi 耐心地重写了每一行,尝试避免任何错误,因为如果错过一点就可能改变一切。他一开始采用了 1:1 翻译,但是很快意识到了这可能导致无法阅读。所以他开始将一些 if-then-goto 转换成 if-then-else 块。

从上面的代码中,可以在第 3170 行看到“THEN3500”,它会停止从行首开始的“ for”循环(对于那些没有在 BASIC 中编程的循环,您可以输入
IF THEN <line-number> 而不是IF-THEN GOTO <line-number> 因此,Emanuele Bolognesi 在他的代码中把它变成了 ("last" in Perl).

Emanuele Bolognesi 很快意识到有些 gotos 跳到了一些意想不到的地方,比如函数的中间部分,或者某个块的中间部分。

耐心地识别和分离所有代码块是这项工作中最困难的部分,但它对于理解游戏机制非常有用。只要是 Emanuele Bolognesi 熟悉的代码,他还会给变量起一些有意义的名字,比如“ EnergyLevel”而不是“ e”或“ TotalKlingonShips”而不是“ K3”。

在 Perl 版本之后,Emanuele Bolognesi 决定将游戏移植到 LUA。为了做到这一点他基本上从头开始检查所有的代码。重写了大部分循环。他说:“我不得不承认现在的代码好多了,而且我对所有的部分都非常了解。”在编写的时候, Emanuele Bolognesi 还给很多想要理解这个程序的人留下了很多评论。

image.png

显然,这项工作是永远不会完成的,代码还可以得到更多改进。但是现在,它完全可以运行了,游戏的外观和行为都与原始游戏完全相同。

对喜欢复古游戏的爱好者来说,重温经典比增加更多体验更有意义,因为有很多更新的版本已经做到了这些。保留原有的东西,通过这种简单的方式重现经典也别有一番滋味。

原文链接:https://hackernoon.com/rewrit...
GitHub 地址:https://github.com/emabolo?re...

segmentfault 公众号

阅读 894

推荐阅读

第一时间为开发者提供行业相关的实时热点资讯

27965 人关注
2233 篇文章
专栏主页