2014-01-07 53 views
0

我正在構建一個遊戲作爲學習代碼教程的一部分。雖然循環似乎沒有正確檢查條件

以下類有一個while循環,它應該返回'finished',或者離開循環並返回'death'(這些是運行遊戲的字典條目),但似乎並不運行。我正在看while循環後def guess:

該循環的目的是要求用戶猜測1和3之間的數字。如果他們猜錯了三次以上,他們會「返回」和「死亡」,否則「結束」。

但是,當我玩遊戲時,我甚至沒有提示輸入數字,而是「太多失敗的猜測,你輸了!」打印,即使猜測是0

class Smaug(Scene): 

    def enter(self): 
     print "Smaug is a terrifying huge fire breathing dragon, but you must get the Arkenstone from him for Thorin"  
     print "In Smaug's cave, the Lonely Mountain, Smaug notices your presence and challenges you to a game" 
     print "He says \"Guess a number between 1 and 3\"" 
     smaugNum = random.randint(1, 3) 
     print "Smaugs number cheat:", smaugNum 
     guesses = 0 

     def guess(): 

      while guesses < 4: 
       print "Guess a number between 1 and 3" 
       numb = raw_input("> ") 

       if numb == smaugNum: 
        print "Well done! You win." 
        Player.BilbosStuff.append('arkenstone') 
        print "Now Bilbo has", Player.BilbosStuff 
        return 'finished' 

       else: 
        print "You lose!" 
        guesses += 1 
        guess() 

     print "Too many failed guesses, you lose!" 
     return 'death' 

看代碼塊的嵌套,難道是當「完成」 while循環返回,它也會自動獲得返回的一部分更廣泛的課堂?換句話說,如果麻木== smaugNum,那麼我需要Smaug類來完成。

+1

你永遠不調用該函數 – M4rtini

+1

'guess'不會被調用在此代碼... – darthbith

+0

這是縮進了吧? –

回答

3

問題是,您根本沒有撥打guess()函數..您有guess()作爲函數,它根本不被調用。所以,控件直接跳轉到函數後面的下一行。最好的辦法是刪除功能,並使用這樣的代碼:

guesses = 0 
while guesses < 4: 
    print "Guess a number between 1 and 3" 
    numb = raw_input("> ") 
    if numb == smaugNum: 
     print "Well done! You win." 
     Player.BilbosStuff.append('arkenstone') 
     print "Now Bilbo has", Player.BilbosStuff 
     return 'finished' 
    else: 
     print "You lose!" 
     guesses += 1 

print "Too many failed guesses, you lose!" 
return 'death' 
+0

謝謝,它現在正在工作。很快接受。我不知道爲什麼我選擇將while循環放入函數中:/ –

+1

@DougFirr:只在必要時才使用函數。不必要的功能增加了時間和空間。 –

+0

我相信你!我還是新手。什麼時候使用函數有一個經驗法則?我會谷歌它。再次感謝 –

1

這裏的問題是,你是無限遞歸下降的猜測功能,永不調用猜()擺在首位。

增加猜測計數器後,由於猜測次數少於4次,您不需要再次調用guess(),因爲執行仍將位於while循環中,只需信任while循環進行比較。避免手動調用guess()。

2

您正在定義guess smack輕拍在enter的中間,但您永遠不會調用它。

塊像

class Smaug: 
    def enter: 
     #here's what to do when enter() is called 
     def guess: 
      #here's what to do when guess() is called 
     #here's some more stuff to do when enter() is called 
+1

並且調用它也不起作用,因爲'guesses + = 1'會觸發'UnboundLocalError'。 –