コード例 #1
0
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])
コード例 #2
0
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()