public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (boardCards == null || boardCards.Count != 5)
            {
                return(false);
            }

            if (HandAnalyzerHelpers.IsStraight(boardCards, true))
            {
                if (boardCards.Any(x => x.Rank == (int)DataTypes.Card.GetCardRank("A")) &&
                    boardCards.Any(x => x.Rank == (int)DataTypes.Card.GetCardRank("2")))
                {
                    return(!playerCards.Any(x => x.Rank == (boardCards
                                                            .Where(b => b.Rank != (int)DataTypes.Card.GetCardRank("A"))
                                                            .Max(m => m.Rank) + 1)));
                }
                else
                {
                    return(playerCards.All(x => x.Rank != boardCards.Max(m => m.Rank) + 1));
                }
            }

            return(false);
        }
예제 #2
0
        public virtual bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allboardCards, Street targetStreet)
        {
            //retain only that card that we need for flop, turn or river calculations
            var boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allboardCards, targetStreet);

            if (playerCards == null || boardCards == null || playerCards.Count != 2 || boardCards.Count < 3)
            {
                return(false);
            }

            var allCards = boardCards.ToList();

            allCards.AddRange(playerCards);

            if (!HandAnalyzerHelpers.HasPair(allCards, 1) && !HandAnalyzerHelpers.HasPair(allCards, 2) &&
                !HandAnalyzerHelpers.IsNoOfKind(allCards, 3) && !HandAnalyzerHelpers.IsNoOfKind(allCards, 4))
            {
                if (!allCards.GroupBy(x => x.CardSuit).Any(x => x.Count() >= 5))
                {
                    return(true);
                }
            }

            return(false);
        }
        public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (boardCards == null || !boardCards.Any())
            {
                return(false);
            }

            if (HandAnalyzerHelpers.HasPair(playerCards, 1))
            {
                return(false);
            }

            var allCards = HandAnalyzerHelpers.CombineCardLists(boardCards, playerCards);

            if (HandAnalyzerHelpers.IsNoOfKind(allCards, 3) || HandAnalyzerHelpers.IsNoOfKind(allCards, 4))
            {
                return(false);
            }

            return(!HandAnalyzerHelpers.HasPair(playerCards, 1) &&
                   !playerCards.Any(p => boardCards.Any(b => b.Rank == p.Rank)) &&
                   HandAnalyzerHelpers.HasPair(boardCards, 2));
        }
예제 #4
0
        public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (boardCards == null || !boardCards.Any())
            {
                return(false);
            }

            var groupedCards = boardCards.GroupBy(x => x.Rank).OrderByDescending(x => x.Key);

            var trips = groupedCards.FirstOrDefault(x => x.Count() == 3);

            if (trips == null)
            {
                return(false);
            }

            var pair = groupedCards.Where(x => x.Key != trips.Key).FirstOrDefault(x => x.Count() >= 2);

            if (pair != null)
            {
                return(!playerCards.Any(x => x.Rank == trips.Key || x.Rank == pair.Key));
            }

            return(false);
        }
예제 #5
0
        public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (playerCards == null || boardCards == null || playerCards.Count() != 2 || boardCards.Count() < 4)
            {
                return(false);
            }

            var allCards = HandAnalyzerHelpers.CombineCardLists(boardCards, playerCards);

            var suitGroup = allCards.GroupBy(x => x.CardSuit);

            if (suitGroup.Any(g => g.Count() >= 5))
            {
                var flushBoardCards = suitGroup.Where(g => g.Count() >= 5).First().OrderByDescending(x => x.Rank).Take(5);
                if (playerCards.Any(x => flushBoardCards.Any(f => f.CardSuit == x.CardSuit)) &&
                    playerCards.Any(x => !flushBoardCards.Any(f => f.CardSuit == x.CardSuit)))
                {
                    var nutCardSuit = flushBoardCards.First().CardSuit;
                    var nutCardRank = DataTypes.Card.CardRankList.First(rank => boardCards.Where(b => b.CardSuit == nutCardSuit).All(b => b.Rank != (int)rank));
                    return(playerCards.Any(x => x.Rank == (int)nutCardRank && x.CardSuit == nutCardSuit));
                }
            }
            return(false);
        }
