Ejemplo n.º 1
0
 private void SendBet(ClientGamePhase nextPhase)
 {
     UpdateGameState();
     PrintGameState();
     do
     {
         var nextPlayerToBet = _networkDataService.ReadString();
         if (nextPlayerToBet == _username)
         {
             var bet = GetUserBet();
             _networkDataService.WriteInteger(bet);
         }
         else if (nextPlayerToBet == NetworkConstants.NextPhasePayloadString)
         {
             Console.WriteLine("Going to the " + nextPhase);
             return;
         }
         else
         {
             Console.WriteLine();
             Console.WriteLine($"Waiting on {nextPlayerToBet} to bet");
             Console.WriteLine();
         }
         UpdateGameState();
         if (_gameState.CurrentPhase == nextPhase)
         {
             Console.WriteLine("Going to the " + nextPhase);
             return;
         }
         if (_gameState.CurrentPlayerBets.Count() == 0 || _previousGameState.CurrentPlayerBets.Select(x => x.Value).Sum() != _gameState.CurrentPlayerBets.Select(x => x.Value).Sum() || _previousGameState.CurrentPlayerBets.Count() != _gameState.CurrentPlayerBets.Count())
         {
             PrintGameState();
         }
     } while (true);
 }
Ejemplo n.º 2
0
 private void ReceiveCards(ClientGamePhase currentPhase)
 {
     UpdateGameState();
     if (_gameState.CurrentPhase != currentPhase)
     {
         throw new Exception("Wrong phase?");
     }
 }
Ejemplo n.º 3
0
 private void SendNextPhasePayload(ClientGamePhase currentPhase)
 {
     foreach (var item in _networkDataServices)
     {
         item.WriteString(NetworkConstants.NextPhasePayloadString);
     }
     _gameState.CurrentPlayerBets = _bets.Select(x => new KeyValuePair <string, int>(x.Key.Name, x.Value)).ToArray();
     SendClientsGameState((ClientGamePhase)((int)currentPhase + 1));
 }
Ejemplo n.º 4
0
        private void BettingRound(ClientGamePhase currentPhase)
        {
            if (currentPhase == ClientGamePhase.PreflopBetting)
            {
                SendClientsGameState(currentPhase);
            }

            var activePlayers = _game.ActivePlayers;

            TakeAllBets(ref _bets, ref activePlayers, currentPhase, preflop: currentPhase == ClientGamePhase.PreflopBetting ? true : false);
            _game.Pot          += _bets.Values.Sum();
            _game.ActivePlayers = activePlayers;
        }
Ejemplo n.º 5
0
        private void SendClientsGameState(ClientGamePhase currentPhase)
        {
            _gameState.CurrentPhase = currentPhase;
            if (_game == null)
            {
                _gameState.Players             = null;
                _gameState.ShownCommunityCards = null;
            }
            else
            {
                _gameState.Players             = _game.Players.Select(x => new KeyValuePair <string, int>(x.Name, x.Money)).ToList();
                _gameState.ShownCommunityCards = _game.ShownCommunityCards;
            }


            foreach (var clientHandler in _clients)
            {
                // Send the user their specific data
                if (_game != null)
                {
                    var currentPlayer = _game.Players.First(x => x.Name == clientHandler.Username);

                    _gameState.ClientHand = currentPlayer.Hand;
                    if (_game.ActivePlayers != null)
                    {
                        _gameState.PlayerCurrentSeatPosition = _game.ActivePlayers.IndexOf(currentPlayer);
                    }
                }
                else
                {
                    _gameState.ClientHand = null;
                    _gameState.PlayerCurrentSeatPosition = -1;
                }
                clientHandler.NetworkDataService.WriteObject(_gameState);
            }
        }
Ejemplo n.º 6
0
        private void ShowCards(ClientGamePhase currentRound)
        {
            switch (currentRound)
            {
            case ClientGamePhase.ShowFlop:
                _game.Flop();
                break;

            case ClientGamePhase.ShowTurn:
                _game.Turn();
                break;

            case ClientGamePhase.ShowRiver:
                _game.River();
                break;

            default:
                throw new Exception($"Can't show cards on that game phase: ({currentRound.ToString()})");
            }
            // TODO: Refactor this, copy pasted from client code
            Console.WriteLine("Community Cards: " + string.Join(' ', _game.ShownCommunityCards));
            ResetBets();
            SendClientsGameState(currentRound);
        }
