2

我对 python 很陌生,我正在尝试在 python 中创建一个基本的文本冒险。基本上,它的工作方式是有一个陈述,然后是 2 或 3 个选择,每一个都会导致不同的东西。我的问题是:当它们位于不同的层时,我如何将 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

4 回答 4

9

您正在寻找的是所谓的“状态机”(更具体地说,是有限状态机)。你有一个处于状态的球员A。然后给他们一些选择,可以将他们移动到 stateBC. 从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 在我的代码中指出了一个明显愚蠢的错误!

于 2013-10-21T19:24:37.140 回答
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,依此类推。我认为字符串可能更容易,但是如果您搜索状态机的示例,您可能会看到上述技巧用于状态机的整数状态。

您可能想学习这本书/网站Learn Python the Hard Way。练习 43 展示了一个简单的文字游戏。它使用带有字符串的状态机来表示状态。有一个简单游戏的示例代码,您可以运行代码并玩游戏,看看它是如何工作的。(它看起来不是一个很好玩的游戏,但我想那本书的作者是想鼓励你做一个更好的!)

http://learnpythonthehardway.org/

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

于 2013-10-21T19:54:13.927 回答
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()
于 2013-10-21T19:18:57.653 回答
0

你可以使用函数

if choice2 == 'A':
    function()
If choice1 == 'B':
    function()
于 2018-04-08T14:23:55.777 回答