示例#1
0
        public HandEvaluatorResult Evaluate(List <Card> hand)
        {
            if (hand.Count != 5)
            {
                throw new ArgumentException("Hands to evaluate must be 5 cards.", nameof(hand));
            }

            var cardComparer = new CardComparer();

            hand.Sort(cardComparer);

            var result = new HandEvaluatorResult();

            for (int i = 1; i < hand.Count; i++)
            {
                if (hand[i].Suit != hand[i - 1].Suit)
                {
                    result.Hand = HandType.INVALID_HAND;
                    return(result);
                }
            }

            result.Hand        = HandType.Flush;
            result.Determinant = hand[hand.Count - 1].RankValue;

            return(result);
        }
示例#2
0
        private HandEvaluatorResult EvaluateFiveCardHand(List <Card> hand)
        {
            var straightOrFlushResult = new HandEvaluatorResult();

            var matchingResult = _matchingHandEvaluator.Evaluate(hand);
            var straightResult = _straightHandEvaluator.Evaluate(hand);
            var flushResult    = _flushHandEvaluator.Evaluate(hand);

            // Straight flushes
            if (straightResult.Hand == HandType.Straight && flushResult.Hand == HandType.Flush)
            {
                // Royal Flush
                if (hand[0].Rank == "10" && hand[hand.Count - 1].Rank == "A")
                {
                    straightOrFlushResult.Hand        = HandType.RoyalFlush;
                    straightOrFlushResult.Determinant = flushResult.Determinant;
                }

                // Wheel straight flush
                else if (hand[0].Rank == "2" && hand[hand.Count - 1].Rank == "A")
                {
                    straightOrFlushResult.Hand        = HandType.StraightFlush;
                    straightOrFlushResult.Determinant = 5;
                }

                else
                {
                    straightOrFlushResult.Hand        = HandType.StraightFlush;
                    straightOrFlushResult.Determinant = flushResult.Determinant;
                }
            }
            else if (flushResult.Hand == HandType.Flush)
            {
                straightOrFlushResult = flushResult;
            }
            else if (straightResult.Hand == HandType.Straight)
            {
                straightOrFlushResult = straightResult;
            }
            else
            {
                straightOrFlushResult.Hand = HandType.INVALID_HAND;
            }

            if (matchingResult > straightOrFlushResult)
            {
                return(matchingResult);
            }
            else
            {
                return(straightOrFlushResult);
            }
        }
示例#3
0
        public HandEvaluatorResult EvaluateHand(List <Card> hand)
        {
            if (hand.Count < 5)
            {
                throw new ArgumentException("A hand must have at least five cards.", nameof(hand));
            }

            for (int i = 0; i < hand.Count; i++)
            {
                EvaluateGreaterThanFiveCardHand(hand, i);
            }

            HandEvaluatorResult highestPossibleHand = null;

            foreach (var result in _possibleResults)
            {
                if (highestPossibleHand == null || result > highestPossibleHand)
                {
                    highestPossibleHand = result;
                }
            }
            return(highestPossibleHand);
        }
        public HandEvaluatorResult Evaluate(List <Card> hand)
        {
            if (hand.Count != 5)
            {
                throw new ArgumentException("Hands to evaluate must be 5 cards.", nameof(hand));
            }

            var result = new HandEvaluatorResult();

            var cardComparer = new CardComparer();

            hand.Sort(cardComparer);

            for (int i = 1; i < hand.Count; i++)
            {
                if (hand[i].RankValue - 1 != hand[i - 1].RankValue)
                {
                    // Wheel straight
                    if ((i == hand.Count - 1) && (hand[i].Rank == "A") && (hand[0].Rank == "2"))
                    {
                        result.Hand        = HandType.Straight;
                        result.Determinant = 5;
                        return(result);
                    }
                    else
                    {
                        result.Hand = HandType.INVALID_HAND;
                        return(result);
                    }
                }
            }

            result.Hand        = HandType.Straight;
            result.Determinant = hand[hand.Count - 1].RankValue;

            return(result);
        }
