在Python中模拟骰子的问题

时间:2013-09-25 19:04:05

标签: python dice

我是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");

感谢您的帮助,我意识到这可能是一个微不足道的错误。

2 个答案:

答案 0 :(得分:5)

  

我不确定为什么当我输入是否要再次滚动时会产生错误。

所以问题在于代码的那部分。我们来看看它:

roll = input("Do you want to roll again? y/n");

您正在使用input功能。这将尝试评估您键入的任何内容作为Python表达式。

因此,如果您输入yes,它会尝试找到yes的值,并提出NameErrornno也是如此。

如果你输入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)

让我在您的代码中添加其他问题。您覆盖函数中的内置minmax,并使用不需要的分号。您使用空return语句。

然后,您使用dice4dice6dice12重复了太多代码。您应该使用一个带参数的函数。现在你可以投掷很多不同的骰子。

def dice(value):
    print random.randint(1, value)

dice(4)
dice(6)
dice(8)