private int GetPlayersSeatNumber(Player player, PlayerList players, int tableSize) { if (players.Count > tableSize) { throw new ArgumentException(String.Format("GetPlayersSeatNumber: players amount can't be higher than table size"), "tableSize"); } bool anyZeroSeat = players.Any(x => x.SeatNumber == 0); int maxSeat = players.Max(x => x.SeatNumber); /* There shouldn't be players with Seat Number equals to 0 */ if (!anyZeroSeat && (maxSeat <= tableSize)) { return(player.SeatNumber - 1); } /* In case we have Seat Number equals to 0 */ else if (anyZeroSeat && maxSeat < tableSize) { return(player.SeatNumber); } return(players.OrderBy(x => x.SeatNumber).ToList().IndexOf(player)); }
public static IEnumerable<HandAction> Player(this IEnumerable<HandAction> actions, Player action) { return actions.Where(p => p.PlayerName == action.PlayerName); }
private void ParseDealtHand(string[] handLines, int currentLine, Player player) { const int maxCards = 4; for (int i = 1; i <= maxCards; i++) { string Line = handLines[currentLine + i]; if (Line[1] != 'C') { break; } Card parsedCard = ParseCard(Line); if (!parsedCard.isEmpty) { if (player.HoleCards == null) { player.HoleCards = HoleCards.NoHolecards(); } player.HoleCards.AddCard(parsedCard); } } }
private Player GetPlayerBySeatId(PlayerList playerList, int seatId) { Player matchingPlayer = playerList.FirstOrDefault(player => player.SeatNumber == seatId); //Special case for handling actions without players attached to them if (seatId == -1) { matchingPlayer = new Player("", 0, -1); } else if (matchingPlayer == null) { throw new Exception(string.Format("No player corresponding with seatId {0}", seatId)); } return matchingPlayer; }
protected override PlayerList ParsePlayers(string[] handLines) { XDocument document = GetXDocumentFromLines(handLines); XElement gameElement = GetGameElementFromXDocument(document); XElement players = gameElement.Element("players"); PlayerList playerList = new PlayerList(); //Build a query for all cards elements which are "SHOWN" or "MUCKED" rather than "COMMUNITY" IEnumerable<XElement> cardElements = gameElement.Elements("round").Elements("cards").Where(element => !element.Attribute("type").Value.StartsWith("C")).ToList(); foreach (XElement playerElement in players.Elements()) { //Player Element looks like: //<player seat="0" nickname="GODEXISTSJK" balance="$269.96" dealtin="true" /> decimal stack = decimal.Parse(playerElement.Attribute("balance").Value.Substring(1), DecimalSeperator); string playerName = playerElement.Attribute("nickname").Value; int seat = Int32.Parse(playerElement.Attribute("seat").Value); Player player = new Player(playerName, stack, seat); bool dealtIn = bool.Parse(playerElement.Attribute("dealtin").Value); player.IsSittingOut = !dealtIn; //<cards type="SHOWN" cards="Ac,4c" player="7"/> XElement playerCardElement = cardElements.FirstOrDefault(card => Int32.Parse(card.Attribute("player").Value) == seat); if (playerCardElement != null) { string cardString = playerCardElement.Attribute("cards").Value; player.HoleCards.AddCards(BoardCards.Parse(cardString)); } playerList.Add(player); } return playerList; }
private void UpdatePlayersEquityWin(ReplayerTableState state) { if (state == null) { return; } //preparing for formula Card on the Board in dependence of street in current state switch (state.CurrentAction.Street) { case Street.Preflop: CurrentBoard = new Card[] { }; CurrentBoardCards = string.Empty; break; case Street.Flop: CurrentBoard = CurrentGame.CommunityCards.Take(3).ToArray(); CurrentBoardCards = new string(CurrentGame.CommunityCardsString.Take(6).ToArray()); break; case Street.Turn: CurrentBoard = CurrentGame.CommunityCards.Take(4).ToArray(); CurrentBoardCards = new string(CurrentGame.CommunityCardsString.Take(8).ToArray()); break; case Street.River: CurrentBoard = CurrentGame.CommunityCards.ToArray(); CurrentBoardCards = CurrentGame.CommunityCardsString; break; case Street.Showdown: CurrentBoard = CurrentGame.CommunityCards.ToArray(); CurrentBoardCards = CurrentGame.CommunityCardsString; break; case Street.Summary: CurrentBoard = CurrentGame.CommunityCards.ToArray(); CurrentBoardCards = CurrentGame.CommunityCardsString; break; } // finding all players having hole cards ActivePlayerHasHoleCard = CurrentGame.Players.Where(pl => pl.hasHoleCards).ToList(); // searching for dead cards and removing this player from list of ActivePlayerHasHoleCard ActivePlayerHasHoleCardFolded = new List <Player>(); AllDeadCards.Clear(); foreach (ReplayerTableState replayerTableState in TableStateList) { Player playerInTableState = CurrentGame.Players.FirstOrDefault(x => x.PlayerName == replayerTableState.CurrentAction.PlayerName); if (playerInTableState != null && TableStateList.IndexOf(replayerTableState) <= TableStateList.IndexOf(state) && replayerTableState.CurrentAction.IsFold && playerInTableState.hasHoleCards) { ActivePlayerHasHoleCardFolded.Add(playerInTableState); ActivePlayerHasHoleCard.Remove(playerInTableState); AllDeadCards.Add(playerInTableState.HoleCards); AllDeadCardsString += playerInTableState.Cards; } } var equitySolver = ServiceLocator.Current.GetInstance <IEquitySolver>(); var gameType = new GeneralGameTypeEnum().ParseGameType(CurrentGame.GameDescription.GameType); var isShortDeck = CurrentGame.GameDescription.TableTypeDescriptors.Contains(HandHistories.Objects.GameDescription.TableTypeDescription.ShortDeck); var equitySolverParams = new EquitySolverParams { PlayersCards = ActivePlayerHasHoleCard.Select(x => x.HoleCards).ToArray(), BoardCards = CurrentBoard, Dead = isShortDeck ? AllDeadCards .Distinct(new LambdaComparer <HoleCards>((x, y) => x.ToString().Equals(y.ToString()))) .SelectMany(x => x) .Concat(CardGroup.GetDeadCardsForHoldem6Plus()) .ToArray() : AllDeadCards .Distinct(new LambdaComparer <HoleCards>((x, y) => x.ToString().Equals(y.ToString()))) .SelectMany(x => x) .ToArray(), GameType = gameType }; var equities = equitySolver.CalculateEquity(equitySolverParams) .Select(x => Math.Round((decimal)x.Equity * 100, 2)) .ToArray(); // updating states in replayer view if (equities != null) { RefreshBoard(equities, state.CurrentStreet); } //case of last state. Needed for All-in before River for some cases if (TableStateList.IndexOf(state) + 1 == TableStateList.Count && equities != null) { // updating states in replayer view RefreshBoard(equities, Street.Preflop); } }