-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhelpers.py
178 lines (145 loc) · 4.66 KB
/
helpers.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
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
from random import shuffle
import time
class Card:
"""Card Class"""
def __init__(self, value, suit):
self.value = value
self.suit = suit
@property
def card_name(self):
"""Returns the Name of non-number cards"""
if self.value == 1:
return 'Ace'
elif self.value == 11:
return 'Jack'
elif self.value == 12:
return 'Queen'
elif self.value == 13:
return 'King'
else:
return self.value
@property
def real_value(self):
"""Returns the actual value of non-number cards"""
if self.value == 11:
return 10
elif self.value == 12:
return 10
elif self.value == 13:
return 10
else:
return self.value
def __str__(self):
return '{} of {}'.format(self.card_name, self.suit)
class Player:
"""Player Class"""
def __init__(self, player_name):
self.cards = []
self.name = player_name
self.bust = False
self.stick = False
self.blackjack = False
def __str__(self):
return self.name
def is_blackjack(player):
"""Checks if a player has blackjack after initial deal"""
ace = False
picture = False
card_values_list = []
# a card has to have a value of 1 and another card 11, 12, 13
for card in player.cards:
card_values_list.append(card.value)
if 1 in card_values_list:
ace = True
for card in card_values_list:
if card > 10:
picture = True
if ace and picture:
player.blackjack = True
return True
else:
return False
def calc_score(player):
"""Calculates the total score of a players cards"""
cards_values_list = [card.real_value for card in player.cards]
if 1 in cards_values_list:
high_ace_sum = sum(cards_values_list) + 10
if high_ace_sum < 22:
return high_ace_sum
return sum(cards_values_list)
def set_user_status(score, player):
if score > 21:
player.bust = True
if score == 21:
player.stick = True
return player
def player_extra_cards_sequence(player, deck):
"""User stick/twist sequence"""
while not player.stick and not player.bust:
try:
choice = int(input('{} - Type 0 to stick or 1 to twist:'.format(player.name)))
if choice < 0 or choice > 1:
print('Not a valid option, please try again')
elif choice == 1:
# twist
deal_card(player, deck)
card = player.cards[-1]
print(card)
time.sleep(1)
score = calc_score(player)
set_user_status(score, player)
if player.bust:
break
print('Your cards total {}'.format(score))
elif choice == 0:
# stick
player.stick = True
except ValueError:
print('Not a valid option, please try again')
def create_deck():
"""Creates and randomises a Deck of cards"""
suits = ['Spades', 'Diamonds', 'Hearts', 'Clubs', ]
deck = [Card(value, suit) for value in range(1, 14) for suit in suits]
shuffle(deck)
return deck
def deal_card(player, deck):
"""Deals a card to a player"""
player.cards.append(deck[0])
deck.pop(0)
def get_users_name():
valid_name = False
while not valid_name:
player_name = input('Please enter your name (Uppercase and Lowercase letters only):')
if player_name.isalpha():
return player_name
def print_all_cards(player):
print("{}'s cards:".format(player))
time.sleep(1)
for card in player.cards:
time.sleep(1)
print(card)
time.sleep(1)
def dealer_extra_cards_sequence(dealer, player, deck):
"""Dealer stick/twist sequence"""
dealer_score = calc_score(dealer)
player_score = calc_score(player)
while dealer_score < player_score and not dealer.bust:
deal_card(dealer, deck)
print(dealer.cards[-1])
time.sleep(1)
dealer_score = calc_score(dealer)
print('Dealer cards total {}'.format(dealer_score))
if dealer_score > 21:
dealer.bust = True
time.sleep(1)
print('Dealer bust!')
def calculate_winner(player, dealer):
"""Calculates the winner of the game"""
user_score = calc_score(player)
dealer_score = calc_score(dealer)
print('{} score: {}'.format(player, user_score))
print('{} score: {}'.format(dealer, dealer_score))
if dealer_score >= user_score:
return dealer
else:
return player