2017-02-09 52 views
-1

'''我需要爲python中的遊戲編寫2階段進程。第一階段導致第二階段,然後遊戲重置並再次詢問玩家是否想要再次移動到第一階段。我在這個例子中遇到了一個無限循環,並且在我的實際程序中它最終會停止,但我無法弄清楚爲什麼。有沒有什麼辦法可以將它設置到elif子句不評估第一次迭代的地方,但是隻有在第二次迭代時評估纔會重置程序?或者更好的辦法,也許在pygame的?「」」Python:如何在while循環中設置2階段進程

import sys 
phase_one = 1 

game_state = input("Move Forward? -- Yes or No: ") 

while game_state == "Yes": 

    if phase_one == 1: 
     phase_one = 0 

    elif phase_one == 0: 
     print("Yikes!") 
     phase_one = 1 

else: 

    if game_state == "No": 

     game_state = 0 
     print("Exit!") 
     sys.exit(0) 
+0

應該編輯這篇文章,並使用代碼{}項目格式化你的代碼,使它可讀。 game_state應該是一個整數還是一個字符串?你似乎將它用作兩者。無盡的循環是有道理的。一旦進入循環,沒有任何東西會打破循環。那個'else:'線應該和'if'和'elif'處於同一縮進水平嗎?看起來它與'while'相同,這很奇怪。 –

+0

我假設你的問題是你沒有'phase_one'在每次迭代0和1之間切換。如果是這樣,那麼只需添加另一個標誌以便切換。 –

+0

查看[iminurnamez簡單狀態機示例](https://www.reddit.com/r/pygame/comments/3kghhj/simple_state_machine_example/)。 – skrx

回答

1

你的代碼只詢問是否繼續前進一次,在開始的時候。然後,如果它是第一階段,則轉到第二階段,如果它是第二階段轉到第一階段,並且如果它不是(不可能),它會嘗試檢查它是否應該退出(但從未實際詢問用戶,所以它永遠不會發生)。

我想你想寫的東西是這樣的:

phase_one = 1 
game_state = "Yes" 
while game_state == "Yes": 
    if phase_one == 1: 
     print("First phase!") 
     phase_one = 0 
    elif phase_one == 0: 
     print("Second phase!") 
     phase_one = 1 
     game_state = input("Move Forward? -- Yes or No: ") 

這是書面的方式讓我覺得狀態機:現在我們有

phase 1 => phase 2 
phase 2 => phase 1 

您可以輕鬆地擴展它與更多elif分支,有任何階段相互轉換。我假設你的最終目標是擁有一個靈活的系統。如果沒有,你的目標其實只是有一個階段和第二階段,那麼這就是過於複雜的:你需要的是

while True: 
    print("First phase!") 
    print("Second phase!") 
    if input("Move Forward? -- Yes or No: ") != "Yes": 
     break 
+0

非常感謝!你有沒有免費的在線資源來了解更多關於python遊戲編程中狀態機的信息? – Adam

+0

@亞當:這個人回答了你的問題。您可以通過單擊「接受」按鈕(在上/下行按鈕下方)來表示「謝謝」。這也會阻止其他人來到這裏,認爲你的問題還沒有得到回答。 – Douglas