Exemple #1
0
class Sim():
    def __init__(self):
        self.DECKS = 8
        self.shoe = Shoe(8)
        self.p1 = Player("Complete_Strategy", 10000)
        self.p2 = Player("Basic_Strategy", 10000)
        self.dealer = Dealer(self.shoe)
        self.sims = 0

    def run(self):
        for x in range(10000):

            print(f"*** Hand {self.sims+1}***")
            self.sims += 1

            print(self.p1)
            print(self.p2)

            self.p1.bet()
            self.p2.bet()

            self.deal_cards()

            while not self.p1.is_done() or not self.p2.is_done():
                card = Card(Rank(random.randint(Rank.Ace, Rank.King)),
                            Suit.Spade)
                action_b = strategy.infinite_basic_action(
                    self.p1.hand, self.dealer)
                action_c = strategy.infinite_complete_action(
                    self.p2.hand, self.dealer)
                self.p1.process_action(action_b, card)
                self.p2.process_action(action_c, card)

            self.dealer.playout_hand()

            self.p1.payout(self.dealer.hand)
            self.p2.payout(self.dealer.hand)

            self.dealer.reset()
            self.shoe.reset_shoe(
            )  # why am I reseting shoe everytime yet still calculating deal probs every hand?

            print("\n")

    def deal_cards(self):
        players_hand = self.random_hand(2)
        self.p1.add_hand(players_hand)
        self.p2.add_hand(deepcopy(players_hand))
        self.dealer.deal_card(
            Card(Rank(random.randint(Rank.Ace, Rank.King)), Suit.Spade))

    def random_hand(self, size):
        cards = []
        for _ in range(size):
            card = Card(Rank(random.randint(Rank.Ace, Rank.King)), Suit.Spade)
            cards.append(card)
            self.shoe.draw(card)

        return Hand(cards)
Exemple #2
0
def dealer_class_test(card, exp):

    shoe = Shoe(8)
    prob = Probability(shoe)
    dealer = Dealer(shoe, prob)
    dealer.deal_card(card)
    probs = dealer.dealer_outcome_probs()

    # make sure probability isn't greated than one
    if round(sum(probs), 2) != 1.0:
        print(f"FAIL: dealer outcome probabilites < or > 1 : '{sum(probs)}'")
        return

    if exp == probs:
        print("\tSUCCESS: dealer outcome probabilites as expected")
    else:
        print("\tFAIL: dealer outcome probabilites NOT as expected")
class Game:
    def __init__(self, *players, chips=100):
        self.deck = Deck()
        self.deck.shuffle()
        self.dealer = Dealer()
        self.players = [Player(player, chips) for player in players]

    def betting_round(self):
        for player in self.players:
            player.make_bet()

    def initial_deal(self):
        for player in self.players:
            self.dealer.deal_card(player, self.deck)
            self.dealer.deal_card(player, self.deck)
            player.show_hand()

        self.dealer.deal_card(self.dealer, self.deck)
        self.dealer.show_first_card()

    def hitting_round(self):
        for player in self.players:
            while player.is_hitting():
                self.dealer.deal_card(player, self.deck)
                player.show_hand()
                if player.is_bust():
                    print("{} BUSTS!".format(player.name))
                    break

    def dealer_hitting(self):
        while self.dealer.hand.score < 17:
            print("Dealer Hits!")
            self.dealer.deal_card(self.dealer, self.deck)
        self.dealer.show_hand()

    def bet_result(self, player, did_win):
        if did_win:
            player.chips += player.bet
        else:
            player.chips -= player.bet

    def results(self):
        print('--------------------------------')
        print("Dealer final score:", self.dealer.hand.score)
        for player in self.players:
            print('-----------------------------')
            print("{} final score:".format(player.name), player.hand.score)

            if player.is_bust():
                print("RESULT: BUST!")
                self.bet_result(player, False)
            elif player.hand.score > self.dealer.hand.score and not player.is_bust(
            ):
                print("RESULT: WIN!")
                self.bet_result(player, True)
            elif self.dealer.is_bust():
                print("RESULT: WIN!")
                self.bet_result(player, True)
            else:
                print("RESULT: LOSS!")
                self.bet_result(player, False)

            print("Current Chips: ", player.chips)
            if (player.chips <= 0):
                print("Player Eliminated!")
            print('-----------------------------')

    def reset_game(self):
        self.dealer.hand.return_cards(self.deck)
        new_player_list = []
        for player in self.players:
            player.bet = 0
            player.hand.return_cards(self.deck)
            if player.chips > 0:
                new_player_list.append(player)
        self.players = new_player_list
        self.deck.shuffle()

    def play_again(self):
        if not self.players:
            return False
        else:
            return input("Would you like to play again? (Y/N): ").lower(
            ).startswith('y')

    def play(self):
        playing = True
        while playing:
            self.betting_round()
            self.initial_deal()
            self.hitting_round()
            self.dealer_hitting()
            self.results()
            self.reset_game()
            playing = self.play_again()
