예제 #1
0
 def test_legal_action_provide(self):
     self.INFO.street = GameInfo.PREFLOP
     self.INFO.sb_pos = 0
     d = Dealer()
     pot = Pot()
     pot.add(5); pot.add(10)  #
     players = [MockLegalActPlayer(1,"sb",100),MockLegalActPlayer(2,"bb",10)]
     players[0].set_ans(["FOLD:0","CALL:5","RAISE:15:15"])   # choose call
     players[1].set_ans(["FOLD:0","CALL:0", "RAISE:15:15"])
     d.ask_action(players, pot, [], [], range(2),self.INFO)
예제 #2
0
 def test_action_history(self):
     d = Dealer()
     pot = Pot()
     players = [MockPlayer(1,"a",100),MockPlayer(2,"b",15), MockPlayer(3,"c",50)]
     players[0].set_action(["RAISE:10","CALL:10"])
     players[1].set_action(["ALLIN:15"])
     players[2].set_action(["RAISE:20"])
     self.INFO.players = players
     d.ask_action(players, pot, [], [], range(3),self.INFO)
     eq_(["1:RAISE:10","2:ALLIN:15","3:RAISE:20","1:CALL:10"], self.INFO.last_actions)
     self.INFO.get_last_acts4display()
예제 #3
0
 def test_collect_blind(self):
     d = Dealer()
     pot = Pot()
     players = [BasePlayer(1,"a",100),BasePlayer(2,"b",200)]
     d.collect_blind(pot, players, 0, 5)
     eq_(95, players[0].stack)
     eq_(190, players[1].stack)
     d.collect_blind(pot, players, 1, 5)
     eq_(85, players[0].stack)
     eq_(185, players[1].stack)
     eq_(30, pot.chip)
예제 #4
0
 def test_deal_card(self):
     d = Dealer()
     deck = Deck()
     players = [MockPlayer(1,"a",100-5),MockPlayer(2,"b",15), MockPlayer(3,"c",50)]
     d.deal_card(deck, players, [])
     eq_(2, players[0].getCards()[0].toID())
     eq_(15, players[0].getCards()[1].toID())
     eq_(28, players[1].getCards()[0].toID())
     eq_(41, players[1].getCards()[1].toID())
     eq_(3, players[2].getCards()[0].toID())
     eq_(16, players[2].getCards()[1].toID())
예제 #5
0
    def test_ask_action(self):
        d = Dealer()
        pot = Pot()
        players = [MockPlayer(1,"a",100),MockPlayer(2,"b",200), MockPlayer(3,"c",10)]
        players[0].set_action(["RAISE:10","CALL:10"])
        players[1].set_action(["RAISE:20"])
        players[2].set_action(["ALLIN:10"])
        d.ask_action(players, pot, [], [], range(3),self.INFO)
        eq_(80,  players[0].stack)
        eq_(180,  players[1].stack)
        eq_(0,  players[2].stack)
        eq_(50, pot.chip)

        pot = Pot()
        players = [MockPlayer(1,"a",100),MockPlayer(2,"b",200), MockPlayer(3,"c",50)]
        players[0].set_action(["RAISE:10","FOLD:0"])
        players[1].set_action(["RAISE:20","RAISE:40"])
        players[2].set_action(["RAISE:30","CALL:40"])
        allin = []
        d.ask_action(players, pot, [], allin, range(3),self.INFO)
        eq_(90,  players[0].stack)
        eq_(140,  players[1].stack)
        eq_(0,  players[2].stack)
        eq_(120, pot.chip)
        eq_(players[2].pid, allin[0])

        pot = Pot()
        players = [MockPlayer(1,"a",100),MockPlayer(2,"b",15), MockPlayer(3,"c",50)]
        players[0].set_action(["RAISE:10","CALL:10"])
        players[1].set_action(["ALLIN:15"])
        players[2].set_action(["RAISE:20"])
        d.ask_action(players, pot, [], [], range(3),self.INFO)
        eq_(80,  players[0].stack)
        eq_(0,  players[1].stack)
        eq_(30,  players[2].stack)
        eq_(55, pot.chip)

        # preflop case => Do not need to ask BB player if SB player called
        self.INFO.street = GameInfo.PREFLOP
        self.INFO.sb_pos = 0
        pot = Pot()
        players = [MockPlayer(1,"a",100-5),MockPlayer(2,"b",15), MockPlayer(3,"c",50)]
        players[0].set_action(["FOLD:0"])  # SB
        players[1].set_action(["ALLIN:15"])  # BB
        players[2].set_action(["FOLD:0"])
        d.ask_action(players, pot, [], [], [2,0,1],self.INFO)
        eq_(100-5,  players[0].stack)
        eq_(15,  players[1].stack)
