Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
非常基本的Python文本冒险_Python_Python 3.x - Fatal编程技术网

非常基本的Python文本冒险

非常基本的Python文本冒险,python,python-3.x,Python,Python 3.x,我对python非常陌生,我正在尝试用python创建一个基本的文本冒险。基本上,它的工作方式是有一个陈述,然后有2到3个选择,每个选择都会导致不同的结果。我的问题是:当两个语句位于不同的层中时,如何将它们链接在一起,从而导致相同的结果?我想做的是这样的事情(这只是我所拥有的东西的简化版本): 在这里,我想让choice2,如果给定输入A,引导回同一个地方choice1,如果给定输入B,将引导(choice3)。您可以执行以下操作 def start(): choice1 = input

我对python非常陌生,我正在尝试用python创建一个基本的文本冒险。基本上,它的工作方式是有一个陈述,然后有2到3个选择,每个选择都会导致不同的结果。我的问题是:当两个语句位于不同的层中时,如何将它们链接在一起,从而导致相同的结果?我想做的是这样的事情(这只是我所拥有的东西的简化版本):


在这里,我想让choice2,如果给定输入A,引导回同一个地方choice1,如果给定输入B,将引导(choice3)。

您可以执行以下操作

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()

你要找的是所谓的“状态机”(更确切地说是有限状态机)。您有一个处于
a
状态的玩家。然后给他们一些选择,可以将他们移动到状态
B
C
。从
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)
这个例子非常简单——你可能需要错误检查和其他各种各样的提示——但它应该能告诉你它的要点

另一方面,在开始编码状态机之前,它可能有助于提取状态机。我至少会画一小块。通过快速图像搜索,您可以看到简单状态机的示例:


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

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

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

您可以调用state变量,但我建议调用它
state
。这很传统,也很简单

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

一种简单的方法是使用字符串表示状态,并让字符串描述状态。因此,对于您的游戏,大多数州都是玩家可以去的地方:
“图书馆”
“厨房”
“药水储藏室”
或其他任何地方。但是你也可能有一些州没有严格地映射到单个地方,比如:
“四处游荡”
(喝错药水后发呆?)

您也可以使用整数,类似这样:

LIBRARY, KITCHEN, POTION_STORAGE_ROOM, WANDERING_AROUND = range(4)
现在
LIBRARY
设置为整数0,
KITCHEN
设置为整数1,依此类推。我认为字符串可能更容易,但是如果您搜索状态机的示例,您可能会看到上面的技巧用于状态机的整数状态

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


您可以使用函数

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

您拥有的实际版本是什么?在排除故障时遇到了什么具体问题?如果您希望在多个区域中执行相同的逻辑,请将此逻辑移到其自身的函数中,并在适当时调用它。+1因为它包含代码,显示了合理的努力,任何人都能理解被问到的问题。是的,那是我的酒吧。好吧,我觉得有必要打击无法解释的匿名向下投票。def start(choice1=None)如何:如果choice1为None:input(…)?否则它就会一直问。这就是想法:)注意潜在的无限循环,这里。如果玩家决定连续喝上千种解毒剂,程序将崩溃,出现
运行时错误:最大递归深度超过了
+1我几乎在写同样的东西。我想知道OP开始发明对象需要多长时间。我给你状态机+1,但你并没有真正展示如何编写一个。您没有状态变量;您的
while
循环总是以
'A'
状态传递给
play()
函数。@steveha Doh!你说得对。这就是我在auto pilot上编程得到的结果。固定的。
if choice2 == 'A':
    function()
If choice1 == 'B':
    function()