【问题标题】:Problems simulating a dice in Python在 Python 中模拟骰子的问题
【发布时间】:2013-10-01 12:42:25
【问题描述】:

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

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

【问题讨论】:

  • 您看到的错误是什么?您可以将其编辑到您的问题中吗?
  • 另外,您能指定您使用的 Python 版本吗?
  • 不要在行尾添加分号,添加无用的return 语句等。这会使您的代码更难阅读。

标签: python dice


【解决方案1】:

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

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

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 更安全,但至少更明确)。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-28
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多