2013-03-12 67 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