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)) 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)) if round_over: screen.draw.text('Total: ' + str(get_total(dealer_hand)), (margin_x, 10), color=(0, 0, 0)) else: screen.draw.text('Total: ?', (margin_x, 10), color=(0, 0, 0)) screen.draw.text('Total: ' + str(get_total(player_hand)), (margin_x, 120), color=(0, 0, 0)) if round_over: 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) ) ) def draw_winner(message): screen.draw.text(message, (margin_x, 268), color=(0, 0, 0)) if has_hand_won(player_hand, dealer_hand): draw_winner('Player wins') elif has_hand_won(dealer_hand, player_hand): draw_winner('Dealer wins') else: draw_winner('Draw') screen.draw.filled_rect(Rect(10, 230, 53, 25), color=(255, 127, 57)) screen.draw.text('Hit!', (23, 236)) screen.draw.filled_rect(Rect(70, 230, 53, 25), color=(255, 127, 57)) screen.draw.text('Stand', (74, 236))