示例#5
0
        public HandEvaluatorResult Evaluate(List <Card> hand)
        {
            if (hand.Count != 5)
            {
                throw new ArgumentException("Hands to evaluate must be 5 cards.", nameof(hand));
            }

            var cardQuantity = new Dictionary <int, int>();

            var kickers = new List <int>();

            foreach (var card in hand)
            {
                if (!cardQuantity.ContainsKey(card.RankValue))
                {
                    cardQuantity[card.RankValue] = 1;
                }
                else
                {
                    cardQuantity[card.RankValue]++;
                }
            }

            int quadsRankValue      = 0;
            int tripsRankValue      = 0;
            int topPairRankValue    = 0;
            int secondPairRankValue = 0;

            foreach (var rankValue in cardQuantity.Keys)
            {
                if (cardQuantity[rankValue] == 4)
                {
                    if (rankValue > quadsRankValue)
                    {
                        quadsRankValue = rankValue;
                    }
                }

                if (cardQuantity[rankValue] == 3)
                {
                    if (rankValue > tripsRankValue)
                    {
                        tripsRankValue = rankValue;
                    }
                }

                if (cardQuantity[rankValue] == 2)
                {
                    if (rankValue > topPairRankValue)
                    {
                        secondPairRankValue = topPairRankValue;
                        topPairRankValue    = rankValue;
                    }
                    else if (rankValue < topPairRankValue && rankValue > secondPairRankValue)
                    {
                        secondPairRankValue = rankValue;
                    }
                }

                if (cardQuantity[rankValue] == 1)
                {
                    kickers.Add(rankValue);
                }
            }

            // Get the kickers in descending order
            kickers.Sort();
            kickers.Reverse();

            var matchingCardEvaluatorResult = new HandEvaluatorResult();

            // Four of a Kind
            if (quadsRankValue > 0)
            {
                matchingCardEvaluatorResult.Hand        = HandType.FourOfAKind;
                matchingCardEvaluatorResult.Determinant = quadsRankValue;
                matchingCardEvaluatorResult.Kicker      = kickers.First();
                return(matchingCardEvaluatorResult);
            }

            // Full House
            if (tripsRankValue > 0 && topPairRankValue > 0)
            {
                matchingCardEvaluatorResult.Hand           = HandType.FullHouse;
                matchingCardEvaluatorResult.Determinant    = tripsRankValue;
                matchingCardEvaluatorResult.SubDeterminant = topPairRankValue;
                return(matchingCardEvaluatorResult);
            }

            // Three of a Kind
            if (tripsRankValue > 0)
            {
                matchingCardEvaluatorResult.Hand         = HandType.ThreeOfAKind;
                matchingCardEvaluatorResult.Determinant  = tripsRankValue;
                matchingCardEvaluatorResult.Kicker       = kickers[0];
                matchingCardEvaluatorResult.SecondKicker = kickers[1];
                return(matchingCardEvaluatorResult);
            }

            // Two Pair
            if (topPairRankValue > 0 && secondPairRankValue > 0)
            {
                matchingCardEvaluatorResult.Hand           = HandType.TwoPair;
                matchingCardEvaluatorResult.Determinant    = topPairRankValue;
                matchingCardEvaluatorResult.SubDeterminant = secondPairRankValue;
                matchingCardEvaluatorResult.Kicker         = kickers.First();
                return(matchingCardEvaluatorResult);
            }

            // One Pair
            if (topPairRankValue > 0)
            {
                matchingCardEvaluatorResult.Hand         = HandType.Pair;
                matchingCardEvaluatorResult.Determinant  = topPairRankValue;
                matchingCardEvaluatorResult.Kicker       = kickers[0];
                matchingCardEvaluatorResult.SecondKicker = kickers[1];
                matchingCardEvaluatorResult.ThirdKicker  = kickers[2];
                return(matchingCardEvaluatorResult);
            }

            // High Card
            matchingCardEvaluatorResult.Hand         = HandType.High;
            matchingCardEvaluatorResult.Determinant  = kickers[0];
            matchingCardEvaluatorResult.Kicker       = kickers[1];
            matchingCardEvaluatorResult.SecondKicker = kickers[2];
            matchingCardEvaluatorResult.ThirdKicker  = kickers[3];
            matchingCardEvaluatorResult.FourthKicker = kickers[4];

            return(matchingCardEvaluatorResult);
        }