# Python OOP implementation of blackjack. from random import choice from os import system, name as os_name class Card: def __init__(self): # Set colour as random between red and black self.colour = choice(["red", "black"]) # Set suit depending on colour since a suit has an allocated colour self.suit = choice(["hearts", "diamonds"]) if self.colour == "red" else choice(["clubs", "spades"]) # Set value self.value = choice(["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"]) # Set whether the value is a face card or not self.face = True if self.value in ["Jack", "Queen", "King"] else False class Player: def __init__(self, number=None): self.name = f"player-{number}" self.cards = [] # This is so each player can take cards until they are "done" # Then the dealer can take his cards self.done = False self.win = False self.bust = False def show_cards(self): print(f"{self.name}'s cards:") for card in self.cards: print(f"> {card.value} of {card.suit}") print(f"Total:", end=" ") for value in self.total(): print(f"{value}", end=" ") print("\n") def total(self): values = {"Ace": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7":7, "8": 8, "9": 9, "10": 10, "Jack": 10, "Queen": 10, "King": 10} aces_in_cards = 0 total = [0 for _ in range(len(self.cards)+1)] for card in self.cards: total[0] += values[card.value] if card.value == "Ace": aces_in_cards += 1 for i in range(aces_in_cards): total[i+1] = total[i] + 10 return [value for value in total if value != 0] class Dealer(Player): def __init__(self): super().__init__(self) self.name = "dealer" def show_cards(self, game): print(f"{self.name}'s cards:") if not game.players_are_done(): print(f"> {self.cards[0].value} of {self.cards[0].suit}") for card in self.cards[1:]: print(f"> HIDDEN") print(f"Total: UNKNOWN") print() return for card in self.cards: print(f"> {card.value} of {card.suit}") print(f"Total:", end=" ") for value in super().total(): print(f"{value}", end=" ") print() class Game: def __init__(self): self.players = [Dealer()] for player_num in range(100): self.players.append(Player(player_num+1)) self.deal_cards() def main_loop(self): while True: for player in self.players[1:]: system("cls" if os_name == "nt" else "clear") self.overview() self.check_for_win() if not player.done: self.player_choice(player) self.check_for_loss() if self.players_are_done(): break def deal_cards(self): for player in self.players: for _ in range(2): player.cards.append(Card()) def overview(self): self.players[0].show_cards(self) for player in self.players[1:]: player.show_cards() def check_for_win(self): for player in self.players[1:]: for value in player.total(): if value == 21: player.win = True player.done = True def check_for_loss(self): for player in self.players[1:]: bust_count = 0 for value in player.total(): bust_count = (bust_count + 1) if value > 21 else bust_count if bust_count == len(player.total()): player.bust = True player.done = True def player_choice(self, player): match (input(f"{player.name} Hit or Stand? (h/s)")).lower(): case "hit": player.cards.append(Card()) case "h": player.cards.append(Card()) case "stand": player.done = True case "s": player.done = True case _: print("Please Provide A Valid Choice") system("cls" if os_name == "nt" else "clear") self.overview() self.player_choice(player) def players_are_done(self): for player in self.players[1:]: if not player.done: return False return True if __name__ == "__main__": game = Game() game.main_loop() # TODO: # - [X] Win checking # - [X] Lose checking # - [ ] Player choice (hit, stand) # - [ ] Dealers turn