Untitled
unknown
python
4 years ago
4.3 kB
19
Indexable
import random
class BlackJack:
def __init__(self):
self.dealers_cards = []
self.players_cards = []
self.card_deck = {
"A": 1,
"2": 2,
"3": 3,
"4": 4,
"5": 5,
"6": 6,
"7": 7,
"8": 8,
"9": 9,
"10": 10,
"J": 10,
"Q": 10,
"K": 10,
}
@property
def players_points(self):
try:
return sum([self.card_deck[card] for card in self.players_cards])
except KeyError:
return ""
@property
def dealers_points(self):
try:
return sum([self.card_deck[card] for card in self.players_cards])
except KeyError:
return ""
@property
def players_hand(self):
return f"Your hand: {' '.join(self.players_cards)} ({self.players_points})\n"
def dealers_hand(self, arg: int = None):
if arg is not None:
hidden = self.dealers_cards[1:]
try:
return f"Dealers hand: X {' '.join(hidden)} ({sum([self.card_deck[card] for card in hidden])})\n"
except KeyError:
return ""
elif arg is None:
not_hidden = self.dealers_cards
return f"Dealers hand: {' '.join(not_hidden)} ({self.dealers_points})\n"
@staticmethod
def map_points(p):
if 21 < p:
return 0
if 21 <= p:
return float('inf')
if p == "":
return 0
return p
def player_draws(self):
if self.players_points == 21:
print("You have a BlackJack!")
del (self.card_deck['BlackJack'])
return
for i in range(7):
if self.players_points > 21:
print("You've gone bust!\n")
return
x = input("Stand or hit: ")
if x == "hit":
self.players_cards.append(random.choice(list(self.card_deck)))
print(self.players_hand)
else:
print("You stand!\n")
break
def dealer_draws(self):
if self.dealers_points == 21:
print(f"Dealer has a BlackJack!")
del(self.card_deck['BlackJack'])
return
for i in range(7):
if self.dealers_points > 21:
print("Dealer has gone bust!\n")
return
elif 17 <= self.dealers_points <= 21:
print("Dealer stands!\n")
return
else:
print("Dealer draws another card!")
rc = random.choice(list(self.card_deck))
self.dealers_cards.append(rc)
print("\n" + self.dealers_hand(1))
def determine_winner(self):
pp = self.map_points(self.players_points)
dp = self.map_points(self.dealers_points)
if pp > dp:
print(f"\n{self.dealers_hand(None)}{self.players_hand}You won!\n")
elif pp < dp:
print(f"\n{self.dealers_hand(None)}{self.players_hand}\nYou lost!\n")
else:
print(f"\n{self.dealers_hand(None)}{self.players_hand}\nTie!\n")
def looper(self):
try:
del(self.card_deck['BlackJack'])
except:
pass
self.players_cards = random.sample(list(self.card_deck), 2)
self.dealers_cards = random.sample(list(self.card_deck), 2)
d = self.dealers_cards
p = self.players_cards
if 'A' in d and any(card in d for card in ('10', "J", "Q", "K")):
self.card_deck["BlackJack"] = 10
self.dealers_cards.append(list(self.card_deck)[-1])
if 'A' in p and any(card in p for card in ('10', "J", "Q", "K")):
self.card_deck["BlackJack"] = 10
self.players_cards.append(list(self.card_deck)[-1])
print(self.players_hand)
print(self.dealers_hand(1))
def main() -> None:
game = BlackJack()
while True:
game.looper()
game.player_draws()
game.dealer_draws()
game.determine_winner()
if __name__ == "__main__":
main()
Editor is loading...