Untitled
unknown
python
4 years ago
4.3 kB
17
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...