Untitled

 avatar
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...