2017-02-18 3 views
0

В настоящее время я работаю над игрой в блэкджек в Python. Чтобы забрать руку, я вызываю следующую функцию. highAce, если это правда, забьет Эйса как 11, а если ложно, забьет их как 1.Получение "KeyError 2" в Python?

def score_hand(self, highAce): 
    curr_score = 0 
    special_scores = {'J': 11, 'Q': 12, 'K': 13, 'A': (1, 11)[highAce]} 
    for card in self._cards: 
     curr_score += special_scores[card[0]] if type(card[0]) is str else card[0] 
    return curr_score 

Все в self._cards представляет собой именованный кортеж под названием «Card», который имеет «ранг» и 'костюм'.

Карты создаются следующим образом (это еще один класс):

Card = collections.namedtuple('Card', ['rank', 'suit']) 

ranks = [str(n) for n in range(2, 11)] + list('JQKA') 
suits = 'spades diamonds clubs hearts'.split() 

def __init__(self, seed=None): 
self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks] 

Вопрос, кажется, придумать в этой линии curr_score += special_scores[card[0]] if type(card[0]) is str else card[0]

итератора принимает взгляд на «звание» от каждый карта. Если ранг НЕ является строкой, это означает, что это всего лишь номер 1 ~ 9, что также означает, что мы можем просто добавить это к счету. Однако, если строка ранга IS A, это означает, что это либо JQKA. Таким образом, я либо добавляю его значение в таблицу special_scores, либо ее фактическое значение ранга.

+1

JQK все набрали 10 баллов в блэкджеке. –

ответ

1

Ваши ранги все строки:

>>> ranks = [str(n) for n in range(2, 11)] + list('JQKA') 
>>> ranks 
['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'] 

Так type(card[0]) is str всегда правда. Вы получаете ключевую ошибку, потому что special_scores не имеет '2', например, в качестве ключа.

Простым решением является сохранение баллов для всех строк. Также только первый туз считается 11, так что вы можете сделать:

SCORES = dict(zip('A 2 3 4 5 6 7 8 9 10 J Q K'.split(), 
        [1,2,3,4,5,6,7,8,9,10,10,10,10])) 

def score_hand(cards): 
    curr_score = 0 
    ace_seen = False 
    for card in cards: 
     curr_score += SCORES[card.rank] 
     if not ace_seen and card.rank == 'A': 
      curr_score += 10 
      ace_seen = True 
    return curr_score