예제 #6
0
 def test_legal_action(self):
     d = Dealer()
     player = BasePlayer(1,'a',100)
     pot = Pot()
     pot.add(5) # sb bet
     pot.add(10) # bb bet
     acts = d.get_legal_action(player, pot, 10, 5)
     ok_("FOLD:0" in acts)
     ok_("CALL:5" in acts)
     ok_("RAISE:15:15" in acts)
     pot.add(15) # sb bet
     acts = d.get_legal_action(player, pot, 20, 10)
     ok_("FOLD:0" in acts)
     ok_("CALL:10" in acts)
     ok_("RAISE:20:20" in acts)
     pot.add(20) # bb bet
     acts = d.get_legal_action(player, pot, 30, 20)
     ok_("FOLD:0" in acts)
     ok_("CALL:10" in acts)
     ok_("RAISE:25:25" in acts)
예제 #7
0
 def test_correct_raise_up(self):
     """
     Regression test for raise amount back to $10 after $40
     """
     self.INFO.street = GameInfo.PREFLOP
     self.INFO.sb_pos = 0
     pot = Pot()
     pot.add(5);pot.add(10)
     d = Dealer()
     p1 = MockPlayer(1,"a",1000)
     p2 = MockPlayer(2,"b",1000)
     p3 = MockPlayer(3,"c",1000)
     players = [p1,p2,p3]
     p1.set_action(["RAISE:20","RAISE:35","RAISE:50"])
     p2.set_action(["RAISE:25","RAISE:40","FOLD:0"])
     p3.set_action(["RAISE:15","RAISE:30","RAISE:45","FOLD:0"])
     p1.D = True;p2.D = True;p3.D = True;
     d.ask_action(players, pot, [], [], [2,0,1],self.INFO)
     eq_(1000-105,p1.stack)
     eq_(1000-65,p2.stack)
     eq_(1000-15-30-45,p3.stack)
예제 #8
0
 def test_correct_action(self):
     d = Dealer()
     player = BasePlayer(1,'a',100)
     pot = Pot()
     pot.add(5)  # sb
     pot.add(10)  # bb
     eq_('FOLD:0',d.correct_action(player, 'FOLD:10', pot, 10, 5))
     eq_('CALL:5',d.correct_action(player, 'CALL:5', pot, 10, 5))
     eq_('RAISE:15',d.correct_action(player, 'RAISE:15', pot, 10, 5))
     eq_('FOLD:0',d.correct_action(player, 'CALL:15', pot, 10, 5))
     eq_('FOLD:0',d.correct_action(player, 'RAISE:120', pot, 10, 0))
     pot.add(15)  # sb
     eq_('RAISE:20', d.correct_action(player, 'RAISE:20', pot, 20, 10))
     pot.add(20)  # bb
     eq_('CALL:10', d.correct_action(player, 'CALL:10',pot, 30, 20))
예제 #9
0
파일: table.py 프로젝트: ishikota/pypoker
    def __init__(self):
        self.AUTO = True
        self.players = None
        self.sb_chip = None
        self.sb_pos = None
        self.round_count = 0
        self.retire = []  # who lost all money
        self.deactive = []  # who foled the round
        self.allin = []  # who did all-in in the round

        self.D = Dealer()
        self.E = HandEvaluator()
        self.deck = Deck()
        self.board = Board()
        self.pot = Pot()
예제 #10
0
    def test_check_winner(self):
        d = Dealer()
        board = Board()
        players = [MockPlayer(1,"a",100),MockPlayer(2,"b",15)]

        # Case1
        community = [Card(3,4),Card(5,4),Card(7,2),Card(6,4),Card(10,2)]
        hole1 = [Card(2,4),Card(9,2)] # no pair
        hole2 = [Card(3,4),Card(8,2)] # one pair
        board.addCards(community)
        players[0].setHoleCards(hole1)
        players[1].setHoleCards(hole2)
        deactive = []
        winner, result = d.check_winner(players, deactive, board)
        ok_(len(winner)==1 and winner[0]==players[1])
        print result
        # Case2
        board.reset()
        community = [Card(3,4),Card(3,4),Card(3,2),Card(6,4),Card(10,2)]
        hole1 = [Card(3,4),Card(9,2)] # four card
        hole2 = [Card(4,4),Card(6,2)] # full house
        hole3 = [Card(2,4),Card(8,2)] # three card
        board.addCards(community)
        players.append(MockPlayer(3,"c",200))
        players[0].setHoleCards(hole1)
        players[1].setHoleCards(hole2)
        players[2].setHoleCards(hole3)
        deactive = []
        winner, result = d.check_winner(players, deactive, board)
        ok_(len(winner)==1 and winner[0]==players[0])
        print result

        deactive = [players[0].pid]
        winner, result = d.check_winner(players, deactive, board)
        ok_(len(winner)==1 and winner[0]==players[1])
        print result
