【问题标题】:Printing a randomly chosen variable in Python在 Python 中打印随机选择的变量
【发布时间】:2013-03-12 01:02:08
【问题描述】:

我正在为游戏 Heroscape 做一个掷骰子(这样我们就可以和离岸的朋友一起玩了)。 heroscape 的骰子有 6 个面。 3 面显示头骨,1 面有符号,2 面有盾牌。

我让它随机生成其中 1 个边,但我希望它在最后列出结果(即,你滚动了 6 个头骨、2 个符号和 4 个盾牌)。

这是我当前的代码:

loop = 1
while loop == 1:
    diceChoose = raw_input('Pick your dice. (Press 1 for a D20 roll, and 2 for attack /defense dice.) ')
    if diceChoose == ('1'):
        import random
        for x in range(1):
            print random.randint(1,21),
            print
        raw_input("YOUR DICE ROLL(S) HAVE COMPLETED. PRESS ANY KEY TO CONTINUE.")
    elif diceChoose == ('2'):
        diceNo = int(raw_input('How many dice do you need? '))
        testvar = 0
        diceRoll = ['skull', 'skull', 'skull', 'symbol', 'shield', 'shield']
        from random import choice

        while testvar != diceNo:
            print choice(diceRoll)
            testvar = testvar + 1
            if testvar == diceNo:
                print ('YOUR DICE ROLLS HAVE COMPLETED')

        raw_input("PRESS ANY KEY TO CONTINUE.")

    else: loop = raw_input('Type 1 or 2. Nothing else will work. Press 1 to start the program again.')

我尝试的是一堆 if 语句,但我意识到,如果我尝试 print ('diceRoll'),我得到的只是整个数组,而不是随机选择的骰子。

我不确定如何在每个 diceRoll 发生时保存它,因此我可以稍后打印该数字。

(我的想法是这样的

if diceRoll == 'skull' skullNo +1 
print('skullNo'))

【问题讨论】:

  • 您好 - 欢迎来到 SO。如果Blckknght's Answermine 对您有所帮助,请点击我们名称旁边的绿色复选标记。这将意味着很多,并将帮助网站的其他成员快速找到最有效的答案。

标签: python python-2.7


【解决方案1】:

我认为你可以使用标准库中collections 模块中的Counter 来解决这个问题。它有点像字典,将对象映射到整数。但是,您可以为其添加值,这将增加它们的计数。

所以,我会这样做:

from random import choice
from collections import Counter

diceNo = int(raw_input('How many dice do you need? '))
diceValues = ['skull', 'skull', 'skull', 'symbol', 'shield', 'shield']

counter = Counter()
counter.update(choice(diceValues) for _ in range(diceNo))

print("Rolls:")
for value, count in counter.items():
    print("{}: {}".format(value, count))

print ('YOUR DICE ROLLS HAVE COMPLETED')
raw_input("PRESS ANY KEY TO CONTINUE.")

关键行是counter.update(choice(diceValues) for _ in range(diceNo))。这会使用“生成器表达式”调用counter.update,从而产生diceNo 随机滚动结果。如果您还没有了解生成器表达式,我建议您检查一下,因为它们真的很方便。

