Exemplo n.º 1
0
class Game:
    def __init__(self):
        self.deck = Deck()
        self.player = HumanPlayer('Kal')
        self.dealer = CpuPlayer('Dealer')
        self.game_on = True

    def run(self, replay=False):
        player_turn = True
        dealer_limit_reached = False

        if replay:
            if self.player.no_chips() and self.will_player_play():
                self.ask_for_buy_in()
                self.ask_for_bet()
            elif not self.player.no_chips():
                self.ask_for_bet()
            else:
                self.game_on = False
        else:
            if self.will_player_play():
                self.ask_for_buy_in()
                self.ask_for_bet()
            else:
                self.game_on = False

        if self.game_on:
            self.deck.shuffle()
            for _i in range(2):
                self.player.take_card(card=self.deck.deal())
                self.dealer.take_card(card=self.deck.deal())
            self.player.show_all()
            self.dealer.show_some()
            while player_turn:
                player_wants_hit = self.will_player_hit()
                if player_wants_hit:
                    self.player.take_card(card=self.deck.deal())
                    self.dealer.show_some()
                    self.player.show_all()
                else:
                    player_turn = False
                    break
                if self.player.has_busted():
                    while self.player.has_high_aces():
                        self.player.adjust_for_ace()
                        if self.player.get_score() <= 21:
                            break
                    else:
                        self.dealer_win()
                        player_turn = False
        if self.game_on:
            while not dealer_limit_reached:
                if self.dealer.should_hit():
                    self.dealer.take_card(card=self.deck.deal())
                elif self.dealer.has_busted():
                    while self.dealer.has_high_aces():
                        self.dealer.adjust_for_ace()
                        if self.dealer.get_score() <= 21:
                            break
                    else:
                        self.player_win()
                        dealer_limit_reached = True
                else:
                    dealer_limit_reached = True
                    break

        if self.game_on:
            player_score = self.player.get_score()
            dealer_score = self.dealer.get_score()
            if player_score > dealer_score:
                self.player_win()
            elif player_score == dealer_score:
                self.push()
            else:
                self.dealer_win()

        player_quit = not self.game_on and player_turn
        if not player_quit and self.ask_for_replay():
            self.reset_for_replay()
            self.run(replay=True)
        else:
            print('\nThanks for playing!\n')

    def will_player_play(self):
        valid_choice = False
        print("\nYou've got to pay to play\n")
        while not valid_choice:
            choice = input('Are you buying in? (y or n)  ')
            if choice != 'y' and choice != 'n':
                print('\nPlease enter either "y" or "n"\n')
            else:
                valid_choice = True
        return choice == 'y'

    def ask_for_buy_in(self):
        valid_choice = False
        while not valid_choice:
            try:
                buy_in = int(input("\nWhat's your buy in?  "))
                self.player.buy_in(buy_in)
                valid_choice = True
            except:
                print('\nYou must provide a number')

    def ask_for_bet(self):
        valid_choice = False
        while not valid_choice:
            try:
                bet = int(input("\nWhat's your bet?  "))
                self.player.place_bet(bet)
                if self.player.is_bet_valid():
                    valid_choice = True
                else:
                    print("\nThat's not a valid bet.")
                    print(
                        "Bets cannot be more than you can cover and cannot be 0."
                    )
                    self.player.reset_bet()
            except:
                print('\nYou must provide a number')

    def ask_for_replay(self):
        valid_choice = False
        while not valid_choice:
            replay = input('\nPlay again? (y or n)  ')
            if replay != 'y' and replay != 'n':
                print('Please enter either a "y" or "n"')
            else:
                valid_choice = True
        return replay == 'y'

    def reset_for_replay(self):
        self.game_on = True
        self.deck = Deck()
        self.player.reset_hand()
        self.dealer.reset_hand()

    def will_player_hit(self):
        valid_choice = False
        while not valid_choice:
            choice = input('Would you like to hit? (y or n)  ')
            if choice != 'y' and choice != 'n':
                print('\nPlease enter either "y" or "n"\n')
            else:
                print('\n')
                valid_choice = True
        return choice == 'y'

    def declare_winner(self, winner=None):
        self.game_on = False
        print('\n****************\n')
        print('Final Hands:\n')
        self.dealer.show_all()
        self.player.show_all()
        print('Final Scores:\n')
        print(f'Dealer: {self.dealer.get_score()}')
        print(f'Player: {self.player.get_score()}\n')
        if winner == None:
            print('Push!')
        else:
            print(f'{winner} has won!')

    def player_win(self):
        self.declare_winner('Player')
        self.player.win_bet()

    def dealer_win(self):
        self.declare_winner('Dealer')
        self.player.lose_bet()

    def push(self):
        self.declare_winner(winner=None)
        self.player.lose_bet()