Python写文本冒险游戏的要点

2019年伊始,游戏开发者Andrew Gillett在《Wireframe》杂志上介绍了如何用Python开发文本冒险游戏,以及在此过程中应该避免哪些陷阱。

最后他还给了一段示例代码,让人看完之后忍不住跃跃欲试。

文本游戏的形态

用BASIC语言编写游戏的经历

Andrew Gillett 写的第一款游戏叫做“Pooh”。

1982年9月,他4岁,ZX Spectrum 家用电脑刚刚发布,可以接到电视上玩游戏,这已经够不可思议的了,但它还内置了一种叫做 BASIC 的语言,以及一本讲解如何编程的手册。于是这便开启了他的创作生涯。

这个 BASIC 写成的游戏非常简单,玩家的任务是带一个婴儿去上厕所,没有障碍,也没有敌人,如果你试图走出屏幕(边界),该游戏进程将停止并弹出一条错误消息。婴儿和厕所都是用文本符号表示的。Andrew Gillett 当时不知道如何创建一个比 Pooh 更复杂的图形游戏。他甚至不知道如何在屏幕上显示有图形的角色。

文本冒险游戏

于是,Andrew Gillett 开始专注于编写文本冒险,即游戏用文字向玩家描述场景。

比如“你在一个舒适的隧道般的大厅中,你可以看到一扇门。”(这里在用1982年的《霍比特人》举例)

1982年的游戏《霍比特人》

玩家输入诸如“穿过门”或“用剑杀死妖精”等命令来推进游戏。

“虽然这款游戏相对来说比较容易编写,但我却以最糟糕的方式实现了它。这个游戏的代码本质上是一个巨大的IF语句列表。每个房间都有自己专门的一组代码,它们会打印出房间的描述,然后检查玩家输入了什么。这种‘硬编码’导致代码比实际需要的长得多,并且难于维护。” Andrew Gillett 说道。

正确的方法应该是将代码和数据分开。

每个房间有几组与之相关的数据,比如一个ID号码,空间的描述(你是在一个小山洞),一组可以在空间中找到的对象,以及一组空间的号码,这些号码表明如果玩家试图朝某个特定方向移动,他们将会到达哪里。

例如,如果玩家进入“北面” ,第一个号码可以显示玩家去具体哪个地方了。然后主程序会跟踪玩家当前所在的空间,并查找该空间对应的数据。有了这些数据,主程序就可以根据玩家输入的命令采取适当的行动。

来练个手

下面链接中的代码展示了如何在 Python 中实现文本冒险(入门)。

https://github.com/IoToutpost/Python_game

(注:以下内容基于上述链接的“text-adventure_original.py”)

用来演示的 Demo 中没使用数字 ID 和数组,而是使用了字符串 ID和字典数据结构。其中每一段数据都与一个ID或“键”相关联。

这是一个在 Spectrum BASIC 中没有提供的方便选项。

我们首先创建一个玩家可能移动的方向列表。然后创建指定每个位置的属性类 Location。我们存储名称、描述和字典数据结构,该结构存储当前位置,并链接到的其他位置。例如,如果你从树林向北走,你就会到达湖边。

该类包含一个名为 addLink 的方法,该方法在检查指定的方向和目的地存在后将条目添加到链接位置字典中。 

在类定义之后,我们创建一个名为 locations 的字典。它有两个条目,键是 woods 和 lake,值是 Location 类的实例。

接下来,我们在刚刚创建的每个位置上调用 addLink 方法,这样玩家就可以在它们之间行走。设置阶段的最后一步是创建变量 currentLocation,指定玩家从哪里开始游戏。

然后我们到达主游戏循环,它将无限重复。我们首先显示当前位置的描述,以及玩家移动的可用方向。然后我们等待玩家输入命令。

在这个版本的代码中,唯一有效的命令是方向。例如,在开始的位置键入“north”就可以来到湖边。当输入一个方向时,我们检查以确保它是当前位置的有效方向,然后将 currentLocation 更新到新位置。当主循环重新开始时,将显示新位置的描述。

写在最后

由于 Andrew Gillett 的原始版本比较抽象,为了帮助大家理解,IoT前哨站的 Medivh 和 Winter 在这个基础上写了中文版的 《回村》,大家可以拿回去自行拓展。

《回村》0.1版本

两个版本都放在 Github 上了,欢迎提建议。如果 Fork 了更有意思的版本,记得通知我们。

原文:Building a text adventure

来自:Wireframe 第6期

编译:王文文

转载请注明出处。