def test_two_pair(self): ranker = HandRanker() cards = [ Card('S', 13), Card('H', 13), Card('D', 12), Card('C', 9), Card('S', 9) ] hand = Hand(cards) self.assertEqual(ranker.rank(hand), Rank.TWO_PAIR)
def test_straight(self): ranker = HandRanker() cards = [ Card('D', 13), Card('H', 12), Card('C', 11), Card('C', 10), Card('S', 9) ] hand = Hand(cards) self.assertEqual(ranker.rank(hand), Rank.STRAIGHT)
def test_three_of_a_kind(self): ranker = HandRanker() cards = [ Card('S', 13), Card('H', 13), Card('D', 13), Card('C', 11), Card('S', 9) ] hand = Hand(cards) self.assertEqual(ranker.rank(hand), Rank.THREE_OF_A_KIND)
def test_royal_flush(self): ranker = HandRanker() cards = [ Card('S', 14), Card('S', 13), Card('S', 12), Card('S', 11), Card('S', 10) ] hand = Hand(cards) self.assertEqual(ranker.rank(hand), Rank.ROYAL_FLUSH)
def test_flush(self): ranker = HandRanker() cards = [ Card('S', 13), Card('S', 12), Card('S', 11), Card('S', 3), Card('S', 9) ] hand = Hand(cards) self.assertEqual(ranker.rank(hand), Rank.FLUSH)
def test_full_house(self): ranker = HandRanker() cards = [ Card('S', 13), Card('H', 13), Card('D', 13), Card('C', 9), Card('S', 9) ] hand = Hand(cards) self.assertEqual(ranker.rank(hand), Rank.FULL_HOUSE)
def test_four_of_a_kind(self): ranker = HandRanker() cards = [ Card('S', 13), Card('H', 13), Card('D', 13), Card('C', 13), Card('S', 9) ] hand = Hand(cards) self.assertEqual(ranker.rank(hand), Rank.FOUR_OF_A_KIND)
def test_high_card(self): ranker = HandRanker() cards = [ Card('S', 13), Card('H', 11), Card('D', 3), Card('C', 10), Card('S', 9) ] hand = Hand(cards) self.assertEqual(ranker.rank(hand), Rank.HIGH_CARD)
class Game: def __init__(self, players, event_stream): self.state = GameStates.BEGIN if len(players) < 2: raise Error("") self.players = players self.event_stream = event_stream self.transition = { GameStates.BEGIN: GameStates.START_ROUND, GameStates.START_ROUND: GameStates.DEALING, GameStates.DEALING: GameStates.FIRST_BET, GameStates.FIRST_BET: GameStates.FLOP, GameStates.FLOP: GameStates.SECOND_BET, GameStates.SECOND_BET: GameStates.RIVER, GameStates.RIVER: GameStates.THIRD_BET, GameStates.THIRD_BET: GameStates.TURN, GameStates.TURN: GameStates.LAST_BET, GameStates.LAST_BET: GameStates.END_ROUND, GameStates.END_ROUND: GameStates.START_ROUND } self.state_action = { GameStates.START_ROUND: self.start_round, GameStates.DEALING: self.deal, GameStates.FIRST_BET: self.first_bet, GameStates.FLOP: self.flop, GameStates.SECOND_BET: self.second_bet, GameStates.RIVER: self.river, GameStates.THIRD_BET: self.third_bet, GameStates.TURN: self.turn, GameStates.LAST_BET: self.last_bet, GameStates.END_ROUND: self.end_round, GameStates.DONE: self.end_game } self.player_turn = self.players[0] self.player_consensus = 0 self.pot = 0 self.hand_ranker = HandRanker() def add_player(self, player): self.players.append(player) def run(self): self.event_stream.subscribe(self) self.state = GameStates.START_ROUND def on_event(self, event): try: self.process(event['command'], event['player']) if self.player_consensus == len(self.players_in_round): self.next_state() self.player_consensus = 0 print(player.cash) except: raise Error("something went wrong") def process(self, command, player): if player is not self.player_turn: raise Error("Not your turn!") self.pot += command.execute(player) if command.name == 'fold': self.players_in_round.remove(player) self.player_pool = cycle(self.players_in_round) else: if command.name not in [ 'raise', 'bet' ]: self.player_consensus += 1 else: self.player_consensus = 1 def next_state(self): self.state = self.transition[self.state] print(self.state) def next_turn(self): self.player_turn = next(self.player_pool) def start_round(self): self.deck = Deck() self.deck.shuffle() for player in self.players: player.hand = Hand([]) self.players_in_round = self.players self.player_pool = cycle(self.players) self.pot = 0 self.next_state() def deal(self): self.deck.deal(self.players) self.next_state() def first_bet(self): pass def flop(self): self.deck.flop(self.players) self.next_state() def second_bet(self): pass def river(self): self.deck.river(self.players) self.next_state() def third_bet(self): pass def turn(self): self.deck.turn(self.players) self.next_state() def last_bet(self): pass def end_round(self): min_rank = float('inf') min_rank_players = [] for player in self.players_in_round: rank, hand = self.hand_ranker.rank(player.hand) player.hand = hand if rank == min_rank: min_rank_players.append(player) if rank < min_rank: min_rank = rank min_rank_players = [ player ] winner = None if len(min_rank_players) > 1: winner = self.hand_ranker.tiebrake([ p.hand for p in min_rank_players ]) else: winner = min_rank_players[0] self.next_state() print("Winner is {}, with a pot of {}!!".format(winner.name, self.pot)) winner.update_cash(self.pot) def end_game(self): pass