Пример #1
0
        public bool Analyze(BoardCards boardCards, BoardTextureItem boardTexture)
        {
            if (!CardHelper.IsStreetAvailable(boardCards.ToString(), boardTexture.TargetStreet) || !(boardTexture is HighCardBoardTextureItem))
            {
                return(false);
            }

            var highCardItem = boardTexture as HighCardBoardTextureItem;
            var board        = boardCards.GetBoardOnStreet(highCardItem.TargetStreet);

            return(board.Aggregate((i1, i2) => i1.RankNumericValue > i2.RankNumericValue ? i1 : i2).Rank == highCardItem.SelectedRank);
        }
Пример #2
0
        public bool Analyze(BoardCards boardCards, BoardTextureItem boardTexture)
        {
            if (!CardHelper.IsStreetAvailable(boardCards.ToString(), boardTexture.TargetStreet))
            {
                return(false);
            }

            var board    = boardCards.GetBoardOnStreet(boardTexture.TargetStreet);
            var lastCard = board.Last();

            return(board.Take(board.Count - 1).GroupBy(x => x.Rank).All(x => x.Count() == 1) && board.Take(board.Count - 1).Any(x => x.Rank == lastCard.Rank));
        }
        public bool Analyze(BoardCards boardCards, BoardTextureItem boardTexture)
        {
            var boardTextureItem = boardTexture as StraightBoardTextureItem;

            if (boardTextureItem == null || !CardHelper.IsStreetAvailable(boardCards.ToString(), boardTextureItem.TargetStreet))
            {
                return(false);
            }

            int numberOfOpenEndedStraights = 0;

            var orderedRanks = BoardTextureAnalyzerHelpers.GetOrderedBoardNumericRanks(boardCards, boardTextureItem);

            if (orderedRanks.Count < 2)
            {
                return(false);
            }

            int firstRank = orderedRanks.Max() + 2;

            while (firstRank > orderedRanks.Min() - 2)
            {
                firstRank = BoardTextureAnalyzerHelpers.GetHighestUniqueRankNumberForList(orderedRanks, firstRank);
                var secondRank = BoardTextureAnalyzerHelpers.GetHighestUniqueRankNumberForList(orderedRanks, firstRank - 1);
                if (secondRank <= 0)
                {
                    break;
                }

                var connectedList = new List <int>(orderedRanks);
                connectedList.Add(secondRank);
                connectedList = HandAnalyzerHelpers.GetConnectedCards(firstRank, connectedList);

                if (connectedList.Count > 4)
                {
                    numberOfOpenEndedStraights += HandAnalyzerHelpers.IsStraight(connectedList.OrderByDescending(x => x).Take(5)) ? 1 : 0;
                }
                firstRank--;
            }

            return(BoardTextureAnalyzerHelpers.CheckEquality(boardTextureItem.SelectedSign.Key, numberOfOpenEndedStraights, boardTextureItem.SelectedNumber));
        }
Пример #4
0
        public bool Analyze(BoardCards boardCards, BoardTextureItem boardTexture)
        {
            if (!CardHelper.IsStreetAvailable(boardCards.ToString(), boardTexture.TargetStreet))
            {
                return(false);
            }

            var board         = boardCards.GetBoardOnStreet(boardTexture.TargetStreet);
            var lastCard      = board.Last();
            var grouppedBoard = board.Take(board.Count - 1).GroupBy(x => x.Rank);

            if (grouppedBoard.Count(x => x.Count() > 1) > 1)
            {
                return(false);
            }
            var pair = grouppedBoard.FirstOrDefault(x => x.Count() == 2);

            if (pair == null || pair.Key == lastCard.Rank)
            {
                return(false);
            }

            return(board.Take(board.Count - 1).Any(x => x.Rank == lastCard.Rank));
        }
        public bool Analyze(BoardCards boardCards, BoardTextureItem boardTexture)
        {
            if (!CardHelper.IsStreetAvailable(boardCards.ToString(), boardTexture.TargetStreet))
            {
                return(false);
            }

            var board        = boardCards.GetBoardOnStreet(boardTexture.TargetStreet).OrderBy(x => x.RankNumericValue).ToList();
            var orderedRanks = board.Select(x => x.RankNumericValue).ToList();

            if (board.Any(x => x.RankNumericValue == Cards.Card.GetRankNumericValue("A")) &&
                board.Any(x => x.RankNumericValue == Cards.Card.GetRankNumericValue("2")))
            {
                orderedRanks.Insert(0, 1);
            }

            int count = 0;

            for (int i = 1; i < orderedRanks.Count; i++)
            {
                if (Math.Abs(orderedRanks[i - 1] - orderedRanks[i]) == 1)
                {
                    count++;
                }
                else if (count == 3)
                {
                    return(true);
                }
                else
                {
                    count = 0;
                }
            }

            return(count == 3);
        }
