public HandType GetHandType() { if (HandScore.Equals(string.Empty)) { return(HandType.NONE); } else if (PlayerWinnerId.Equals(string.Empty)) { if (PlayerLooserId.Equals(string.Empty)) { if (HandScore.Equals("0")) { return(HandType.WASHOUT); } else { return(HandType.NONE); } } else { return(HandType.NONE); } } else if (PlayerLooserId.Equals(string.Empty)) { return(HandType.TSUMO); } else { return(HandType.RON); } }
public static bool operator >(Hand hand1, Hand hand2) { HandScore score1 = HandScoreComputer.ComputeScore(hand1); HandScore score2 = HandScoreComputer.ComputeScore(hand2); return(score1.CompareTo(score2) > 0); }
static HandScoresTable() { StraightFlushes = HandScore.GetStraightFlushes().ToList().AsReadOnly(); FourOfAKinds = HandScore.GetFourOfAKinds().ToList().AsReadOnly(); FullHouses = HandScore.GetFullHouses().ToList().AsReadOnly(); Flushes = HandScore.GetFlushes().ToList().AsReadOnly(); Straights = HandScore.GetStraights().ToList().AsReadOnly(); ThreeOfAKinds = HandScore.GetThreeOfAKinds().ToList().AsReadOnly(); TwoPairs = HandScore.GetTwoPairs().ToList().AsReadOnly(); Pairs = HandScore.GetPairs().ToList().AsReadOnly(); HighCards = HandScore.GetHighCards().ToList().AsReadOnly(); List <HandScore> all = new List <HandScore>(); all.AddRange(StraightFlushes); all.AddRange(FourOfAKinds); all.AddRange(FullHouses); all.AddRange(Flushes); all.AddRange(Straights); all.AddRange(ThreeOfAKinds); all.AddRange(TwoPairs); all.AddRange(Pairs); all.AddRange(HighCards); All = all.ToDictionary(item => item.Key, item => item); Ranks = GetScoreProbabilities(); }
public static HandScore ComputeScore(Hand hand) { HandScore result = new HandScore(); List <int> cardValues = hand.Cards.Select(c => c.Value).ToList(); List <int> otherCardValues; bool isFlush = IsFlush(hand, out List <int> flushOtherCardValues); bool isStraight = IsStraight(cardValues, out List <int> straightOtherCardValues); if (isFlush && IsRoyal(cardValues)) { result.Rank = HandRank.RoyalFlush; otherCardValues = flushOtherCardValues; } else if (isFlush && isStraight) { result.Rank = HandRank.StraightFlush; otherCardValues = flushOtherCardValues; } else if (IsFourOfAKind(cardValues, out otherCardValues)) { result.Rank = HandRank.FourOfAKind; } else if (IsFullHouse(cardValues, out otherCardValues)) { result.Rank = HandRank.FullHouse; } else if (isFlush) { result.Rank = HandRank.Flush; otherCardValues = flushOtherCardValues; } else if (isStraight) { result.Rank = HandRank.Straight; otherCardValues = straightOtherCardValues; } else if (IsThreeOfAKind(cardValues, out List <int> other)) { result.Rank = HandRank.ThreeOfAKind; otherCardValues = other; } else if (IsTwoPairs(cardValues, out List <int> other2)) { result.Rank = HandRank.TwoPairs; otherCardValues = other2; } else if (IsOnePair(cardValues, out otherCardValues)) { result.Rank = HandRank.OnePair; } else { result.Rank = HandRank.HighCard; } Debug.Assert(otherCardValues != null); result.OtherCardValues = otherCardValues; return(result); }
public Hand(List <Card> cards, bool cardsAreUnsorted = true) { if (cardsAreUnsorted) { cards.Sort(); } Cards = cards.AsReadOnly(); Debug.Assert(Cards.Count == 5, "Creating hand with " + Cards.Count + " cards instead of 5 cards"); IsFlush = GetIsFlush(); StraightValue = GetStraightValue(); StraightFlushValue = GetStraightFlushValue(); int[] groupingsArray = GetGroupingsArray(); FourOfAKindValue = GetFourOfAKindValue(groupingsArray); ThreeOfAKindValue = GetThreeOfAKindValue(groupingsArray); for (int i = 14; i > 1; i--) { if (groupingsArray[i] == 2) { if (PairValue > 0) { TwoPairValue = PairValue; } PairValue = i; } } if (ThreeOfAKindValue > 0 && PairValue > 0) { FullHouseThreeCardValue = ThreeOfAKindValue; FullHouseTwoCardValue = PairValue; } string scoreTablesKey = HandScore.GetHandScoreKey(this); Score = HandScoresTable.All[scoreTablesKey]; Rank = HandScoresTable.Ranks[scoreTablesKey]; }
public int CompareTo(object otherObj) { HandScore other = otherObj as HandScore; int rankDiff = (int)this.Rank - (int)other.Rank; if (rankDiff != 0) { return(rankDiff); } // compare starting with biggest card (the last one) Debug.Assert(this.OtherCardValues.Count == other.OtherCardValues.Count); for (int i = OtherCardValues.Count - 1; i >= 0; i--) { int diff = this.OtherCardValues[i] - other.OtherCardValues[i]; if (diff != 0) { return(diff); } } Debug.Assert(false); // problem statement says there's always a winner return(0); }