예제 #1
0
 public override bool Equals(object obj)
 {
     try
     {
         EvaluatedHand otherObject = obj as EvaluatedHand;
         return(this == otherObject);
     }
     catch (InvalidCastException)
     {
         return(false);
     }
 }
예제 #2
0
        private static void CalculateRiverStrength(
            Hand playerHand,
            EvaluatedHand playerEvaluatedHand,
            IReadOnlyList <Card> communityCardList,
            Card opponentfirstCard,
            out int betterCount,
            out int notBetterCount)
        {
            // For each suit, determine if flush possible or not
            List <CardSuit> flushSuits;
            List <CardSuit> nonFlushSuits;

            // Set initial counts
            betterCount    = 0;
            notBetterCount = 0;

            List <Card> flushEvaluationList = new List <Card>(communityCardList);

            flushEvaluationList.Add(opponentfirstCard);
            DetermineFlushAndNonFlushSuits(flushEvaluationList, out flushSuits, out nonFlushSuits);

            List <Card> takenList = new List <Card>(communityCardList);

            takenList.Add(playerHand.Card2);
            takenList.Add(playerHand.Card1);
            takenList.Add(opponentfirstCard);

            // If at least one suit with no flush possibility
            if (nonFlushSuits.Count >= 1)
            {
                // For each card value ("None" is 13)
                for (int valueInt = 0; valueInt < 13; ++valueInt)
                {
                    // Get the list of card of a non flush suit, of this card value, that is also not taken
                    IReadOnlyList <Card> notTakenList =
                        DetermineNonFlushNonTakenCards(valueInt, flushSuits, takenList);

                    // If at least one
                    if (notTakenList.Count > 0)
                    {
                        // Make opponent hand once
                        Hand opponentHand = new Hand(notTakenList[0], opponentfirstCard);

                        // Evaluate against CC list
                        EvaluatedHand evaluatedOpponentHand = new EvaluatedHand(communityCardList, opponentHand);

                        if (evaluatedOpponentHand > playerEvaluatedHand)
                        {
                            betterCount += notTakenList.Count;
                        }
                        else
                        {
                            notBetterCount += notTakenList.Count;
                        }
                    }
                }
            }

            // For each represented suit that a flush is possible in
            foreach (CardSuit suit in flushSuits)
            {
                // Get the list of card in this suit that are not taken
                IReadOnlyList <Card> notTakenList =
                    DetermineFlushNonTakenCards(suit, takenList);

                // For each of them
                foreach (Card card in notTakenList)
                {
                    // Make opponent hand
                    Hand opponentHand = new Hand(notTakenList[0], opponentfirstCard);

                    // Evaluate against CC list
                    EvaluatedHand evaluatedOpponentHand = new EvaluatedHand(communityCardList, opponentHand);

                    if (evaluatedOpponentHand > playerEvaluatedHand)
                    {
                        betterCount++;
                    }
                    else
                    {
                        notBetterCount++;
                    }
                }
            }
        }
예제 #3
0
        private static StrengthWave CalculateRiverStrength(Hand playerHand, IReadOnlyList <Card> communityCardList)
        {
            // For each suit, determine if flush possible or not
            List <CardSuit> flushSuits;
            List <CardSuit> nonFlushSuits;

            // Set initial counts
            int betterCountTotal    = 0;
            int notBetterCountTotal = 0;

            // Separate flush and non flush sensitive suits
            List <Card> flushEvaluationList = new List <Card>(communityCardList);

            DetermineFlushAndNonFlushSuits(flushEvaluationList, out flushSuits, out nonFlushSuits);

            // Compile the list of taken cards
            List <Card> takenList = new List <Card>(communityCardList);

            takenList.Add(playerHand.Card2);
            takenList.Add(playerHand.Card1);

            // Evaluate the player's hand
            EvaluatedHand playerEvaluatedHand = new EvaluatedHand(communityCardList, playerHand);

            // If at least one suit with no flush possibility
            if (nonFlushSuits.Count >= 1)
            {
                // For each card value ("None" is 13)
                for (int valueInt = 0; valueInt < 13; ++valueInt)
                {
                    // Get the list of card of a non flush suit, of this card value, that is also not taken
                    IReadOnlyList <Card> notTakenList =
                        DetermineNonFlushNonTakenCards(valueInt, flushSuits, takenList);

                    // If at least one
                    if (notTakenList.Count > 0)
                    {
                        int betterCount;
                        int notBetterCount;

                        // Only calculate once
                        CalculateRiverStrength(
                            playerHand,
                            playerEvaluatedHand,
                            communityCardList,
                            notTakenList[0],
                            out betterCount,
                            out notBetterCount);

                        // Add to totals
                        betterCountTotal    += (betterCount * notTakenList.Count);
                        notBetterCountTotal += (notBetterCount * notTakenList.Count);
                    }
                }
            }

            // For each represented suit that a flush is possible in
            foreach (CardSuit suit in flushSuits)
            {
                // Get the list of card in this suit that are not taken
                IReadOnlyList <Card> notTakenList =
                    DetermineFlushNonTakenCards(suit, takenList);

                // For each of them
                foreach (Card card in notTakenList)
                {
                    int betterCount;
                    int notBetterCount;

                    // Only calculate once
                    CalculateRiverStrength(
                        playerHand,
                        playerEvaluatedHand,
                        communityCardList,
                        card,
                        out betterCount,
                        out notBetterCount);

                    // Add to totals
                    betterCountTotal    += betterCount;
                    notBetterCountTotal += notBetterCount;
                }
            }

            float strengthValue =
                1.0f - ((float)betterCountTotal / (float)(betterCountTotal + notBetterCountTotal));

            return(new StrengthWave(strengthValue));
        }