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)
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)
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)