【讨论】:

  • 非常感谢您的回复!
  • 花了太长时间编辑我的原始帖子(按回车键,然后它改为发布 D:) 非常感谢您的回复!不幸的是,我没有很好地掌握这一点 - 您的代码使应用程序崩溃。我想我做错了什么!我已经将它添加到我的代码中(当我回到家时,我肯定会阅读生成器表达式!)现在,通过复制和粘贴。当我在运行应用程序后选择 2 时,它会立即关闭而不显示任何内容。其他人的代码也是如此!我为我的新手道歉:(
  • 啊,我的import 声明中有错字。正确的模块名称是 collections 而不是 collection。我已经在上面修复了。您对体验的描述表明您可能想要更改运行程序的方式。当我在 Idle 中运行上面的代码(单独运行,而不是在更大的程序中)时,我收到了一条非常有用的错误消息,以 ImportError: No module named collection 结尾。尝试从命令提示符或 IDE 运行您的程序,这样您就可以看到您导致的任何异常。没有它,调试将是一场噩梦!
  • 我只是用我的记事本应用程序将这些保存为 test.py 并双击。如果出现问题,命令提示符窗口将打开,然后立即关闭。有没有更好的办法?
  • @Sorryboss:是的,肯定有更好的方法来运行 Python 脚本,至少在调试时是这样。最简单的方法是手动打开命令提示符(如果您使用的是 Windows,则运行 cmd.exe),然后在正确的文件夹中输入 python myscript.py。另一种设置起来有点复杂,但是一旦准备好就更容易了,那就是使用an IDE。我经常使用 Idle,以及 Python 标准库中包含的 IDE。它不是很花哨,但它可以很好地完成我需要做的大部分事情。
【解决方案2】:

欢迎来到 SO。我更改了您的代码的一些部分,使它们更类似于 my 样式 - 如果有帮助,请随时将它们改回来。

将您的循环代码更改为:

while True:

这完成了同样的事情,只是它更pythonic。

然后,将标签合二为一,并为skull, symbolshield 设置数值。在本例中,我们将其设置为 0。

skull = 0
symbol = 0
shield = 0

接下来,将diceNo = int(raw_input('How many dice do you need? ')) 下方的代码更改为此。它应该缩进一个。

    for x in xrange(diceNo):
        import random
        choice = random.randint(1,6) 

        if choice == 1:
            skull +=1
        elif choice == 2:
            skull +=1
        elif choice == 3:
            skull +=1
        elif choice == 4:
            symbol =+ 1
        elif choice == 5:
            shield += 1
        elif choice == 6:
            shield += 1

此代码重复所需的掷骰次数。然后,我将 1 添加到与该名称关联的变量中。

在其正下方,我们向用户显示信息。

print "You rolled %d skulls, %d symbols, and %d shields. Congrats." % (skull, symbol, shield)

由于您的代码似乎有问题,因此我决定将其完整发布。

while True:

    #Here we set the variables

    skull = 0
    symbol = 0
    shield = 0

    diceChoose = raw_input('Pick your dice. (Press 1 for a D20 roll, and 2 for attack /   defense dice.) ')
    if diceChoose == '1':
        import random
        for x in range(1):
            print random.randint(1,21),
            print
        raw_input("YOUR DICE ROLL(S) HAVE COMPLETED. PRESS ANY KEY TO CONTINUE.")
    elif diceChoose == '2':
        diceNo = int(raw_input('How many dice do you need? '))

        for x in xrange(diceNo):
            import random
            choice = random.randint(1,6) 

            if choice == 1:
                skull +=1
            elif choice == 2:
                skull +=1
            elif choice == 3:
                skull +=1
            elif choice == 4:
                symbol =+ 1
            elif choice == 5:
                shield += 1
            elif choice == 6:
                shield += 1

        print "You rolled %d skulls, %d symbols, and %d shields. Congrats." % (skull, symbol, shield)

        raw_input("PRESS ANY KEY TO CONTINUE.")

    else: loop = raw_input('Type 1 or 2. Nothing else will work. Press 1 to start the program again.')

【讨论】:

  • 我认为列表中的random.choice 比一大堆if/elif 语句更具pythonic。数据结构(即使是基本的)都很好,使用它们!
  • 这更像是我的想法,但我似乎也无法让它发挥作用。当我保存并运行应用程序时,它会闪烁一会儿然后关闭。我认为这表明存在语法错误,但我在任何地方都看不到。
  • @sorryboss 嗯...这很奇怪。我在 python 2.7.3 上的 windows 中运行了我的代码 - 你使用的是不同的操作系统吗?也许这是您的缩进 - 我将在今天晚些时候复制并粘贴整个代码(在我完成标准化测试之后,可能是美国东部标准时间上午 11 点。)
  • 再次感谢伙计 - 我现在已经开始工作了,这确实是我的缩进。我通过没有显示错误的命令提示符运行代码,但我已经开始使用 IDLE,它提供了非常丰富的信息!
猜你喜欢
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
相关资源
最近更新 更多