-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathblackjack.py
151 lines (124 loc) · 5 KB
/
blackjack.py
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
import random
class Card:
def __init__(self, suit, value):
self.suit = suit
self.value = value
def __repr__(self):
return " of ".join((self.value, self.suit))
class Deck:
def __init__(self):
self.cards = [Card(s, v) for s in ["Spades", "Clubs", "Hearts", "Diamonds"]
for v in ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]]
def shuffle(self):
if len(self.cards) > 1:
random.shuffle(self.cards)
def deal(self):
if len(self.cards) > 1:
return self.cards.pop(0)
class Hand:
def __init__(self, dealer=False):
self.dealer = dealer
self.cards = []
self.value = 0
def add_card(self, card):
self.cards.append(card)
def calculate_value(self):
self.value = 0
has_ace = False
for card in self.cards:
if card.value.isnumeric():
self.value += int(card.value)
else:
if card.value == "A":
has_ace = True
self.value += 11
else:
self.value +=10
if has_ace and self.value > 21:
self.value -= 10
def get_value (self):
self.calculate_value()
return self.value
def display(self):
if self.dealer:
print("hidden")
print(self.cards[1])
else:
for card in self.cards:
print(card)
print("Value", self.get_value())
class Game:
def __init__(self):
pass
def play(self):
playing = True
while playing:
self.deck = Deck()
self.deck.shuffle()
self.player_hand = Hand()
self.dealer_hand = Hand(dealer=True)
for i in range(2):
self.player_hand.add_card(self.deck.deal())
self.dealer_hand.add_card(self.deck.deal())
print("Your hand is:")
self.player_hand.display()
print()
print("Dealer's hand is:")
self.dealer_hand.display()
game_over = False
while not game_over:
player_has_blackjack = self.check_for_blackjack()
dealer_has_blackjack = self.check_for_blackjack()
if player_has_blackjack or dealer_has_blackjack:
game_over = True
self.show_blackjack_results(player_has_blackjack, dealer_has_blackjack)
continue
choice = input("Please choose [Hit / Stick] ").lower()
while choice not in ["h", "s", "hit", "stick"]:
choice = input("Please enter 'hit' or 'stick' (or H/S ").lower()
if choice in ['hit', 'h']:
self.player_hand.add_card(self.deck.deal())
self.player_hand.display()
if self.player_is_over():
print("You have lost!")
game_over = True
else:
player_hand_value = self.player_hand.get_value()
dealer_hand_value = self.dealer_hand.get_value()
print("Final Results")
print("Your hand:", player_hand_value)
print("Dealer's hand:", dealer_hand_value)
if player_hand_value > dealer_hand_value:
print("You Win!")
elif player_hand_value == dealer_hand_value:
print("Tie!")
else:
print("Dealer Wins!")
game_over = True
again = input("Play Again? [Y/N] ")
while again.lower() not in ["y", "n"]:
again = input("Please enter Y or N ")
if again.lower() == "n":
print("Thanks for playing!")
playing = False
else:
game_over = False
def player_is_over(self):
return self.player_hand.get_value() > 21
def check_for_blackjack(self):
player_has_blackjack = False
dealer_has_blackjack = False
if self.player_hand.get_value() == 21:
player_has_blackjack = True
if self.dealer_hand.get_value() == 21:
dealer_has_blackjack = True
def show_blackjack_results(self, player_has_blackjack, dealer_has_blackjack):
if player_has_blackjack and dealer_has_blackjack:
print("Both players have blackjack! Draw!")
elif player_has_blackjack:
print("You have blackjack! You win!")
elif dealer_has_blackjack:
print("Dealer has blackjack! Dealer wins!")
if __name__ == "__main__":
game = Game()
game.play()