Пример #6
0
        /// <summary>
        /// Calculates Holdem equity for the specified players which last action was at the specified street
        /// </summary>
        /// <param name="players">Player to calculate equity</param>
        /// <param name="street">Street</param>
        /// <param name="boardCards">Board cards</param>
        private void CalculateHoldemEquity(List <EquityPlayer> players, Street street, BoardCards boardCards, HandHistories.Objects.Cards.Card[] dead, int potIndex)
        {
            var wins   = new long[players.Count];
            var losses = new long[players.Count];
            var ties   = new long[players.Count];

            long totalhands = 0;

            var deadCards = string.Join(string.Empty, dead.Select(x => x.ToString()));

            Hand.HandWinOdds(players.Select(x => x.HoleCards.ToString()).ToArray(), boardCards.ToString(), deadCards, wins, ties, losses, ref totalhands);

            if (totalhands == 0)
            {
                return;
            }

            var playersOdds = new List <PlayerOdds>();

            for (var i = 0; i < wins.Length; i++)
            {
                var playerOdds = new PlayerOdds
                {
                    PlayerName = players[i].Name,
                    Wins       = wins[i],
                    Ties       = ties[i]
                };

                playersOdds.Add(playerOdds);
            }

            var allInEquity = CalculateEquity(playersOdds, totalhands);

            players.Where(p => allInEquity.ContainsKey(p.Name))
            .ForEach(p => p.Equity[potIndex] = allInEquity[p.Name]);
        }
        public bool Analyze(BoardCards boardCards, BoardTextureItem boardTexture)
        {
            var boardTextureItem = boardTexture as StraightBoardTextureItem;

            if (boardTextureItem == null || !CardHelper.IsStreetAvailable(boardCards.ToString(), boardTextureItem.TargetStreet))
            {
                return(false);
            }

            int numberOfOpenEndedStraights = 0;

            var orderedRanks = BoardTextureAnalyzerHelpers.GetOrderedBoardNumericRanks(boardCards, boardTextureItem);

            if (orderedRanks.Count < 2)
            {
                return(false);
            }

            int nutRank = GetNutHighCard(orderedRanks);

            if (nutRank <= 0)
            {
                return(false);
            }

            int firstRank  = orderedRanks.Max() + 3;
            int secondRank = firstRank - 1;

            while (firstRank > nutRank)
            {
                firstRank  = BoardTextureAnalyzerHelpers.GetHighestUniqueRankNumberForList(orderedRanks, firstRank);
                secondRank = BoardTextureAnalyzerHelpers.GetHighestUniqueRankNumberForList(orderedRanks, secondRank);

                if (firstRank == secondRank)
                {
                    secondRank = BoardTextureAnalyzerHelpers.GetHighestUniqueRankNumberForList(orderedRanks, secondRank - 1);
                }

                if (secondRank <= 0 || secondRank < orderedRanks.Min() - 3)
                {
                    firstRank--;
                    secondRank = firstRank;
                    continue;
                }

                var tempList = new List <int>(orderedRanks);
                tempList.Add(firstRank);
                tempList.Add(secondRank);
                tempList = tempList.Where(x => x <= firstRank).ToList();
                if (tempList.Count > 3)
                {
                    var hand      = tempList.OrderByDescending(x => x).Take(4);
                    var isGutShot = hand.Max() - hand.Min() == 4;
                    if (isGutShot)
                    {
                        numberOfOpenEndedStraights++;
                    }
                }
                secondRank--;
            }

            return(BoardTextureAnalyzerHelpers.CheckEquality(boardTextureItem.SelectedSign.Key, numberOfOpenEndedStraights, boardTextureItem.SelectedNumber));
        }
        public bool Analyze(BoardCards boardCards, BoardTextureItem boardTexture)
        {
            var boardTextureItem = boardTexture as StraightBoardTextureItem;

            if (boardTextureItem == null || !CardHelper.IsStreetAvailable(boardCards.ToString(), boardTextureItem.TargetStreet))
            {
                return(false);
            }

            int numberOfOpenEndedStraights = 0;

            var orderedRanks = BoardTextureAnalyzerHelpers.GetOrderedBoardNumericRanks(boardCards, boardTextureItem);

            if (orderedRanks.Count < 2)
            {
                return(false);
            }

            int  firstRank     = BoardTextureAnalyzerHelpers.GetHighestUniqueRankNumberForList(orderedRanks, orderedRanks.Max() + 2);
            int  initFirstRank = firstRank;
            int  nutRank       = 0;
            bool isNutFound    = false;

            while (firstRank > orderedRanks.Min() - 2)
            {
                firstRank = BoardTextureAnalyzerHelpers.GetHighestUniqueRankNumberForList(orderedRanks, firstRank);
                if (isNutFound && firstRank <= nutRank)
                {
                    break;
                }

                var secondRank = BoardTextureAnalyzerHelpers.GetHighestUniqueRankNumberForList(orderedRanks, firstRank - 1);
                if (secondRank <= 0)
                {
                    break;
                }

                var connectedList = new List <int>(orderedRanks);
                connectedList.Add(secondRank);
                connectedList = HandAnalyzerHelpers.GetConnectedCards(firstRank, connectedList);

                if (connectedList.Count > (isNutFound ? 3 : 4))
                {
                    var  hand       = connectedList.OrderByDescending(x => x).Take(isNutFound ? 4 : 5);
                    bool isStraight = HandAnalyzerHelpers.IsStraight(hand);
                    if (isStraight)
                    {
                        if (!isNutFound)
                        {
                            isNutFound = true;
                            firstRank  = initFirstRank;
                            nutRank    = hand.Max();
                            continue;
                        }
                        else
                        {
                            numberOfOpenEndedStraights++;
                        }
                    }
                }
                firstRank--;
            }

            return(BoardTextureAnalyzerHelpers.CheckEquality(boardTextureItem.SelectedSign.Key, numberOfOpenEndedStraights, boardTextureItem.SelectedNumber));
        }
