2015-04-23 2 views
2

Итак, игра Блэкджек, и у меня есть фрагменты кода, чтобы сделать колоду и сделать руку. Из колоды, которая является списком, я пытаюсь создать словарь, чтобы каждая карта (кортеж из колоды) имела значение, сопоставленное с ним, в соответствии с правилами Блэкджека.Что не так с моим словарем (сопоставление значений с картами)

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]», я получил ошибку, когда карта не определена. –

Смежные вопросы