非常基本的Python文本冒险

时间:2013-10-21 19:05:08

标签: python python-3.x

我是python的新手,我正在尝试在python中创建一个基本的文本冒险。基本上,它的工作方式是有一个声明,然后是两个或三个选择,每个选择导致不同的东西。我的问题是:如何将2个语句链接在一起,以便当它们位于不同的层时它们会产生相同的结果?我想做的是这样的事情(这只是我所拥有的简化版本):

>>> choice1 = input("Will you drink the potion?")
>>> if choice1 == "A":
>>>     choice2 = input("You drink it, and when you do,  you start to see strange visions.  But, to your right, you see another bottle marked 'antidote'\nDrink it?")
>>>         if choice2 == "B":
>>>             print("You die")
>>>         elif choice2 == "A":
>>> elif choice1 == "B":
>>>     #etc, etc.

在这里,我想要choice2,如果给出输入A,则返回同一位置choice1,如果给定输入B,将导致(choice3)。

4 个答案:

答案 0 :(得分:8)

您正在寻找的是所谓的“状态机”(更具体地说是有限状态机)。你有一个状态为A的玩家。然后,他们会获得许多选项,可以将其移至州BC。从B开始,他们会有更多选择,可以将他们带到其他州 - 例如,状态C

实现状态机的方法有很多种。例如,您可以简单地使用字典,其中键是状态,值是选择列表和结果状态:

{'A': {'prompt': 'Will you drink the potion?',
       'choices': ['B', 'C']}
 'B': {'prompt': 'You drink it and when you do, ...',
       'choices': ['C']}
 'C': {'prompt': 'You die'}}

这显然可以变得更加复杂,使用这样的词典不能很好地扩展到更复杂的选择集,但它应该给你一个想法。你可以像这样构建一个完整的游戏世界,然后简单地编写一个函数来解释它:

world = {...}
def play(state):
  print world[state]['prompt']
  if 'choices' in world[state]:
    # print the users choices
    return input('So which do you choose?')
  return None

state = 'A'
while state is not None:
  state = play(state)

这个例子非常原始 - 你需要错误检查和各种其他的花里胡哨 - 但它应该给你它的要点。

另外,在开始编码之前,可能有助于绘制状态机。我至少会画一小部分。您可以通过快速图像搜索来查看简单状态机的示例:https://www.google.com/search?q=state+machine&source=lnms&tbm=isch

编辑:感谢@steveha在我的代码中指出一个明显愚蠢的错误!

答案 1 :(得分:2)

正如@dave mankoff建议的那样,你应该使用“状态机”。这里有更多细节。

对于基本状态机,您需要一个“状态变量”,一个跟踪当前状态的变量。然后,当用户做出选择时,状态变量会更新以反映新状态。

您可以调用状态变量,但我建议将其称为state。这是传统的,非常简单。

只要您可以将唯一值映射到所需的状态,就可以使用任何一组唯一值来跟踪状态。在大多数语言中,您将使用“枚举”,枚举常量,但Python历史上没有枚举。 (它们是从Python 3.4开始添加的,目前处于alpha版本中。)

一种简单的方法是使用字符串表示状态,并让字符串描述状态。因此,对于您的游戏,大多数状态将是玩家可以去的地方:"library""kitchen""potion_storage_room"或其他。但是你也可能有没有严格映射到单个地方的州,例如:"wandering_around"(喝了错误的药水后发呆?)。

你也可以使用这样的整数:

LIBRARY, KITCHEN, POTION_STORAGE_ROOM, WANDERING_AROUND = range(4)

现在LIBRARY设置为整数0,KITCHEN设置为整数1,依此类推。我认为字符串可能更容易,但是如果你搜索状态机的例子,你可能会看到上面的技巧被用于状态机的整数状态。

您可能想要学习本书/网站以艰难的方式学习Python 。练习43显示了简单的文本游戏。它使用带有字符串的状态机来表示状态。有一个简单游戏的示例代码,您可以运行代码并玩游戏,看看它是如何工作的。 (它看起来不是一个非常有趣的游戏,但我认为该书的作者希望鼓励你做一个更好的游戏!)

http://learnpythonthehardway.org/

http://learnpythonthehardway.org/book/ex43.html

答案 2 :(得分:0)

您可以执行类似

的操作
def start():
    choice1 = input("Will you drink the potion?")
    if choice1 == "A":
        choice2 = input("You drink it, and when you do,  you start to see strange visions.  But, to your right, you see another bottle marked 'antidote'\nDrink it?")
        if choice2 == "B":
            print("You die")
        elif choice2 == "A"
            start()
start()

答案 3 :(得分:0)

您可以使用功能

if choice2 == 'A':
    function()
If choice1 == 'B':
    function()