2013-03-12 82 views
0

我正在制作Heroscape游戏的骰子滚轮(所以我们可以和离岸朋友一起玩)。 Heroscape的骰子有6面。 3面显示头骨,1面有符号,2面有屏蔽。在Python中打印随机选择的变量

我已经让它随机产生了其中的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语句,但我意识到,如果我尝试打印(“diceRoll”)我得到的是整个阵列而不是随机选择的掷骰子。

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

(我的想法是一样的东西

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

你好 - 欢迎来到SO。如果[Blckknght's Answer](http://stackoverflow.com/a/15351750/1993598)或[mine](http://stackoverflow.com/a/15351762/1993598)帮助您,请点击绿色支票标记在我们的名字旁边。这将意味着很多,并将帮助网站的其他成员快速找到最有效的答案。 – xxmbabanexx 2013-03-12 01:46:29

回答

0

我想为你使用这个问题是来自于标准库中的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随机卷处理结果。如果您还没有学习过发生器表达式,我建议将它们检查出来,因为它们可以派上用场。

+0

非常感谢您的答复! – Sorryboss 2013-03-12 02:28:58

+0

编辑我原来的帖子太久了(点击进入下一行,并发布代替D :) 非常感谢您的回复!不幸的是,我并没有很好地理解这一点 - 你的代码会导致应用崩溃。我以为我做错了什么! 我已经将它添加到我的代码中(当我回家时,我肯定会阅读发生器表达式!)现在,通过复制和粘贴。当我在运行应用程序后选择2时,它会立即关闭而不显示任何内容。在那里的其他人的代码也一样!我为我的新手道歉:( – Sorryboss 2013-03-12 02:34:51

+0

啊,我在我的'import'语句中有一个错字,正确的模块名称是'collections'而不是'collection',我已经将它修正过了。当我在空闲状态下运行上面的代码(不是在你的大型程序中)时,我得到了一个相当有用的错误信息,以'ImportError:No module named collection'结尾。从命令提示符或IDE运行你的程序,这样你就可以看到你引起的任何异常,调试将是一场没有它的噩梦! – Blckknght 2013-03-12 02:55:45

0

欢迎来到SO。我更改了代码的几个部分,使它们更类似于我的风格 - 如果有帮助,请随时将其更改回来。

更改您的循环代码简单:

while True: 

这样可以完成同样的事情,不同的是它是更Python。

然后,在一个标签中,告诉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.') 
+0

我认为从列表中的'random.choice'比'if' /'elif'语句的大系列更加pythonic。数据结构(甚至是基本的)是好的,用它们! – Blckknght 2013-03-12 01:42:28

+0

这是我所想的更多,但我似乎无法得到这个工作。当我保存并运行应用程序时,它会闪烁一会儿然后关闭。我认为这表明语法错误,但我无法在任何地方看到。 – Sorryboss 2013-03-12 02:50:12

+0

@sorryboss嗯......这很奇怪。我在Python 2.7.3的窗口中运行我的代码 - 你使用不同的操作系统?也许这是你的缩进 - 今天晚些时候我会复制和粘贴整个代码(在我完成标准化测试后,可能是美国东部标准时间上午11点)。 – xxmbabanexx 2013-03-12 11:33:37