Пример #1
0
 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);
     }
 }
Пример #2
0
            public static bool operator >(Hand hand1, Hand hand2)
            {
                HandScore score1 = HandScoreComputer.ComputeScore(hand1);
                HandScore score2 = HandScoreComputer.ComputeScore(hand2);

                return(score1.CompareTo(score2) > 0);
            }
Пример #3
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();
    }
Пример #4
0
            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);
            }
Пример #5
0
    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];
    }
Пример #6
0
            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);
            }