2015-12-18 42 views
1

我有一個程序模擬紙牌遊戲21.這裏的目的是我的代碼的重要元素,其是非常強的自我explanitory(我強調行i後面會提到)爲什麼我不能從字典中追加這個值?

spades = ['2S','3S','4S','5S','6S','7S','8S','9S','10S','JS','QS','KS','AS'] 
hearts = ['2H','3H','4H','5H','6H','7H','8H','9H','10H','JH','QH','KH','AH'] 
clubs = ['2C','3C','4C','5C','6C','7C','8C','9C','10C','JC','QC','KC','AC'] 
diamonds = ['2D','3D','4D','5D','6D','7D','8D','9D','10D','JD','QD','KD','AD'] 
allCards = spades + hearts + clubs + diamonds 

cardVal = {'2S':2,'3S':3,'4S':4,'5S': 5,'6S':6,'7S':7,'8S':8,'9S':9,'10S':10,'JS':10,'QS':10,'KS':10,'AS':11, 
    '2H':2,'3H':3,'4H':4,'5H':5,'6H':6,'7H':7,'8H':8,'9H':9,'10H':10,'JH':10,'QH':10,'KH':10,'AH':11, 
    '2C':2,'3C':3,'4C':4,'5C':5,'6C':6,'7C':7,'8C':8,'9C':9,'10C':10,'JC':10,'QC':10,'KC':10,'AC':11, 
    '2D':2,'3D':3,'4D':4,'5D':5,'6D':6,'7D':7,'8D':8,'9D':9,'10D':10,'JD':10,'QD':10,'KD':10,'AD':11} 

import random 
random.shuffle(allCards) 

playerCards = [allCards.pop() for i in range(2)] 
dealerCards = [allCards.pop() for i in range(2)] 
playerHand = [] 
dealerHand = [] 
playerHandVal = 0 
dealerHandVal = 0 

def handVal(playercards,playerhand,score): 
    playerhand = [] 
    for i in playercards: 
     playerhand.append(cardVal[i]) ####### LINE 29 ###### 
    score = sum(playerhand) 
    print(score) 

handVal(playerCards,playerHand,playerHandVal) 
handVal(dealerCards,dealerHand,dealerHandVal) 

def twist(playercards,playerhand,score): 
    newCard = [allCards.pop() for i in range(1)] 
    playercards.append(newCard) 
    handVal(playercards,playerhand,score) ####### LINE 39 ######## 

move = input('Stick (S) or Twist (T) : ') 

if move == 'T' or move == 't': 
    while move == 'T' or 't': 
     twist(playerCards,playerHand,playerHandVal) ######## LINE 45 ######## 
     print(playerHand) 
     if playerHandVal > 21: 
      move = 's' 
      break 
     move = input('Stick (S) or Twist (T) : ') 

當我運行腳本將產生兩個長度爲2的數組,並在輸入提示Stick (S) or Twist (T) :之前爲這些卡片提供正確的手形值。然而,當扭曲選擇的程序產生這個錯誤,

line 45, in <module> 
    twist(playerCards,playerHand,playerHandVal) 
    line 39, in twist 
    handVal(playercards,playerhand,score) 
    line 29, in handVal 
    playerhand.append(cardVal[i]) 
TypeError: unhashable type: 'list' 

我的問題是,爲什麼在扭曲功能

回答

5

時調用的代碼playerhand.append(cardVal[i])這部分工作initally而不是當你這樣做:

newCard = [allCards.pop() for i in range(1)] 
playercards.append(newCard) 

你插入listplayercardsallCards彈出一個值,而不是本身的價值。

後來,當你這樣做:

for i in playercards: 
    playerhand.append(cardVal[i]) ####### LINE 29 ###### 

i是不是一個索引,或者密鑰本身,它是一個包含什麼,我認爲是你想要的關鍵一個元素list; list s是可變的,因此不適合作爲dict s的密鑰,並且cardValdict

它的工作一開始,因爲你初始化playerhand作爲含兩張卡,單元素的卡list S的不是list當你做playerCards = [allCards.pop() for i in range(2)]list,就是額外的吸引,你實現不正確。

修復的方法是填充playercards用卡,沒有一個元素list S的卡:

newCard = allCards.pop() # Get the value, not a one-element `list` containing the value 
playercards.append(newCard) 

如果目標是流行和追加幾個卡(和你只是使用range(1)作爲一個佔位符暫且),以每張卡分別追加,而不是附加的卡list作爲一個單一的元素,你可以做兩種:

newCard = [allCards.pop() for i in range(1)] 
playercards.extend(newCard) # extend appends each element from the iterable 

或因爲playercardsnewCard都是list S,你可以使用操作符重載:

newCard = [allCards.pop() for i in range(1)] 
playercards += newCard # Same as extend, but only works when both sides are same type 
+0

打我給它。 :-) – Turn

1

因爲從列表中理解[allCards.pop() for i in range(1)]返回值是一個列表本身。因此,這些行後:

newCard = [allCards.pop() for i in range(1)] 
playercards.append(newCard) 

playercards可能擁有的東西,看起來像['KS', 'QH', ['JS', '10H']]

後來在handVal您試圖索引一個字典(cardVal)與列表中的值。你不能用一個可變對象類型索引一個字典,所以你會得到這個錯誤。

你可能想改變線38是這樣的:

playercards.extend(newCard) 
相關問題