2017-08-28 13 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