-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcard_components.py
More file actions
72 lines (55 loc) · 1.96 KB
/
card_components.py
File metadata and controls
72 lines (55 loc) · 1.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
from typing import List
from random import shuffle
from constants import suits, ranks, values, rank_viz, suit_viz
class Card:
def __init__(self, suit, rank):
self.suit = suit
self.rank = rank
self.value = values[rank]
self.rank_viz = rank_viz[ranks.index(rank)]
self.suit_viz = suit_viz[suits.index(suit)]
def get_blackjack_value(self, current_total=0):
if self.rank == 'Ace':
return 11 if current_total + 11 <= 21 else 1
return min(10, self.value)
class Deck:
def __init__(self):
self.all_cards = [Card(suit, rank) for suit in suits for rank in ranks]
def shuffle(self):
shuffle(self.all_cards)
def deal_one(self):
if not self.all_cards:
raise ValueError('No cards left in the deck!')
return self.all_cards.pop()
class Hand:
def __init__(self):
self.cards = []
self.value = 0
self.aces = 0
def add_card(self, card):
self.cards.append(card)
self.calculate_value()
def calculate_value(self):
self.value = 0
self.aces = 0
for card in self.cards:
if card.rank == 'Ace':
self.aces += 1
self.value += card.get_blackjack_value()
while self.value > 21 and self.aces:
self.value -= 10
self.aces -= 1
def print_hand(self, hide_first=False):
for i, card in enumerate(self.cards):
if i == 0 and hide_first:
print("+-------+")
print("| *** |")
print("| *** |")
print("| *** |")
print("+-------+")
else:
print("+-------+")
print(f"| {card.rank_viz.ljust(2)} |")
print(f"| {card.suit_viz} |")
print(f"| {card.rank_viz.rjust(2)} |")
print("+-------+")