我是python的新手,我正在尝试创建一个简单的程序,允许用户选择使用8,12或24个侧面骰子,然后显示滚动结果。
这是我的代码,但我不确定为什么当我输入是否要再次滚动时会产生错误。
import random
def dice4():
min=1
max=4
print random.randint(min, max);
return;
def dice6():
min=1
max=6
print random.randint(min, max);
return;
def dice12():
min=1
max=12
print random.randint(min, max);
return;
roll = "yes"
y = 1
while roll == "yes" or roll == "y":
x = input("What dice do you want to use? 4/6/12?");
if x ==8:
dice4();
elif x==12:
dice6();
elif x==16:
dice12();
else:
print "You have not entered a valid dice number";
roll = input("Do you want to roll again? y/n");
print "Thanks for rolling!";
input("Press <Enter> to quit");
感谢您的帮助,我意识到这可能是一个微不足道的错误。
答案 0 :(得分:5)
我不确定为什么当我输入是否要再次滚动时会产生错误。
所以问题在于代码的那部分。我们来看看它:
roll = input("Do you want to roll again? y/n");
您正在使用input
功能。这将尝试评估您键入的任何内容作为Python表达式。
因此,如果您输入yes
,它会尝试找到yes
的值,并提出NameError
。 n
或no
也是如此。
如果你输入y
,同样的事情应该发生......除非你碰巧有一个名为y
的无关变量,它实际上会找到一个值1
。因此,当您稍后检查时,在while roll == "yes" or roll == "y":
中,显然1
不等于其中任何一个字符串,因此它将退出。
唯一可以输入的内容是"y"
或"yes"
(或单引号相同)。显然,您不希望用户输入。
解决方案是使用raw_input
代替input
,它只是将输入作为字符串,而不是尝试评估它。
roll = raw_input("Do you want to roll again? y/n");
这是使用input
的一个原因通常是一个坏主意。即使在早期的情况下,你想要一个整数,错别字的错误也会很难看。
有一个更好的理由,看看当你输入__import__('os').system('dir C:\\')
时会发生什么(如果你在Unix而不是Windows上,请替换ls /
),并想象一下你的用户可能会对其他输入造成多大的恶作剧
因此,我建议使用raw_input
始终。如果要将输入转换为整数,请将其传递给int
。如果要将其视为任何类型的文字值,请使用ast.literal_eval
。如果您真的想将其评估为任意Python代码,请使用eval
(这不比input
更安全,但至少它更明确。)
答案 1 :(得分:1)
让我在您的代码中添加其他问题。您覆盖函数中的内置min
和max
,并使用不需要的分号。您使用空return
语句。
然后,您使用dice4
,dice6
和dice12
重复了太多代码。您应该使用一个带参数的函数。现在你可以投掷很多不同的骰子。
def dice(value):
print random.randint(1, value)
dice(4)
dice(6)
dice(8)