2015-04-23 62 views
2

所以遊戲是二十一點,我有代碼片段來製作一副牌和一隻手。從甲板上,這是一個列表,我試圖建立一個字典,以便每張牌(甲板上的一個元組)都將有一個映射到它的值,按照Blackjack的規則。我的字典有什麼問題(映射值到卡片)

from random import randint 

def make_deck(): 
    deck = [] 
    for suit in suits: 
     for rank in ranks: 
      deck.append((suit,rank)) 
    return deck 

suits = ['spades','hearts','diamonds','clubs'] 
ranks = ['ace','two','three','four','five','six','seven','eight','nine','ten','jack','queen','king'] 

deck = make_deck() 

def make_hand(): 
    hand = [] 
    for k in range(2): 
     card = deck.pop(randint(0,51)) 
     hand.append(card) 
    return hand 

hand = make_hand() 

values = {} #empty dictionary 
for card in deck: 
    rank = [card[1] for card in deck] 
    if rank == 'ace': 
     values[card] = 1 
    elif rank == 'two': 
     values[card] = 2 
    elif rank == 'three': 
     values[card] = 3 
    elif rank == 'four': 
     values[card] = 4 
    elif rank == 'five': 
     values[card] = 5 
    elif rank == 'six': 
     values[card] = 6 
    elif rank == 'seven': 
     values[card] = 7 
    elif rank == 'eight': 
     values[card] = 8 
    elif rank == 'nine': 
     values[card] = 9 
    elif rank == 'ten' or 'jack' or 'queen' or 'king': 
     values[card] = 10 
print values 

顯然,這是非常創造蠻力字典和缺乏任何優雅所以任何指針變成一個更有效的方式,將不勝感激。真正的問題是,我無法確定我的代碼有什麼問題,print values只返回一個元組映射到它的值而不是整個字典。如果我在循環之外移動rank的列表理解,我只是得到一個字典,其中一切都映射到值10.

此外,我只是意識到我的make_hand()函數有時會導致一個錯誤,其中「彈出指數超出範圍「,所以建議您嘗試以使其始終能夠正常工作,這也值得讚賞。

+0

也許使'''行列'''(等級,值)元組的項目。然後你可以使用['''operator.itemgetter'''](https://docs.python.org/3/library/operator.html#operator.itemgetter)來檢索出值排序。 – wwii

回答

2

將行:

rank = [card[1] for card in deck] 

有:

rank = card[1] 

是的,你可以更高效地(優雅),通過創建映射值,以分數的字典做到這一點:

mapper = {'ace': 1, 'two': 2, ...} 

然後你不需要if/elif ... else:

for card in deck: 
    values[card] = mapper[card[1]] 
+0

在列表理解中,程序實現了查看卡片的卡組。如果我刪除列表理解,不會再定義卡嗎? –

+0

@ChartererSling我不確定我是否理解你在說什麼,你是否嘗試了我的第一個建議?它應該需要2秒的時間來嘗試! – alfasin

+0

我嘗試了更有效的方式建議,它像寶石一樣工作,謝謝!我只是想知道當你說要用'rank = card [1]'替換時,我收到一個錯誤,其中卡未定義。 –