예제 #6
0
        public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (playerCards == null || boardCards == null || playerCards.Count() != 2 || boardCards.Count() < 3)
            {
                return(false);
            }

            if (!HandAnalyzerHelpers.IsFlush(playerCards))
            {
                return(false);
            }

            var allCards = HandAnalyzerHelpers.CombineCardLists(boardCards, playerCards);

            var suitGroup = allCards.GroupBy(x => x.CardSuit);

            if (suitGroup.Any(g => g.Count() >= 5))
            {
                var flushBoardCards = suitGroup.Where(g => g.Count() >= 5).First().OrderByDescending(x => x.Rank).Take(5);
                if (playerCards.All(x => flushBoardCards.Any(f => f.CardSuit == x.CardSuit)))
                {
                    return(playerCards.All(x => HandAnalyzerHelpers.IsWeakKicker(x)));
                }
            }
            return(false);
        }
예제 #7
0
        public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (boardCards == null || boardCards.Count() + playerCards.Count < 4)
            {
                return(false);
            }

            List <DataTypes.Card> allCards = HandAnalyzerHelpers.CombineCardLists(playerCards, boardCards);

            //List<DataTypes.Card> orderedCardsByRanks = allCards.GroupBy(x => x.Rank).Select(x => x.First()).ToList();



            foreach (CardRank cardRank in DataTypes.Card.CardRankList)
            {
                if (cardRank == CardRank.None)
                {
                    continue;
                }

                List <DataTypes.Card> checkStraight = new List <DataTypes.Card>();
                checkStraight.AddRange(allCards);
                checkStraight.Add(new DataTypes.Card(DataTypes.Card.GetCardRankString(cardRank) + "c"));
                List <DataTypes.Card> orderedCheckList = checkStraight.GroupBy(x => x.Rank).Select(x => x.First()).OrderBy(x => x.Rank).ToList();

                if (CheckIfHasStraight(orderedCheckList))
                {
                    return(false);
                }
            }

            return(true);
        }
        public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (playerCards == null || boardCards == null || playerCards.Count() != 2 || !boardCards.Any())
            {
                return(false);
            }

            var allCards = HandAnalyzerHelpers.CombineCardLists(boardCards, playerCards);

            if (HandAnalyzerHelpers.HasPair(playerCards, 1) || HandAnalyzerHelpers.IsNoOfKind(boardCards, 3) || !HandAnalyzerHelpers.IsNoOfKind(allCards, 3))
            {
                return(false);
            }

            if (boardCards.Count(x => x.Rank == boardCards.Max(b => b.Rank)) == 2 &&
                playerCards.Any(x => x.Rank == boardCards.Max(b => b.Rank)))
            {
                var kicker = playerCards.FirstOrDefault(p => boardCards.All(b => b.Rank != p.Rank));
                if (kicker != null)
                {
                    return(HandAnalyzerHelpers.IsDecentKicker(kicker));
                }
            }

            return(false);
        }
        public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (playerCards == null || boardCards == null || playerCards.Count() != 2 || boardCards.Count() < 3)
            {
                return(false);
            }

            if (!HandAnalyzerHelpers.IsFlush(playerCards))
            {
                return(false);
            }

            var sortedBoard = boardCards.OrderBy(x => x.Rank);

            for (int i = 0; i < sortedBoard.Count() - 3; i++)
            {
                var cards = sortedBoard.Take(3).ToList();

                if (cards.Any(x => x.CardSuit != playerCards.First().CardSuit))
                {
                    return(false);
                }

                cards.AddRange(playerCards);
                if (HandAnalyzerHelpers.IsStraight(cards, true))
                {
                    return(true);
                }
            }

            return(false);
        }
예제 #10
0
        public virtual bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (playerCards == null || boardCards == null || playerCards.Count() != 2 || !boardCards.Any())
            {
                return(false);
            }

            List <DataTypes.Card> consideredCards = HandAnalyzerHelpers.CombineCardLists(boardCards, playerCards);

            if (HandAnalyzerHelpers.HasPair(playerCards, 1) || !HandAnalyzerHelpers.HasPair(consideredCards, 1))
            {
                return(false);
            }

            var secondCardRank = boardCards.OrderByDescending(x => x.Rank).ElementAt(1).Rank;

            if (playerCards.Any(c => c.Rank == secondCardRank))
            {
                return(true);
            }

            return(false);
        }
