2017-08-28 77 views
0

(我仍然是新的論壇發佈,道歉,如果這是佈局/措辭不佳)鏈接到一個條件if語句不會正確輸出的語句(輸入),否則語句回調形成一個無限遞歸循環

請你能幫我解決這個問題。我的問題是,我試圖讓用戶輸入一個對骰子有效的整數,例如6,12,20等(我只爲它設置了D6和D20的當前值),用於我的骰子滾動應用程序我的目標是像一個獨立的版本上的是什麼Roll20.net用來工作,

我有兩個問題:

1)當用戶選擇一個有效的管芯,例如6或20,而不是滾動說它死了,它只是返回數字6或20,或者你輸入的任何數字過去的第一個其他失敗,例如12,76,9709487。反而它應該發佈1或2與各自的打印聲明,因爲我有randint設置爲(1,2)測試打印語句。

2.)嘗試回調pick_dice函數的另一次嘗試導致程序落入遞歸循環,並試圖使用break語句也導致我有一個錯誤。如果嘗試將字符串作爲輸入,則會引發ValueError,而不僅僅是else語句。我發現這非常令人困惑,我甚至不確定我是否正在使用正確的條件(我發現python文檔非常混亂,我找不到任何有助於解決問題的東西)。

我的代碼:

import random 
from random import randint 

d20 = randint(1,2) #for test purposes rather than (1,20) 
d6 = randint(1,2) 

str1 = "You rolled a " 
str2 = "Uh Oh, Critical Fail" 
str3 = "Congrats Critical Hit" 

#num = d20 
#To select a die - More will be added later e.g. d10, d12, d100 
num = int(input("Please pick a valid die: 6 or 20: ")) 


def roll(d20): 
    print(str1, d20) 

    if d20 == 1: 
     print(str2)  
    elif d20 == 2: 
     print(str3) 

#roll(d20) 

def roll(d6): 
    print(str1, d6) 

    if d6 == 1: 
     print(str2)  
    elif d6 == 2: 
     print(str3) 

#roll (d6) 


def dice(): 
    if num == d20: 
     roll(d20) 
    elif num == d6: 
     roll(d6) 

dice() 


def pick_dice(): 
    print (num) 
    if num is 6 or num is 20: 
     dice() 
    #elif num != 6 or num != 20: 
    else: 
     print ("Please input a valid die") 
     #I would put a break statement here but it causes an error 
pick_dice() 

我是不是應該放棄對用戶的輸入,並嘗試建立一個GUI的地方,我只是使用ComboBox內的Tkinter爲骰子的選擇,和按鈕來調用函數?因爲我的目標是在某個時候爲這個程序構建一個GUI。我真的很難理解這些基礎知識。

我希望有人能夠幫助我或指出我朝着正確的方向,謝謝。

+0

我不確定這是* only *問題,但是您不應該爲身份('is')比較器混淆相等('==')。反而做'if num == 6 or num == 20' –

+0

我想我可能會想到一個,我原本有==,謝謝 – Tedwyn

回答

0

您的精確要求,我不清楚,但嘗試:

from random import randint 

def dice(num): 
    d = randint(1, num) 
    if d == 1: 
     print("Uh Oh, Critical Fail") 
    elif d == num: 
     print("Congrats Critical Hit") 
    else: 
     print("You rolled a", d) 

def pick_dice(): 
    while True: 
     num = int(input("Please pick a valid die: 6 or 20: ")) 
     if num in (6, 20): 
      dice(num) 
      break 
     else: 
      print ("Please input a valid die") 

pick_dice() 

注:

  1. from random import randint爲您提供randint。您不需要也運行import random

  2. 在原始代碼中,行num = int(input("Please pick a valid die: 6 or 20: "))在運行開始時評估一次。聲明print (num)打印num但不會導致代碼再次要求輸入。

    同樣,d6 = randint(1,2)只評估一次。每次需要擲骰子時,您可能需要再次撥打randint

  3. 由於Adam Smith指出,​​返回真僅當num6存儲在內存中的相同位置。你想檢查平等,而不是:num == 6。另外,如果你想檢查num是6還是20,那麼可以簡單地使用num in (6, 20)

+0

謝謝你的迴應, 1)謝謝指出冗餘線路。 2.)我以爲有骰子()引用num和randint,然後由pick_dice()調用意味着我不必擔心再次提及它?此外,將num參數添加到dice函數中會導致我收到一個「TypeError:dice()缺少1所需的位置參數:'num'」,因此爲什麼我最初將它排除在外,因爲我無法確定哪裏是正確的地方添加它,因爲我會收到的或一個沒有定義的錯誤,這是沒有意義的,因爲它已經定義? – Tedwyn

+0

1)不客氣。 2)在python語言工作的方式中,'dice'不會調用'randint';它引用的數字是之前調用過'randint'的結果。 3)在我的代碼版本中,沒有參數的表達式「dice()」永遠不會出現,因此,您看到的錯誤消息從不會發生。 – John1024