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); }
private void ReceiveCards(ClientGamePhase currentPhase) { UpdateGameState(); if (_gameState.CurrentPhase != currentPhase) { throw new Exception("Wrong phase?"); } }
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)); }
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; }
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); } }
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); }
public void Write(ClientGamePhase input) { ConsoleService.LogDebug($"Writing GamePhase ({input.ToString()})"); _binaryWriter.Write((int)input); }
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); }
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); }