class CardTable(object):
    def __init__(self):
        self.chairs = []
        self.shoe = Shoe(6)
        self.dealer = Dealer()
        self.insurance = True
        self.blackjack_payout = 1.5
        self.shoe_size = 6

    def ask_player(self, chair, hand, dealer_showing):
        decision = ""
        while decision is not "stay" and hand['hand'].is_busted() is False:
            decision = chair.player.decision(hand['hand'], dealer_showing)
            if decision is "split":
                chair.player.splits += 1
                chair.player.bankroll -= hand['bet']
                chair.split_hand(hand)
                hand['hand'].add_card(self.dealer.deal_card(self))
                chair.splits = True
            elif decision is "hit":
                hand['hand'].add_card(self.dealer.deal_card(self))
            elif decision is "double":
                chair.player.doubles += 1
                bet = hand['bet']
                chair.player.bankroll -= bet
                hand['bet'] = bet * 2
                hand['hand'].add_card(self.dealer.deal_card(self))
                decision = "stay"
        hand['active'] = False

    def play_round(self):
        if len(self.shoe.cards) < (self.shoe_size * 13):
            self.shoe = Shoe(self.shoe_size)
            for chair in self.chairs:
                chair.player.count = 0
        decks_left = len(self.shoe.cards) / 52
        self.dealer.hand = Hand()
        for chair in self.chairs:
            chair.hands = []
            chair.active = True
            chair.splits = False
            hand = Hand()
            chair.add_hand({
                'hand': hand,
                'bet': chair.player.make_bet(decks_left),
                'active': True
            })
        self.dealer.deal_round(self)
        if len(self.dealer.hand.cards) > 0:
            if self.dealer.hand.is_dealer_blackjack():
                for chair in self.chairs:
                    if chair.hands[0]['hand'].is_blackjack():
                        chair.player.blackjacks += 1
                        self.dealer.refund_player(chair.hands[0], chair)
                    chair.active = False
            elif self.dealer.showing() is 11:
                if self.insurance:
                    for chair in self.chairs:
                        if chair.player.insurance and chair.active:
                            chair.player.pay_insurance()
                if self.dealer.hand.is_blackjack():
                    for chair in self.chairs:
                        if chair.player.insurance:
                            if self.insurance:
                                self.dealer.refund_player(
                                    chair.hands[0], chair)
                        elif chair.hands[0]['hand'].is_blackjack():
                            chair.player.blackjacks += 1
                            self.dealer.refund_player(chair.hands[0], chair)
                        chair.active = False
                else:
                    self.resolve_chairs()
                    self.dealer.resolve_round(self)
            else:
                self.resolve_chairs()
                self.dealer.resolve_round(self)

    def resolve_chairs(self):
        for chair in self.chairs:
            if chair.hands[0]['hand'].is_blackjack():
                self.dealer.pay_player_blackjack(chair, self.blackjack_payout)
                chair.player.blackjacks += 1
                chair.active = False
            else:
                self.ask_player(chair, chair.hands[0], self.dealer.showing())
                while chair.splits:
                    for i in range(0, len(chair.hands)):
                        if chair.hands[i]['active']:
                            chair.hands[i]['hand'].add_card(
                                self.dealer.deal_card(self))
                            self.ask_player(chair, chair.hands[i],
                                            self.dealer.showing())
                    chair.check_splits()
                for hand in chair.hands:
                    if hand['hand'].is_busted():
                        chair.active = False
                    else:
                        chair.active = True
                        break

    def seat_players(self, players):
        for player in players:
            chair = Chair()
            chair.seat_player(player)
            self.chairs.append(chair)

    def set_table_style(self, insurance, blackjack_payout, shoe_size):
        self.insurance = insurance
        self.blackjack_payout = blackjack_payout
        self.shoe_size = shoe_size
        self.shoe = Shoe(shoe_size)
