赶鸭子上架的游戏与勉强跑起来的代码

编者按:不久前,《骰子地下城》的作者特里·卡瓦纳特里为了庆祝自己早年制作的一款游戏:《弹弹跳跳闪避人(VVVVVV)》的十周年纪念日而开源了这款游戏的代码。外行人的角度看来,这意味着普通玩家也有机会得以一睹游戏是如何创作出来的,因为游戏的每一行代码都如今都可以供人审阅。

翻译:柳生非情剑编辑:酸菜鱼

本文基于篝火营地与 Polygon 中华地区独家授权协议,转载请征得同意。

开源游戏代码的事情不常发生,随着开源,人们能接触到既有价值的信息,也可以通过这些资源从中学习,甚至还有人会对代码进行优化。不过在一些人眼中,《弹弹跳跳闪避人》的源代码有些可怕,批评者们认为游戏的代码本可以写得更好。特里似乎早就知道大家会有这样的反应。他在宣布开源代码的博客中写道:「在技术层面上看,《弹弹跳跳闪避人》算不上是一款制作精良的游戏。甚至在那些半路出家的独立开发者的眼中,这款游戏看起来都写得一团糟。」

对于代码,人们总是误以为这种东西天生就是优雅且精致的。毕竟,代码是逻辑的体现,这方面的知识会催生一门叫「计算机科学」的学科,难道不正是因为如此吗?但现实的情况往往比我们想象的要复杂得多,在游戏的实际开发过程中,由于涉及到策划、音效等多个不同的模块,往往要等到开发阶段大后期开发者才有机会对游戏整体进行审视。

通常看到这种代码被勉强的杂糅在一起,总体规划很蠢、完全没法优化且靠着一个接一个的权宜之计才跑通的游戏时我们会用一个词来形容,叫「赶鸭子上架」

游戏开发者詹姆斯·帕顿在推特上谈到游戏代码时,如此写道:「基本上我参与开发过的每款游戏在最后阶段都是这么硬凑出来的,然后我们就只能祈祷这个随时会崩溃的拼凑品能勉勉强强粘合在一起。」

基本上我问过的每一个游戏开发者都说过类似的话。

游戏开发者詹姆斯·辛普森在往来的邮件中写道:「游戏不像寻常的软件,必须要多个不同的模块成功协同运作才能让这个复杂的大项目跑起来,而很多时候因为时间有限,开发者必须要牺牲个人时间来换取成果。我知道很多开发者会使出浑身解数来写出完美的代码,但通过一些开源项目,我们能看到其实就算代码不够完美,你依然能让项目跑起来。」

开源后的《弹弹跳跳闪避人》由于其无比混乱的代码而引起了大量的讨论。在游戏中,玩家此刻是该看过场动画、还是该进行对话?一般来说,此刻的游戏代码中会对这些情况做出判断。通常这些功能性代码会被分开写在不同的地方,例如来实现跳跃功能的代码会与实现小游戏功能的代码分开放置。但在《弹弹跳跳闪避人》中却不是这样的,特里把十几个决定游戏状态的代码全部写到了一起,这块地方既有让游戏进入过场动画的代码,同时也夹杂着设定游戏模式以及游戏主菜单的代码。

推文:游戏《弹弹跳跳闪避人》今天开源了,然后有人发现里面一个方法写了几百个判断语句......绝了

曾经开发过《口袋桌球》以及《超糟糕国际象棋》等游戏的扎克·盖奇,对于特里的代码向 Polygon 说道:「这说明了一件事:特里在刚开始制作这款游戏时不知道会遇到哪些情况,他没去想这款游戏里会有多少过场动画,没考虑主菜单应该以何种型式运作,更没想到随着开发的进行他会遇到很多奇怪的状况。」

如果当时的特里想要提高代码质量的话,他或许该先停下工作,对代码进行重构以便让整个项目的代码更加整洁,合理。但他并没有这样,相反,他选择继续进行下去,先把代码跑起来再说,结果就写出了一个巨大的代码块,一个块里处理了成百上千的东西。

「特里没有停下来重构代码,他的做法就是『管他的,要是遇到什么情况我就在这个巨长无比的语句中再加一条好了。』这种情况很常见,在游戏将要发布时采取这种权宜之计很有必要。」

盖奇对这种情况见怪不怪,他告诉 Polygon,在他制作的热门游戏《荒诞钓鱼》中,因为写得太烂,他都完全不知道这些代码是怎么跑起来的。团队中的其它成员也都不是很明白。

但结果呢?《荒诞钓鱼》仍然大受好评,在短短几个月内赚了近百万美元。显然,开发者们的重心应该放在那些会破坏游戏的 bug 和那些会影响玩家游戏体验的东西上,用他们的话来说就是:完美主义有害无益。

盖奇说道:「开发过程中总是会遇到意料之外的状况,而停下脚步去重构代码则意味着这段时间内无法制作任何新东西。」

所以尽管《弹弹跳跳闪避人》的开源在社交媒体上引发了轩然大波,但特里也只是一笑而过,抱着一种幽默的心态看待此事。

特里的推文:那些吐槽《VVVVVV》源码的推只会让我变得更强大

他在开源代码的博客中写道:「我能说啥呢?那时的我很年轻,比起尽善尽美游戏代码,我对看得见玩得到的东西更感兴趣。或许《弹弹跳跳闪避人》开源最棒的一点就在于这个项目让我们知道:即便你不是专业的程序员,仍然可以搞出些东西。」

End