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