Exemple #5
0
class GameController(object):
    def __init__(self):
        self.player_bet = 0

    def prep_player(self):
        self.player = Player(bankroll=100)

    def prep_dealer(self):
        deck = Deck()
        deck.shuffle()
        self.dealer = Dealer(deck)

    def ask_player_bet(self):
        self.player_bet = self.player.ask_bet()

    def hand_to_player(self):
        self.player.take_card(self.dealer.deal_card())
        self.player.take_card(self.dealer.deal_card())
        self.player.show_hand()

    def hand_to_dealer(self):
        self.dealer.take_card(self.dealer.deal_card())
        self.dealer.take_card(self.dealer.deal_card())
        self.dealer.show_hand(True)

    def check_initial_hands(self):
        if self.dealer.hand.is_blackjack(
        ) is True and self.player.hand.is_blackjack() is True:
            print("Both you and the Dealer have Blackjack!")
            self.dealer.show_hand()
            return 'tie'

        elif self.dealer.hand.is_blackjack() is True:
            print("Dealer has Blackjack!")
            self.dealer.show_hand(False)
            return 'dealer'

        elif self.player.hand.is_blackjack() is True:
            print("You have Blackjack!")
            return 'player'

        else:
            return 'game goes on'

    def process_blackjack(self, outcome):
        if outcome == 'tie':
            return

        if outcome == 'player':
            self.player.add_win(self.player_bet * 1.5)
            return

        if outcome == 'dealer':
            self.player.sub_loss(self.player_bet)
            return

    def do_player_turn(self):
        while self.player.hand.is_busted() is False:
            decision = self.player.play_turn()
            if decision == "h":
                self.player.take_card(self.dealer.deal_card())
                self.player.show_hand()
            else:
                return

    def check_player(self):
        if self.player.hand.is_busted() is True:
            print("You busted.")
            return 'player_busted'
        else:
            return 'player_ok'

    def do_dealer_turn(self):
        self.dealer.play_turn()

    def check_dealer(self):
        if self.dealer.hand.is_busted() is True:
            print("Dealer busted.")
            return 'dealer_busted'
        else:
            return 'dealer_ok'

    def find_winner(self):
        player_total = self.player.hand.get_total()
        dealer_total = self.dealer.hand.get_total()

        if player_total == dealer_total:
            print("Dealer and Player both have " + str(player_total))
            return 'tie'

        if player_total > dealer_total:
            print("You win with " + str(player_total))
            return 'player'
        else:
            self.dealer.show_hand(False)
            print("Dealer wins with " + str(dealer_total))
            return 'dealer'

    def handle_game_outcome(self, outcome):
        if outcome == 'tie':
            return
        if outcome == 'player':
            self.player.add_win(self.player_bet)
            return
        if outcome == 'dealer':
            self.player.sub_loss(self.player_bet)
            return

    def collect_used_cards(self):
        self.player.empty_hand()
        self.dealer.empty_hand()

    def ask_play(self):
        while True:
            answer = (
                raw_input('Do you want to play Blackjack? [y/n] ')).lower()
            if answer == 'y':
                return True
            else:
                return False
