Ejemplo n.º 1
0
class Game:
    def __init__(self, usable_ace):
        self.dealer_cards = []
        self.player_cards = []

        self.player_sum = 0
        self.dealer_sum = 0
        self.usable_ace = usable_ace

        self.deck = Deck(self.usable_ace)
        self.showing_card = None

    def play(self, start_check_limit):
        self.init_dealer_cards()  # two cards for dealer
        self.init_player_cards()  # two cards for player

        if (self.get_player_cards_sum() == 21):
            # natural when dealer also has 21
            win = 0 if self.get_dealer_cards_sum() == 21 else 1
            return GameResult(self.get_player_cards_sum(), self.showing_card,
                              win)

        # player hitting until stopping
        while self.get_player_cards_sum() < start_check_limit:
            self.add_card(self.deck.GetTopCardValue(), self.player_cards)

        # bust, instant lose
        if self.get_player_cards_sum() > 21:
            return GameResult(self.get_player_cards_sum(), self.showing_card,
                              -1)

        # dealer's turn
        while self.get_dealer_cards_sum() < 17:
            self.add_card(self.deck.GetTopCardValue(), self.dealer_cards)

        if self.get_player_cards_sum() > 21:
            win = -1
        elif self.get_dealer_cards_sum() > 21:
            win = 1
        elif self.get_player_cards_sum() == 21:
            win = 1
        elif self.get_dealer_cards_sum() == self.get_player_cards_sum():
            win = 0
        elif self.get_player_cards_sum() > self.get_dealer_cards_sum():
            win = 1
        else:
            win = -1

        return GameResult(self.get_player_cards_sum(), self.showing_card, win)

    def init_dealer_cards(self):
        self.showing_card = self.deck.GetTopCardValue()

        self.add_card(self.showing_card, self.dealer_cards)
        self.add_card(self.deck.GetTopCardValue(), self.dealer_cards)

    def init_player_cards(self):
        self.add_card(self.deck.GetTopCardValue(), self.player_cards)
        self.add_card(self.deck.GetTopCardValue(), self.player_cards)

    def add_card(self, card_value, collection):
        collection.append(card_value)

    def get_total_value(self, collection, usable_ace):
        totalSum = sum(collection)

        if self.usable_ace and totalSum > 21 and 11 in collection:
            totalSum = totalSum - collection.count(11) * 10

        return totalSum

    def get_player_cards_sum(self):
        return self.get_total_value(self.player_cards, self.usable_ace)

    def get_dealer_cards_sum(self):
        return self.get_total_value(self.dealer_cards, self.usable_ace)