예제 #1
0
    /// <summary>
    /// Overloading the regular DeterminePokerHandType function to check for JacksOrWild specific conditions.
    /// </summary>
    /// <param name="pokerHand"></param>
    /// <returns></returns>
    public DeckConstants.PokerHandType DeterminePokerHandType(List <DeckConstants.StandardCard> pokerHand)
    {
        // Copy the hand as to not to destroy the order of the original hand when we sort it.
        List <DeckConstants.StandardCard> handCopy = CopyHand(pokerHand);

        // NOTE: It would be possible to save a bit of performance by doing these calculations individually and returning immediately if they succeed or fail,
        //       however this implementation allows for the ability to over ride the standard poker return values and do additional evaluations to check for
        //       strategy specific information such as JacksOrBetter.
        StandardCardPokerDataContext jacksOrBetterDataContext = new StandardCardPokerDataContext(StandardCardPokerUtils.AreAllCardsInHandTheSameSuit(handCopy),
                                                                                                 StandardCardPokerUtils.IsStraight(handCopy),
                                                                                                 StandardCardPokerUtils.AreAllTenOrAbove(handCopy),
                                                                                                 StandardCardPokerUtils.FindSetsOfCardsWithSameValue(handCopy));

        DeckConstants.PokerHandType handType = StandardCardPokerUtils.DeterminePokerHandType(jacksOrBetterDataContext, handCopy);

        if (handType == DeckConstants.PokerHandType.Pair)
        {
            bool isJackOrGreater = (jacksOrBetterDataContext.SameCardSets.Count > 0 &&
                                    (int)handCopy[jacksOrBetterDataContext.SameCardSets[0].IndexList[0]].value >= (int)DeckConstants.CardValue.Jack);
            if (isJackOrGreater)
            {
                return(DeckConstants.PokerHandType.JacksOrBetter);
            }
        }

        return(handType);
    }
    /// <summary>
    ///  Returns the type of poker hand based off the hand of cards passed in.
    /// </summary>
    /// <param name="dataContext"></param>
    /// <param name="pokerHand"></param>
    /// <returns></returns>
    public static DeckConstants.PokerHandType DeterminePokerHandType(StandardCardPokerDataContext dataContext, List <DeckConstants.StandardCard> handToEvaluate)
    {
        if (dataContext.AllSameSuit && dataContext.Straight && dataContext.AllRoyals)
        {
            return(DeckConstants.PokerHandType.RoyalFlush);
        }

        //Determine Poker Hand Type
        if (dataContext.AllSameSuit && dataContext.Straight)
        {
            return(DeckConstants.PokerHandType.StraightFlush);
        }

        if (dataContext.AllSameSuit)
        {
            return(DeckConstants.PokerHandType.Flush);
        }

        if (dataContext.Straight)
        {
            return(DeckConstants.PokerHandType.Straight);
        }

        List <StandardCardValueSet> sameCardSets = dataContext.SameCardSets;

        //Continue Determining Poker Hand Type
        if (sameCardSets.Count > 0 && sameCardSets[SET_1].IndexList.Count == 4)
        {
            return(DeckConstants.PokerHandType.FourOfAKind);
        }

        if (sameCardSets.Count > 1 && sameCardSets[SET_1].IndexList.Count + sameCardSets[SET_2].IndexList.Count == 5)
        {
            return(DeckConstants.PokerHandType.FullHouse);
        }

        if (sameCardSets.Count > 0 && sameCardSets[SET_1].IndexList.Count == 3)
        {
            return(DeckConstants.PokerHandType.ThreeOfAKind);
        }

        if (sameCardSets.Count > 1 && sameCardSets[SET_1].IndexList.Count + sameCardSets[SET_2].IndexList.Count == 4)
        {
            return(DeckConstants.PokerHandType.TwoPair);
        }

        if (sameCardSets.Count > 0 && sameCardSets[SET_1].IndexList.Count == 2)
        {
            return(DeckConstants.PokerHandType.Pair);
        }

        return(DeckConstants.PokerHandType.HighCard);
    }