fix detection of round completion when players are all-in
authorGeoffrey Allott <geoffrey@allott.email>
Thu, 4 Mar 2021 18:23:45 +0000 (18:23 +0000)
committerGeoffrey Allott <geoffrey@allott.email>
Thu, 4 Mar 2021 18:23:45 +0000 (18:23 +0000)
src/game/poker/holdem.rs

index 139f82e723b006072da19e5821b7e5e8205b28fa..9814972b60690df593d561ed379ad6b13184dc62 100644 (file)
@@ -171,6 +171,7 @@ impl TexasHoldEm {
             }
         }
         self.all_bets_are_in() && self.all_bets_are_equal()
+            || self.players_able_to_bet() <= 1 && self.bets.len() == 0
     }
 }
 
@@ -349,7 +350,11 @@ impl Game for TexasHoldEm {
                 self.community.insert(card);
                 self.deck.remove(&card);
                 if self.community.len() == 3 {
-                    self.active = self.seats.player_after_where(username, |username| self.is_able_to_bet(username));
+                    self.active = if self.betting_round_completed() {
+                        None
+                    } else {
+                        self.seats.player_after_where(username, |username| self.is_able_to_bet(username))
+                    };
                     self.state = match self.active {
                         Some(_) => State::PostFlopBetting,
                         None => State::DealingTurn,
@@ -360,7 +365,11 @@ impl Game for TexasHoldEm {
             (State::DealingTurn, Action::CommunityCard{card}) => {
                 self.community.insert(card);
                 self.deck.remove(&card);
-                self.active = self.seats.player_after_where(username, |username| self.is_able_to_bet(username));
+                self.active = if self.betting_round_completed() {
+                    None
+                } else {
+                    self.seats.player_after_where(username, |username| self.is_able_to_bet(username))
+                };
                 self.state = match self.active {
                     Some(_) => State::TurnBetting,
                     None => State::DealingRiver,
@@ -370,7 +379,11 @@ impl Game for TexasHoldEm {
             (State::DealingRiver, Action::CommunityCard{card}) => {
                 self.community.insert(card);
                 self.deck.remove(&card);
-                self.active = self.seats.player_after_where(username, |username| self.is_able_to_bet(username));
+                self.active = if self.betting_round_completed() {
+                    None
+                } else {
+                    self.seats.player_after_where(username, |username| self.is_able_to_bet(username))
+                };
                 self.state = match self.active {
                     Some(_) => State::RiverBetting,
                     None => State::Showdown,
@@ -842,4 +855,50 @@ mod tests {
 
         test_game(actions, settings, seed);
     }
+
+    #[test]
+    fn deals_cards_to_completion_when_all_in() {
+        let actions = r#"[
+            {"timestamp":1614881204492,"username":"geoff","action":{"action":"Join","seat":0,"chips":1000}},
+            {"timestamp":1614881208123,"username":"kat","action":{"action":"Join","seat":1,"chips":1000}},
+            {"timestamp":1614881208131,"username":"kat","action":{"action":"NextToDeal"}},
+            {"timestamp":1614881208139,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Five","suit":"Diamonds"}}},
+            {"timestamp":1614881208147,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Six","suit":"Diamonds"}}},
+            {"timestamp":1614881208163,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Hearts"}}},
+            {"timestamp":1614881208185,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Clubs"}}},
+            {"timestamp":1614881208201,"username":"kat","action":{"action":"EndDeal"}},
+            {"timestamp":1614881208214,"username":"kat","action":{"action":"PostBlind","chips":100}},
+            {"timestamp":1614881208222,"username":"geoff","action":{"action":"PostBlind","chips":200}},
+            {"timestamp":1614881226321,"username":"kat","action":{"action":"Bet","chips":300}},
+            {"timestamp":1614881227926,"username":"geoff","action":{"action":"Fold"}},
+            {"timestamp":1614881227932,"username":"kat","action":{"action":"WinHand","chips":600,"hand":null}},
+            {"timestamp":1614881227938,"username":"geoff","action":{"action":"NextToDeal"}},
+            {"timestamp":1614881227944,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Jack","suit":"Diamonds"}}},
+            {"timestamp":1614881227949,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"King","suit":"Clubs"}}},
+            {"timestamp":1614881227957,"username":"kat","action":{"action":"ReceiveCard","card":{"rank":"Ace","suit":"Diamonds"}}},
+            {"timestamp":1614881227969,"username":"geoff","action":{"action":"ReceiveCard","card":{"rank":"Ten","suit":"Hearts"}}},
+            {"timestamp":1614881227980,"username":"geoff","action":{"action":"EndDeal"}},
+            {"timestamp":1614881227991,"username":"geoff","action":{"action":"PostBlind","chips":100}},
+            {"timestamp":1614881228000,"username":"kat","action":{"action":"PostBlind","chips":200}},
+            {"timestamp":1614881234665,"username":"geoff","action":{"action":"Bet","chips":700}},
+            {"timestamp":1614881236125,"username":"kat","action":{"action":"Bet","chips":600}},
+            {"timestamp":1614881236132,"username":"geoff","action":{"action":"CommunityCard","card":{"rank":"Ace","suit":"Clubs"}}},
+            {"timestamp":1614881236136,"username":"geoff","action":{"action":"CommunityCard","card":{"rank":"Eight","suit":"Spades"}}},
+            {"timestamp":1614881236141,"username":"geoff","action":{"action":"CommunityCard","card":{"rank":"Jack","suit":"Clubs"}}},
+            {"timestamp":1614881241470,"username":"geoff","action":{"action":"CommunityCard","card":{"rank":"Seven","suit":"Clubs"}}},
+            {"timestamp":1614881244838,"username":"geoff","action":{"action":"CommunityCard","card":{"rank":"Five","suit":"Spades"}}},
+            {"timestamp":1614881247469,"username":"kat","action":{"action":"WinHand","chips":1600,"hand":"Two Pair, As & Js, 8 Kicker"}},
+            {"timestamp":1614881247477,"username":"geoff","action":{"action":"KnockedOut"}},
+            {"timestamp":1614881247480,"username":"kat","action":{"action":"WinGame"}}
+        ]"#;
+        let actions = serde_json::from_str(actions).unwrap();
+
+        let settings = r#"{"title":"2-Player TexasHoldEm Test","max_players":2,"small_blind":100,"starting_stack":1000,"action_timeout":null}"#;
+        let settings = serde_json::from_str(settings).unwrap();
+
+        let seed = r#"{"rng":"ChaCha20","seed":"8de0ac3be302e26cbc0a371044c8b349107108abb1f94a10fe84ba04a59d7f31"}"#;
+        let seed = serde_json::from_str(seed).unwrap();
+
+        test_game(actions, settings, seed);
+    }
 }