2013-10-21 80 views
2

我對python很陌生,我試圖在python中創建基本的文本冒險。基本上,它的工作方式是有一個聲明,然後有兩個或三個選擇,每個選擇導致不同的東西。我的問題是這樣的:我怎樣才能將兩個陳述聯繫在一起,以便它們在不同的層次上產生相同的結果?我想要做的就是這樣的事情(這是什麼,我都只是一個簡化版本):非常基本的Python文本冒險

>>> 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. 

在這裏,我想選擇2,如果給定輸入A,引領回到同一個地方選擇1,如果給定輸入B,將導致(選擇3)。

+0

什麼是實際版本你有什麼,以及在解決這個問題時遇到了什麼具體問題? – admdrew

+0

+1,因爲它包含代碼,顯示合理的努力,並且任何人都可以理解被問到的問題。是的,那是我現在的酒吧。那麼,我覺得有必要打擊無法解釋的匿名下調。 – kojiro

+0

如果您希望在多個區域執行相同的邏輯,請將此邏輯移入其自己的功能,並在適當時調用它。 – tom

回答

2

正如@dave mankoff所說,你應該使用「狀態機」。這裏有更多的細節。

對於一個基本的狀態機,你需要一個「狀態變量」,一個跟蹤當前狀態的變量。然後,當用戶做出選擇時,狀態變量會被更新以反映新的狀態。

你可以調用狀態變量任何東西,但我建議調用它state。這是傳統的,非常簡單。

只要您可以將唯一值映射到您想要的狀態,您就可以使用任何一組唯一值來跟蹤狀態。在大多數語言中,您會使用枚舉常量「enum」,但Python歷史上沒有枚舉。 (它們是從Python 3.4開始添加的,目前在alpha版本中。)

一種簡單的方法是對狀態使用字符串,並讓字符串描述狀態。因此,對於你的遊戲,大部分州將是玩家可以去的地方:"library""kitchen",​​或其他。但是你也可能有一些不嚴格映射到單個地方的狀態,例如:"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

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

'def start(choice1 = None)'如果choice1是None:input(...)'?否則它只是不斷問。 – kojiro

+0

這只是想法:) – JoeC

+0

在這裏,小心可能無限循環。如果玩家決定連續飲用一千個解毒劑,程序將會崩潰,並且會出現'RuntimeError:超過最大遞歸深度' – Kevin

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指出我的代碼中顯然愚蠢的錯誤!

+2

+1我寫了很多相同的東西。我想知道在OP開始發明物體之前多久。 – kojiro

+0

我給你+1狀態機,但你真的沒有顯示如何寫一個。你沒有一個狀態變量;你的'while'循環總是通過狀態''A'傳遞給'play()'函數。 – steveha

+0

@steveha Doh!你是對的。這就是我在自動駕駛編程中獲得的。固定。 –