Пример #9
0
        public IAnalyzer Analyze(IEnumerable <HandHistories.Objects.Cards.Card> playerCards, BoardCards boardCards)
        {
            try
            {
                IAnalyzer result = null;

                var highestHand = CardHelper.FindBestHand(string.Join("", playerCards.Select(c => c.CardStringValue)), boardCards.ToString());

                var analyzers = ReferenceEquals(highestHand, null) ? _combinations : _combinations.Where(x => x.IsValidAnalyzer(highestHand)).ToArray();

                if (playerCards.Count() > 2 && !string.IsNullOrEmpty(highestHand.PocketCards))
                {
                    result = analyzers.FirstOrDefault(combination => combination.Analyze(CardGroup.Parse(highestHand.PocketCards), boardCards)) ?? new StubAnalyzer();
                }
                else
                {
                    result = analyzers.FirstOrDefault(combination => combination.Analyze(playerCards, boardCards)) ?? new StubAnalyzer();
                }

                return(result);
            }
            catch (Exception ex)
            {
                LogProvider.Log.Error(this, String.Format("Hand Analyzer Error occurred: Player cards = {0}; Board Cards = {1}", string.Join("", playerCards.Select(c => c.CardStringValue)), boardCards.ToString()), ex);
            }

            return(new StubAnalyzer());
        }
Пример #10
0
        public bool Analyze(IEnumerable <HandHistories.Objects.Cards.Card> playerCards, BoardCards boardCards)
        {
            if (playerCards == null || boardCards == null || playerCards.Count() != 2 || boardCards.Count() == 0)
            {
                return(false);
            }

            HoldemHand.Hand hand = new HoldemHand.Hand(string.Join("", playerCards.Select(c => c.CardStringValue)), boardCards.ToString());

            if (hand.HandTypeValue > HoldemHand.Hand.HandTypes.Pair)
            {
                return(true);
            }

            if (hand.HandTypeValue == HoldemHand.Hand.HandTypes.Pair)
            {
                return(playerCards.Any(x => x.RankNumericValue == boardCards.Max(b => b.RankNumericValue)));
            }

            return(false);
        }