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