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')
for card_index, card in enumerate(player_hand):
screen.blit(card['suit'] + '_' + str(card['rank']),
(card_index * 60, 0))