예제 #11
0
        public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (playerCards == null || boardCards == null || playerCards.Count != 2 || !boardCards.Any())
            {
                return(false);
            }

            if (!HandAnalyzerHelpers.HasPair(playerCards, 1))
            {
                return(false);
            }

            var allCards = HandAnalyzerHelpers.CombineCardLists(playerCards, boardCards);

            if (HandAnalyzerHelpers.IsNoOfKind(allCards, 4))
            {
                return(false);
            }

            var groupedCards = allCards.GroupBy(x => x.Rank).OrderByDescending(x => x.Key);

            var trips = groupedCards.FirstOrDefault(x => x.Count() == 3);

            if (trips != null)
            {
                if (groupedCards.Where(x => x.Key != trips.Key).Any(x => x.Count() >= 2))
                {
                    return(trips.First().Rank == playerCards.First().Rank);
                }
            }

            return(false);
        }
        public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            return(!HandAnalyzerHelpers.IsFlushDraw(playerCards, boardCards, 0) &&
                   !HandAnalyzerHelpers.IsFlushDraw(playerCards, boardCards, 1) &&
                   !HandAnalyzerHelpers.IsFlushDraw(playerCards, boardCards, 2));
        }
        public int Analyze(string boardCards, Street targetStreet)
        {
            var cards = BoardTextureAnalyzerHelpers.ParseStringSequenceOfCards(boardCards);

            if (string.IsNullOrEmpty(boardCards) || !BoardTextureAnalyzerHelpers.IsStreetAvailable(cards, targetStreet))
            {
                return(0);
            }

            int numberOfOpenEndedStraights = 0;

            var orderedRanks = BoardTextureAnalyzerHelpers.GetOrderedBoardNumericRanks(cards, targetStreet);

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

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

            while (firstRank > orderedRanks.Min() - 3)
            {
                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).ToList();
                    var isGutShot = hand.Max() - hand.Min() == 4;
                    if (isGutShot)
                    {
                        numberOfOpenEndedStraights++;
                    }
                }
                secondRank--;
            }

            return(numberOfOpenEndedStraights);
        }
        public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (boardCards == null || !boardCards.Any())
            {
                return(false);
            }

            return(HandAnalyzerHelpers.IsNoOfKind(boardCards, 3));
        }
        public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (playerCards == null || boardCards == null || playerCards.Count() != 2 || boardCards.Count() < 4)
            {
                return(false);
            }

            return(playerCards.Any(x => HandAnalyzerHelpers.IsOneCardStraight(x, boardCards)));
        }
        public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (!HandAnalyzerHelpers.IsFlushDraw(playerCards, boardCards, 2))
            {
                return(false);
            }

            return(HandAnalyzerHelpers.IsWeakKicker(playerCards.OrderByDescending(x => x.Rank).First()));
        }
        public override bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            if (base.Analyze(playerCards, allBoardCards, targetStreet))
            {
                List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

                return(playerCards.All(p => boardCards.All(b => b.Rank < p.Rank)));
            }

            return(false);
        }
        public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (!HandAnalyzerHelpers.IsFlushDraw(playerCards, boardCards, 1, isBackdoor: true))
            {
                return(false);
            }

            return(HandAnalyzerHelpers.IsTopKicker(playerCards.OrderByDescending(x => x.Rank).First(), boardCards.Where(b => b.CardSuit == playerCards.First().CardSuit)));
        }
        public override bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (base.Analyze(playerCards, boardCards, targetStreet))
            {
                var topCard = boardCards.Min(x => x.Rank);
                return(playerCards.Any(x => x.Rank == topCard));
            }

            return(false);
        }
