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); }
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); } }
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); }
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); }