class Session: def __init__(self, n_bbs, bb_size, rake_size, strategies): self.n_bbs = n_bbs self.bb_size = bb_size self.rake_size = rake_size self.n_spots = 0 self.rake_accum = 0 self.players = [] for strategy in strategies: self.players.append( Player( len(self.players) + 1, strategy, START_BALANCE, n_bbs * bb_size)) self.n_players = len(self.players) self.dealer_idx = self.n_players - 1 # Start with the first player as SB self.deck = Deck() def run(self, n_spots): self.report() for i in range(n_spots): self.handle_spot() self.dealer_idx = (self.dealer_idx + 1) % self.n_players self.report() self.report() def handle_spot(self): self.n_spots += 1 self.deck.reset() hands = self.deck.deal_players(self.n_players) for h in hands: print h balances = [0] * self.n_players for i_player in range(self.n_players): player_idx = (self.dealer_idx + POS_UTG_VS_DEALER + i_player) % self.n_players balances[i_player] = self.players[player_idx].table_balance bet_sizes = [0] * self.n_players pot_size = 0 player_sb_idx = (self.dealer_idx + POS_SB_VS_DEALER) % self.n_players bet_sizes[player_sb_idx] = self.players[player_sb_idx].bet( self.bb_size / 2) # SB pot_size += bet_sizes[player_sb_idx] player_bb_idx = (self.dealer_idx + POS_BB_VS_DEALER) % self.n_players bet_sizes[player_bb_idx] = self.players[player_bb_idx].bet( self.bb_size) # BB pot_size += bet_sizes[player_bb_idx] allin_participants = [] for i_player in range(self.n_players): if i_player == self.n_players - 1 and len(allin_participants) == 0: break # When no one bet and last player to act player_idx = (self.dealer_idx + POS_UTG_VS_DEALER + i_player) % self.n_players is_allin = self.players[player_idx].act(hands[player_idx], balances, POSITIONS_LIST[i_player], None) if is_allin: bet_sizes[player_idx] += self.players[player_idx].go_allin() pot_size += bet_sizes[player_idx] allin_participants.append({ 'player_idx': player_idx, 'hand': hands[player_idx], 'bet': bet_sizes[player_idx] }) else: balances[i_player] = 0 if len(allin_participants) == 0: player_idx = (self.dealer_idx + POS_BB_VS_DEALER) % self.n_players self.players[player_idx].eval_walk(pot_size) elif len(allin_participants) == 1: player_idx = allin_participants[0]['player_idx'] self.players[player_idx].eval_spot_result( allin_participants[0]['bet'], pot_size) else: com = self.deck.deal_community() for c in com: print c hand_ranks = [] for i in range(0, len(allin_participants)): hand_ranks.append( Holdem.showdown_hand_score(allin_participants[i]['hand'], com)) # OCOC evaluate hand ranks and side pots... participant_bets = [item['bet'] for item in allin_participants] participant_wins = Holdem.distribute_pot(hand_ranks, participant_bets) for i in range(0, len(allin_participants)): player_idx = allin_participants[i]['player_idx'] self.players[player_idx].eval_spot_result( allin_participants[i]['bet'], participant_wins[i]) def report(self): for pl in self.players: print pl print sum([p.wallet_balance + p.table_balance for p in self.players])
from cards import Deck from poker import Holdem while True: d = Deck() # d.shuffle() # h = Hand(d.draw_card(), d.draw_card()) # print h, h.suited print 'hands:' ps = d.deal_players(4) ps_str = '' for p in ps: ps_str += str(p) + ', ' print ps_str print "community:" com = d.deal_community() com_str = '' for c in com: com_str += str(c) + ', ' print com_str ss = list() ss.append(Holdem.showdown_hand_score(ps[0], com)) ss.append(Holdem.showdown_hand_score(ps[1], com)) ss.append(Holdem.showdown_hand_score(ps[2], com)) ss.append(Holdem.showdown_hand_score(ps[3], com)) for i in range(0, 4): print ps[i], ss[i] if ss[i][0] == '9': exit()