예제 #11
0
파일: table.py 프로젝트: ishikota/pypoker
class Table(object):

    def __init__(self):
        self.AUTO = True
        self.players = None
        self.sb_chip = None
        self.sb_pos = None
        self.round_count = 0
        self.retire = []  # who lost all money
        self.deactive = []  # who foled the round
        self.allin = []  # who did all-in in the round

        self.D = Dealer()
        self.E = HandEvaluator()
        self.deck = Deck()
        self.board = Board()
        self.pot = Pot()

    # You need to call this method before start the game.
    def setup(self, players, sb_chip):
        random.shuffle(players)
        self.players = players
        self.sb_pos = len(players)-1   # for init_round
        self.sb_chip = sb_chip
    
    # You need to call this method every time new round starts
    def init_round(self):
        self.round_count += 1
        self.board.reset()
        self.pot.reset()
        self.deck.shuffle(True)
        self.D.deal_card(self.deck, self.players, self.retire)
        self.sb_pos = (self.sb_pos+1)%len(self.players)
        self.allin = []
        self.deactive = []
        self.deactive += self.retire
        info = GameInfo(GameInfo.NEWGAME, self.sb_pos, self.players,\
                self.pot, self.board, self.deactive, [])

        # send new game information to all players
        for player in self.players:
            player.action(info)

    # public method to start the poker game
    def start_game(self, n):
        # Play round n times
        for i in range(n):
            # if one player beats the others then finish the game.
            if len(self.retire)+1 == len(self.players): break
            if not self.AUTO and i != 0: subprocess.call('clear')
            self.init_round()
            ui.round_info(self.round_count, n, self.players, self.sb_pos)
            if not self.AUTO:
                raw_input('> Type any button to start the round...')
            self.play_round()
    
    # play one round
    def play_round(self):
        # start street
        self.preflop()
        if len(self.deactive)+1 != len(self.players): self.street(GameInfo.FLOP)
        if len(self.deactive)+1 != len(self.players): self.street(GameInfo.TURN)
        if len(self.deactive)+1 != len(self.players): self.street(GameInfo.RIVER)
        self.showoff()

        if not self.AUTO:
            print '\n> Enter any input to start next round ...\n'
            raw_input()

    def preflop(self):
        """ Preflop task
            1. collect blind
            2. change order of player (big blind is last player in pre-flop)
            3. ask action to players
        """
        self.D.collect_blind(self.pot, self.players, self.sb_pos, self.sb_chip)
        n = len(self.players)
        order = [(self.sb_pos+2+i)%n for i in range(n)]
        info = GameInfo(GameInfo.PREFLOP, self.sb_pos, self.players, self.pot, self.board, self.deactive, [])
        self.D.ask_action(self.players, self.pot, self.deactive, self.allin, order, info)

    def street(self, street):
        """ FLOP, TURN, RIVER task is almost the same
            1. reset bet (again starts from CHECK:0,FOLD,RAISE:10)
            2. add cards on board
            3. change order of player to sb -> bb -> ...
            4. ask action
        """
        self.pot.reset_bet()
        if street == GameInfo.FLOP:  # draw 3 cards in FLOP
            self.board.addCards(self.deck.drawCards(3))
        else:
            self.board.addCard(self.deck.drawCard())
        if not self.AUTO: self.board.display()

        # the case when left player is allin and call or
        #   the case when all player allin
        if len(self.deactive)+len(self.allin)+1 == len(self.players) or \
                len(self.deactive)+len(self.allin) == len(self.players):
            return

        # ask action to player
        n = len(self.players)
        order = [(self.sb_pos+i)%n for i in range(n)]
        info = GameInfo(street, self.sb_pos, self.players, self.pot, self.board, self.deactive, [])
        self.D.ask_action(self.players, self.pot, self.deactive, self.allin, order, info)

    def showoff(self):
        winner, result = self.D.check_winner(self.players, self.deactive, self.board)
        self.D.money_to_winner(self.pot, self.players, winner, self.allin, self.retire)
        ui.round_result(self.round_count, winner, result)