链接到条件if语句的Int(输入)未正确输出,而else语句回调形成无限递归循环

时间:2017-08-28 19:45:52

标签: python python-3.x recursion random conditional

(对于论坛发帖我还是新手,如果布局不当/措辞不好,请道歉)

请你帮我解决这个问题。我的问题是,我正在尝试让用户输入一个对骰子有效的整数,例如6,12,20等等(我只为D6和D20设置了它)我的骰子滚动应用程序我的目标是像Roll20.net上使用的独立版本一样工作,

我有两个问题:

1。)当用户选择有效的模具,例如6或20,而不是滚动所述模具时,它只返回数字6或20,或者在第一次其他故障后输入的任何数字,例如12,76相反,它应该使用相应的print语句发布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,我只需要在Tkinter中使用组合框进行骰子选择,并使用按钮来调用函数?因为我的目标是在某个时刻为这个程序构建一个GUI。我真的很难理解这些基础知识。

我希望那里的人能够帮助我或指出正确的方向,谢谢。

1 个答案:

答案 0 :(得分: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指出的那样,num is 6仅在num6存储在内存中的同一位置时才返回True。您想要检查是否相等:num == 6。另外,如果您想检查num是6还是20,那么可以使用num in (6, 20)