-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpythonbj.py
More file actions
207 lines (170 loc) · 6.47 KB
/
Copy pathpythonbj.py
File metadata and controls
207 lines (170 loc) · 6.47 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
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
import collections
from time import sleep
from random import shuffle
# TODO Add input checks to bets
# TODO Only print one of the dealer's cards before player has a turn
# TODO Add logic for double and split
# TODO Make dealer's hit cards print one at a time, slowly, for dramatic effect
Card = collections.namedtuple('Card', ['rank', 'suit'])
CARD_VALS = {'2': 2, '3': 3, '4': 4, '5': 5, '6': 6,
'7': 7, '8': 8, '9': 9, '10': 10, 'J': 10,
'Q': 10, 'K': 10, 'A': 11}
class Player:
""" A class representing a player of blackjack.
If no name or bankroll are set, __init__ retrieves
from the console. """
cards = []
hand_value = 0
bet_amount = 0
def __init__(self, name='', bankroll=-1, is_dealer=False):
if name != '':
self.name = name
else:
self.name = self.input_name()
if bankroll > 0:
self.bankroll = bankroll
else:
self.bankroll = self.input_bankroll(self.name)
self.is_dealer = is_dealer
def reset(self, deck):
self.cards = deck.get_start_cards()
self.hand_value = self.get_hand_value()
def adjust_bankroll(self,blackjack=False, double_down=False):
if blackjack:
multiplier = 2.5
elif double_down:
multiplier = 4
else:
multiplier = 2
self.bankroll = self.bet_amount * multiplier
def input_bet_amount(self):
print("CURRENT BANKROLL: $%s" % self.bankroll)
self.bet_amount = int(input("Enter your bet amount: "))
self.bankroll -= self.bet_amount
def input_name(self):
""" Gets the player's name from the console. """
return input("Hello! What is your name? ")
def input_bankroll(self, name=''):
""" Gets the player's bankroll from the console. """
return int(input("What is your starting bankroll, %s? " % name))
def get_hand_value(self):
hand_value = 0
aces = [c for c in self.cards if c.rank == 'A']
for card in self.cards:
hand_value += CARD_VALS[card.rank]
if hand_value > 21 and len(aces):
for card in self.cards:
if card.rank == 'A' and hand_value > 21:
hand_value -= 10
return hand_value
def print_cards(self, hide_card=True):
if len(self.cards) <= 2 and hide_card and self.is_dealer:
print(self.cards[0])
print("---*****-----*****----*****---")
else:
for card in self.cards:
print(card)
def print_name(self):
print("-------- %s -----------\n" % self.name.upper())
def hit(self, deck):
""" Add a card to player cards """
self.cards.append(deck.pop())
self.hand_value = self.get_hand_value()
def print_hand_value(self, hide_card=True):
if len(self.cards) <= 2 and hide_card and self.is_dealer:
value = "**"
else:
value = self.hand_value
print("\n============%s==============\n" % value)
class Deck:
""" A class that represents a deck of cards.
Implements getitem, setitem, len, repr"""
ranks = [str(n) for n in range(2, 11)] + list('JQKA')
suits = 'spades diamonds clubs hearts'.split()
def __init__(self):
self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]
def __len__(self):
return len(self._cards)
def __getitem__(self, position):
return self._cards[position]
def __setitem__(self, position, card):
self._cards[position] = card
def __repr__(self):
outstr = ''
for card in self:
outstr += str(card) + '\n'
return outstr
def pop(self):
""" Pops off the top card in the deck """
return self._cards.pop()
def get_start_cards(self):
return [self._cards.pop(), self._cards.pop()]
def print_welcome():
print("Welcome to blackjack!")
def get_start_cards(deck):
""" Returns a list of two cards """
return [deck.pop(), deck.pop()]
def play_hand(player_cards, dealer_cards):
""" Play a hand of blackjack until player busts or stays """
pass
def print_cards(*players):
for p in players:
p.print_name()
p.print_cards()
p.print_hand_value()
def main():
""" MAIN """
print_welcome()
player = Player() # Uncomment to get input from console
#player = Player(name='Brent', bankroll=1000)
dealer = Player(name='Dealer', bankroll=1, is_dealer=True)
while player.bankroll > 0:
print("\nHere we go, %s!\n" % player.name)
deck = Deck()
shuffle(deck)
player.input_bet_amount()
player.reset(deck)
dealer.reset(deck)
print_cards(dealer, player)
if player.hand_value == 21:
print("Blackjack!")
player.win_hand(blackjack=True)
else:
answer = 'h'
while answer == 'h' and player.hand_value <= 21:
print("Your current hand value: %s" % player.hand_value)
answer = input('Enter h for hit, d for double down, or s for stand: ')
print("\n")
if answer == 'h' or answer == 'd':
player.hit(deck)
print_cards(dealer, player)
else:
pass
if player.hand_value > 21:
print("Too bad, you lose. Sorry!")
else:
# IMPLEMENT DEALER HITS AND STANDS
print("It's the dealer's turn.")
print("You have %s." % player.hand_value)
print("Dealer has %s." % dealer.hand_value)
print("Good luck! Dealer's turn...")
dealer.print_cards(hide_card=False)
while dealer.hand_value < 17:
sleep(2)
dealer.hit(deck)
print(dealer.cards[-1])
sleep(1)
dealer.print_hand_value(hide_card=False)
sleep(2)
if dealer.hand_value > 21 or player.hand_value > dealer.hand_value:
print("You win!")
player.win_hand()
elif dealer.hand_value > player.hand_value:
print("You lose :(")
if answer == 'd':
player.bankroll -= player.bet_amount
else:
print("Tie!")
player.bankroll += player.bet_amount
if __name__ == '__main__':
main()