import random def take_card(hand): hand.append(deck.pop(random.randrange(len(deck)))) def reset(): global deck global player_hand global dealer_hand global round_over deck = [] for suit in ('club', 'diamond', 'heart', 'spade'): for rank in range(1, 14): deck.append({'suit': suit, 'rank': rank}) player_hand = [] take_card(player_hand) take_card(player_hand) dealer_hand = [] take_card(dealer_hand) take_card(dealer_hand) round_over = False reset() def get_total(hand): total = 0 has_ace = False for card in hand: if card['rank'] > 10: total += 10 else: total += card['rank'] if card['rank'] == 1: has_ace = True if has_ace and total <= 11: total += 10 return total def on_key_down(key): global round_over if not round_over: if key == keys.H: take_card(player_hand) if get_total(player_hand) >= 21: round_over = True elif key == keys.S: round_over = True if round_over: while get_total(dealer_hand) < 17: take_card(dealer_hand) else: reset() def draw(): screen.fill((255, 255, 255)) output = [] output.append('Player hand:') for card in player_hand: output.append('suit: ' + card['suit'] + ', rank: ' + str(card['rank'])) output.append('Total: ' + str(get_total(player_hand))) output.append('') output.append('Dealer hand:') for card_index, card in enumerate(dealer_hand): if not round_over and card_index == 0: output.append('(Card hidden)') else: output.append('suit: ' + card['suit'] + ', rank: ' + str(card['rank'])) if round_over: output.append('Total: ' + str(get_total(dealer_hand))) else: output.append('Total: ?') if round_over: output.append('') def has_hand_won(this_hand, other_hand): return ( get_total(this_hand) <= 21 and ( get_total(other_hand) > 21 or get_total(this_hand) > get_total(other_hand) ) ) if has_hand_won(player_hand, dealer_hand): output.append('Player wins') elif has_hand_won(dealer_hand, player_hand): output.append('Dealer wins') else: output.append('Draw') card_spacing = 60 margin_x = 10 for card_index, card in enumerate(dealer_hand): image = card['suit'] + '_' + str(card['rank']) if not round_over and card_index == 0: image = 'card_face_down' screen.blit(image, (card_index * card_spacing + margin_x, 30)) for card_index, card in enumerate(player_hand): screen.blit(card['suit'] + '_' + str(card['rank']), (card_index * card_spacing + margin_x, 140))