Ejemplo n.º 7
0
 public void Write(ClientGamePhase input)
 {
     ConsoleService.LogDebug($"Writing GamePhase ({input.ToString()})");
     _binaryWriter.Write((int)input);
 }
Ejemplo n.º 8
0
        private bool TakeBet(ref List <Player> players, int i, ref Dictionary <Player, int> bets, ClientGamePhase currentGamePhase)
        {
            if (i >= players.Count)
            {
                i %= players.Count;
            }

            var currentPlayer = players[i];

            // TODO: Check this
            var isCurrentPlayerBigBlind = i == (2 < players.Count ? 2 : 0);

            bool alreadyBet = false;

            // Check if all bets are the same
            if (bets.ContainsKey(currentPlayer))
            {
                if (AllBetsMatchingValue(bets) && bets.Count() == _game.ActivePlayers.Count())
                {
                    if (currentGamePhase == ClientGamePhase.PreflopBetting)
                    {
                        if (!isCurrentPlayerBigBlind || (isCurrentPlayerBigBlind && bets[currentPlayer] != 2))
                        {
                            return(true);
                        }
                    }
                    else
                    {
                        return(true);
                    }
                }
                alreadyBet = true;
            }

            foreach (var networkDataService in _networkDataServices)
            {
                networkDataService.WriteString(currentPlayer.Name);
            }

            int bet = PokerConstants.YetToBet;

            if (alreadyBet)
            {
                bet = bets[currentPlayer];
            }


            var receivedBet = _clients.First(x => x.Username == currentPlayer.Name).NetworkDataService.ReadInteger();

            if (receivedBet > currentPlayer.Money)
            {
                // TODO: ERROR
                throw new Exception("A player tried to bet more than they have");
            }

            if (receivedBet != PokerConstants.Fold)
            {
                // Increase bet or set bet
                if (alreadyBet)
                {
                    if (bet != PokerConstants.Fold)
                    {
                        // Temporarily refund the player, to deduct the total later
                        currentPlayer.GiveMoney(bet);
                        bet += receivedBet;
                    }
                    else
                    {
                        throw new Exception("Cannot bet after folding");
                    }
                }
                else
                {
                    bet = receivedBet;
                }
            }
            else
            {
                Console.WriteLine($"{currentPlayer} folded");
                // Player folded
                players.Remove(currentPlayer);
                return(false);
            }

            if (alreadyBet)
            {
                bets[currentPlayer] = bet;
            }
            else
            {
                bets.Add(currentPlayer, bet);
            }

            if (bet != PokerConstants.YetToBet)
            {
                Console.WriteLine($"{currentPlayer} bet ${bet}");
                currentPlayer.SubtractBet(bet);
            }
            return(false);
        }
Ejemplo n.º 9
0
        private void TakeAllBets(ref Dictionary <Player, int> bets, ref List <Player> players, ClientGamePhase currentPhase, bool preflop = false)
        {
            var startPlayer = preflop ? PokerConstants.UTGPosition : PokerConstants.SmallBlindPosition;

            if (players.Count == 2)
            {
                startPlayer = PokerConstants.SmallBlind;
            }

            do
            {
                for (var i = startPlayer; i < players.Count; i++)
                {
                    if (TakeBet(ref players, i, ref bets, currentPhase) && !bets.Any(x => x.Value == PokerConstants.YetToBet) && AllBetsMatchingValue(bets) && bets.Count() == _game.ActivePlayers.Count())
                    {
                        SendNextPhasePayload(currentPhase);

                        return;
                    }
                    _gameState.CurrentPlayerBets = _bets.Select(x => new KeyValuePair <string, int>(x.Key.Name, x.Value)).ToArray();
                    SendClientsGameState(currentPhase);
                }

                for (var i = 0; i < startPlayer && i < players.Count; i++)
                {
                    if (TakeBet(ref players, i, ref bets, currentPhase) && !bets.Any(x => x.Value == PokerConstants.YetToBet) && AllBetsMatchingValue(bets) && bets.Count() == _game.ActivePlayers.Count())
                    {
                        SendNextPhasePayload(currentPhase);
                        return;
                    }
                    _gameState.CurrentPlayerBets = _bets.Select(x => new KeyValuePair <string, int>(x.Key.Name, x.Value)).ToArray();
                    SendClientsGameState(currentPhase);
                }
            } while (true);
        }