Example #1
0
 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)
Example #2
0
 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)
Example #3
0
 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)
Example #4
0
 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)
Example #5
0
 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)
Example #6
0
 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)
Example #7
0
 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)
Example #8
0
 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)
Example #9
0
    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()
Example #10
0
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