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((0, 0, 0)) 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') screen.draw.text('\n'.join(output), (15, 15))