class CardTable(object):

    def __init__(self):
        self.chairs = []
        self.shoe = Shoe(6)
        self.dealer = Dealer()
        self.insurance = True
        self.blackjack_payout = 1.5
        self.shoe_size = 6

    def ask_player(self, chair, hand, dealer_showing):
        decision = ""
        while decision is not "stay" and hand['hand'].is_busted() is False:
            decision = chair.player.decision(hand['hand'], dealer_showing)
            if decision is "split":
                chair.player.splits += 1
                chair.player.bankroll -= hand['bet']
                chair.split_hand(hand)
                hand['hand'].add_card(self.dealer.deal_card(self))
                chair.splits = True
            elif decision is "hit":
                hand['hand'].add_card(self.dealer.deal_card(self))
            elif decision is "double":
                chair.player.doubles += 1
                bet = hand['bet']
                chair.player.bankroll -= bet
                hand['bet'] = bet * 2
                hand['hand'].add_card(self.dealer.deal_card(self))
                decision = "stay"
        hand['active'] = False

    def play_round(self):
        if len(self.shoe.cards) < (self.shoe_size * 13):
            self.shoe = Shoe(self.shoe_size)
            for chair in self.chairs:
                chair.player.count = 0
        decks_left = len(self.shoe.cards) / 52
        self.dealer.hand = Hand()
        for chair in self.chairs:
            chair.hands = []
            chair.active = True
            chair.splits = False
            hand = Hand()
            chair.add_hand({
                'hand': hand,
                'bet': chair.player.make_bet(decks_left),
                'active': True
            })
        self.dealer.deal_round(self)
        if len(self.dealer.hand.cards) > 0:
            if self.dealer.hand.is_dealer_blackjack():
                for chair in self.chairs:
                    if chair.hands[0]['hand'].is_blackjack():
                        chair.player.blackjacks += 1
                        self.dealer.refund_player(chair.hands[0], chair)
                    chair.active = False
            elif self.dealer.showing() is 11:
                if self.insurance:
                    for chair in self.chairs:
                        if chair.player.insurance and chair.active:
                            chair.player.pay_insurance()
                if self.dealer.hand.is_blackjack():
                    for chair in self.chairs:
                        if chair.player.insurance:
                            if self.insurance:
                                self.dealer.refund_player(chair.hands[0], chair)
                        elif chair.hands[0]['hand'].is_blackjack():
                            chair.player.blackjacks += 1
                            self.dealer.refund_player(chair.hands[0], chair)
                        chair.active = False
                else:
                    self.resolve_chairs()
                    self.dealer.resolve_round(self)
            else:
                self.resolve_chairs()
                self.dealer.resolve_round(self)

    def resolve_chairs(self):
        for chair in self.chairs:
            if chair.hands[0]['hand'].is_blackjack():
                self.dealer.pay_player_blackjack(chair, self.blackjack_payout)
                chair.player.blackjacks += 1
                chair.active = False
            else:
                self.ask_player(chair, chair.hands[0], self.dealer.showing())
                while chair.splits:
                    for i in range(0, len(chair.hands)):
                        if chair.hands[i]['active']:
                            chair.hands[i]['hand'].add_card(self.dealer.deal_card(self))
                            self.ask_player(chair, chair.hands[i], self.dealer.showing())
                    chair.check_splits()
                for hand in chair.hands:
                    if hand['hand'].is_busted():
                        chair.active = False
                    else:
                        chair.active = True
                        break

    def seat_players(self, players):
        for player in players:
            chair = Chair()
            chair.seat_player(player)
            self.chairs.append(chair)

    def set_table_style(self, insurance, blackjack_payout, shoe_size):
        self.insurance = insurance
        self.blackjack_payout = blackjack_payout
        self.shoe_size = shoe_size
        self.shoe = Shoe(shoe_size)