예제 #20
0
        public virtual bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (playerCards == null || boardCards == null || playerCards.Count() != 2 || !boardCards.Any())
            {
                return(false);
            }

            return(!HandAnalyzerHelpers.HasPair(playerCards, 1) &&
                   !playerCards.Any(p => boardCards.Any(b => b.Rank == p.Rank)) &&
                   HandAnalyzerHelpers.HasPair(boardCards, 1));;
        }
        public bool Analyze(string boardCards, Street targetStreet)
        {
            var cards = BoardTextureAnalyzerHelpers.ParseStringSequenceOfCards(boardCards);

            cards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(cards, targetStreet);

            if (!BoardTextureAnalyzerHelpers.IsStreetAvailable(cards, targetStreet))
            {
                return(false);
            }

            return(cards.GroupBy(x => x.CardSuit).Count(x => x.Count() == 2) == 2);
        }
        public override bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (base.Analyze(playerCards, boardCards, targetStreet))
            {
                var secondCardOnBoard = boardCards.OrderByDescending(x => x.Rank).Distinct().ElementAt(1).Rank;

                return(playerCards.Any(x => x.Rank == secondCardOnBoard));
            }

            return(false);
        }
        public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (!HandAnalyzerHelpers.IsFlushDraw(playerCards, boardCards, 1))
            {
                return(false);
            }

            var drawSuit = boardCards.GroupBy(x => x.CardSuit).FirstOrDefault(x => x.Count() == 3)?.Key;

            return((drawSuit != null) && HandAnalyzerHelpers.IsWeakKicker(playerCards.OrderByDescending(x => x.Rank).First(x => x.CardSuit == drawSuit)));
        }
        public override bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (base.Analyze(playerCards, allBoardCards, targetStreet))
            {
                var topCard    = boardCards.OrderByDescending(x => x.Rank).FirstOrDefault();
                var bottomCard = boardCards.OrderBy(x => x.Rank).FirstOrDefault();

                return(playerCards.Any(x => x.Rank == bottomCard?.Rank) && playerCards.All(x => x.Rank != topCard?.Rank));
            }

            return(false);
        }
        public override bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (base.Analyze(playerCards, allBoardCards, targetStreet))
            {
                var topTwo        = boardCards.OrderByDescending(x => x.Rank).Take(2).Distinct();
                var topCard       = topTwo.ElementAt(0);
                var secondTopCard = topTwo.ElementAt(1);
                return(playerCards.Any(x => x.Rank == topCard.Rank) && playerCards.All(x => x.Rank != secondTopCard.Rank));
            }

            return(false);
        }
        public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (boardCards == null || boardCards.Count() == 0)
            {
                return(false);
            }

            if (HandAnalyzerHelpers.IsFlush(boardCards) && HandAnalyzerHelpers.IsStraight(boardCards, true))
            {
                return(true);
            }
            return(false);
        }
        public override bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            if (base.Analyze(playerCards, allBoardCards, targetStreet))
            {
                List <DataTypes.Card> boardCards  = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);
                List <DataTypes.Card> pairOnBoard = boardCards.GroupBy(x => x.Rank).FirstOrDefault(x => x.Count() == 2)?.ToList();

                if (pairOnBoard?.Count != 0)
                {
                    return(playerCards.ElementAt(0).Rank < pairOnBoard.ElementAt(0).Rank);
                }
            }

            return(false);
        }
        public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (playerCards == null || boardCards == null || playerCards.Count() != 2 || !boardCards.Any())
            {
                return(false);
            }

            if (!HandAnalyzerHelpers.HasPair(playerCards, 1))
            {
                return(false);
            }

            return(boardCards.GroupBy(x => x.Rank).Any(g => (g.Count() == 2) && (g.Key == playerCards.First().Rank)));
        }
        public virtual bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (playerCards == null || boardCards == null || playerCards.Count() != 2 || !boardCards.Any())
            {
                return(false);
            }

            var allCards = HandAnalyzerHelpers.CombineCardLists(boardCards, playerCards);

            if (HandAnalyzerHelpers.IsNoOfKind(allCards, 3) || HandAnalyzerHelpers.IsNoOfKind(allCards, 4))
            {
                return(false);
            }

            return(HandAnalyzerHelpers.HasPair(playerCards, 1) && HandAnalyzerHelpers.HasPair(boardCards, 1));
        }
예제 #30
0
        public bool Analyze(List <DataTypes.Card> playerCards, List <DataTypes.Card> allBoardCards, Street targetStreet)
        {
            List <DataTypes.Card> boardCards = BoardTextureAnalyzerHelpers.GetCardsAccoringStreet(allBoardCards, targetStreet);

            if (playerCards == null || boardCards == null || playerCards.Count() != 2 || boardCards.Count() < 3)
            {
                return(false);
            }

            if (playerCards.Any(p => boardCards.Any(b => b.Rank == p.Rank)))
            {
                return(false);
            }

            var rankList = HandAnalyzerHelpers.CombineCardLists(playerCards, boardCards).Where(x => x.Rank != (int)DataTypes.Card.GetCardRank("A")).Select(x => x.Rank).Distinct().ToList();

            rankList.Sort();

            List <int> straightDraw = new List <int>();

            for (int i = 0; i < rankList.Count; i++)
            {
                if (!straightDraw.Any() || (rankList[i] == straightDraw.Last() + 1))
                {
                    straightDraw.Add(rankList[i]);
                    continue;
                }

                if (straightDraw.Count == 4)
                {
                    if (HandAnalyzerHelpers.IsStraight(straightDraw) &&
                        playerCards.Any(x => straightDraw.Contains(x.Rank)) &&
                        playerCards.Any(x => !straightDraw.Contains(x.Rank)))
                    {
                        return(true);
                    }
                }

                straightDraw.Clear();
                straightDraw.Add(rankList[i]);
            }

            return(false);
        }