3

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

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

4

2 回答 2

5

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

所以问题出在代码的那一部分。让我们看一下:

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

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

因此,如果您键入yes,它将尝试查找 的值yes,并引发NameErrorn或相同no

如果你输入y,同样的事情应该会发生......除了因为你碰巧有一个名为y躺在周围的无关变量,它实际上会找到一个值,1。因此,当您稍后检查时, inwhile 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:\\')ls /如果你在 Unix 而不是 Windows 上替换),并想象你的用户可能对其他输入造成多少恶作剧。

因此,我建议始终使用raw_input. 如果要将输入转换为整数,请将其传递给int. 如果要将其视为任何类型的文字值,请使用ast.literal_eval. 如果您真的想将其评估为任意 Python 代码,请使用eval(它并不比 更安全input,但至少更明确)。

于 2013-09-25T19:10:17.030 回答
1

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

dice4然后你用,dice6和重复太多代码dice12。您应该使用一个带有参数的函数。现在您将能够掷出许多不同的骰子。

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

dice(4)
dice(6)
dice(8)
于 2013-09-25T19:13:47.750 回答