Python文本游戏之根据提示猜词

之前IoT前哨站上发布了“Python写文本冒险游戏的要点”和“在文本冒险游戏中加入道具”,讲的都是冒险类游戏。

那猜谜类型的文本游戏大家知道怎么做吗?

比如经常被用来练习的猜数字:

这确实是一个经典的入门。不过我们这次要加点难度。让大家来猜词语。

要求:

每次随机给出一部分残缺的字符,让大家回忆并输入完整的词语。

答对输出正确,答错提示错误,并告知正确答案。

思路:

1、创建一个小的词库,这里我们将一部分词语放入数组,命名为:questions。

import random

questions = [“As you like it”, “The Tempest”, “Measure for Measure”, “Much Ado About Nothing”, “The Comedy of Errors”, “King Lear”, “Cymbeline”, “Hamlet”, “Coriolanus”, “Othello”, “Love’s Labour’s Lost”, “King John”, “Julius Caesar”, “Edward III”]

2、随机选择一个短语,并将其转换为大写。

chosen_phrase = random.choice(questions)
chosen_phrase = chosen_phrase.upper()

3、去掉元音、空格和单引号。把删选后的字符拼接起来,赋值给变量puzzle。

vowels = [“A”, “E”, “I”, “O”, “U”, ” “, “‘”]
puzzle = “”
for letter in chosen_phrase:
if not letter in vowels:
puzzle += letter

4、随机插入空格

puzzle_with_spaces = “”

while len(puzzle) > 0:
group_length = random.randint(1,5)
puzzle_with_spaces += puzzle[:group_length] + ” “
puzzle = puzzle[group_length:]

5、最后加入答案检测,如果输入和答案一致,就告知“That’s correct!”,如果答案错误,提示:No,并给出正确答案。

guess = input(“What is your guess? “)
guess = guess.upper()

if guess == chosen_phrase:
print(“That’s correct!”)
else:
print(“No. The answer is “, chosen_phrase)

好了,一个根据提示信息猜短语的文本游戏就写完了。

完整代码可访问:

https://github.com/IoToutpost/Python_game/tree/master/Puzzles

在把这个游戏给别人玩的时候,记得先让玩家看一看你的词库。不然就是瞎猜了。

有能力的朋友可以试着扩展一下,说不定你可以把它改成一个英语学习程序。

注:文中猜词代码来自MagPi 82《Code a quiz game with Python》。

在文本冒险游戏中加入道具

上次发了一篇“Python写文本冒险游戏的要点”之后,有的朋友说形式太简单了,能不能在游戏中加入道具?

既然如此,我们这次就来给它升一级。

很多人都玩过“刺激战场”类的游戏,进一个房子就拼命捡枪捡子弹什么的。这些都是游戏人物的重要道具。

下面我们就继续以《回村》为例子,在其中加入道具拾取和过关判定。

先把游戏环境概念图画出来。

1、森林里有牛肉

2、小山里有红酒

3、湖泊边有强盗

获胜判定:

带着牛肉和红酒,避开强盗,回到村庄即获胜。否则游戏继续。

好了,现在就在代码中更新道具和强盗。

代码地址:

https://github.com/IoToutpost/Python_game

Gohome.py是之前的版本,Gohome_v0.2.py是我们加了道具的版本。

需要注意的是,我们现在用字典来存储地点、方向和道具了。这样对于数据读写来说会更方便。

Python中的字典是啥?

字典是Python中唯一内建的映射类型。字典中的值并没有特殊的顺序,但是都存储在一个特定的键(Key)里。键可以是数字、字符串甚至是元组。

字典由多个键及与其对应的值构成的对组成。每个键和它的值之间用冒号(:)隔开,项之间用逗号(,)隔开,而整个字典由一对大括号括起来。字典中的键是唯一的,而值并不唯一。

好了,跑一下试试。

到此,一个简单的RPG游戏算是做好了。

如果想让游戏更好玩,要加的东西还很多。比如战斗元素,生命值,时间……探索无止境。

注:这个系列的文章是写给新手的,高手就不用看了哈。当然,欢迎指导,欢迎分享更有意思的版本。

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期

编译:王文文

转载请注明出处。