예제 #1
0
        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;
        }
예제 #6
0
        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);
            }
        }