Beispiel #1
0
        private static void CalculateTmp(int[] aheadGlobal, int[] tieGlobal, int[] behindGlobal, HoleCards heroHoleCards, HoleCards villanHoleCards, int i0)
        {
            bool[] knownCard = new bool[52];
            Card[] deck      = new Card[52];

            for (int i = 0; i < 52; i++)
            {
                knownCard[i] = false;
                deck[i]      = new Card(i);
            }

            knownCard[heroHoleCards.Card0.ToInt()] = true;
            knownCard[heroHoleCards.Card1.ToInt()] = true;

            knownCard[villanHoleCards.Card0.ToInt()] = true;
            knownCard[villanHoleCards.Card1.ToInt()] = true;

            int ahead  = 0;
            int tie    = 0;
            int behind = 0;

            HandStrengthCounter heroCounter   = new HandStrengthCounter();
            HandStrengthCounter villanCounter = new HandStrengthCounter();

            heroCounter.AddCard(heroHoleCards.Card0);
            heroCounter.AddCard(heroHoleCards.Card1);

            villanCounter.AddCard(villanHoleCards.Card0);
            villanCounter.AddCard(villanHoleCards.Card1);

            Card[] board = new Card[5];

            if (!knownCard[i0])
            {
                board[0] = deck[i0];
                heroCounter.AddCard(deck[i0]);
                villanCounter.AddCard(deck[i0]);

                for (int i1 = i0 + 1; i1 < 49; i1++) // Flop 2
                {
                    if (knownCard[i1])
                    {
                        continue;
                    }

                    board[1] = deck[i1];
                    heroCounter.AddCard(deck[i1]);
                    villanCounter.AddCard(deck[i1]);

                    for (int i2 = i1 + 1; i2 < 50; i2++) // Flop 3
                    {
                        if (knownCard[i2])
                        {
                            continue;
                        }

                        board[2] = deck[i2];
                        heroCounter.AddCard(deck[i2]);
                        villanCounter.AddCard(deck[i2]);

                        for (int i3 = i2 + 1; i3 < 51; i3++) // Turn
                        {
                            if (knownCard[i3])
                            {
                                continue;
                            }

                            board[3] = deck[i3];
                            heroCounter.AddCard(deck[i3]);
                            villanCounter.AddCard(deck[i3]);

                            for (int i4 = i3 + 1; i4 < 52; i4++) // River
                            {
                                if (knownCard[i4])
                                {
                                    continue;
                                }

                                board[4] = deck[i4];
                                heroCounter.AddCard(deck[i4]);
                                villanCounter.AddCard(deck[i4]);

                                int result = heroCounter.CompareHandStrength(heroHoleCards, villanHoleCards, villanCounter, board);

                                if (result == HandStrengthCounter.AHEAD)
                                {
                                    ahead++;
                                }
                                else if (result == HandStrengthCounter.BEHIND)
                                {
                                    behind++;
                                }
                                else if (result == HandStrengthCounter.TIE)
                                {
                                    tie++;
                                }

                                heroCounter.RemoveCard(deck[i4]);
                                villanCounter.RemoveCard(deck[i4]);
                            }

                            heroCounter.RemoveCard(deck[i3]);
                            villanCounter.RemoveCard(deck[i3]);
                        }

                        heroCounter.RemoveCard(deck[i2]);
                        villanCounter.RemoveCard(deck[i2]);
                    }

                    heroCounter.RemoveCard(deck[i1]);
                    villanCounter.RemoveCard(deck[i1]);
                }

                heroCounter.RemoveCard(deck[i0]);
                villanCounter.RemoveCard(deck[i0]);
            }

            aheadGlobal[i0]  = ahead;
            tieGlobal[i0]    = tie;
            behindGlobal[i0] = behind;
        }
Beispiel #2
0
        /// <summary>
        /// Returns AHEAD if ahead, TIE tie, -1 BEHIND.
        /// </summary>
        public int CompareHandStrength(HoleCards heroHoleCards, HoleCards villainHoleCards, HandStrengthCounter villainCounter, Card[] sortedBoard)
        {
            HandRank heroRank   = this.GetHandRank();
            HandRank villanRank = villainCounter.GetHandRank();

            bool possibleStraightFlushConflict = false;
            bool resolved = false;
            int  result   = 0;

            if ((heroRank >= HandRank.Flush && villanRank >= HandRank.Flush))
            {
                if ((this.HasFlush() && this.HasStreight()) || (villainCounter.HasFlush() && villainCounter.HasStreight()))
                {
                    possibleStraightFlushConflict = true;
                }
            }

            if (possibleStraightFlushConflict)
            {
                resolved = false;
            }
            else if (heroRank > villanRank)
            {
                result   = AHEAD;
                resolved = true;
            }
            else if (heroRank < villanRank)
            {
                result   = BEHIND;
                resolved = true;
            }
            else if (heroRank == HandRank.HighCard)
            {
                int heroTmp   = this.GetHighCardKicker();
                int villanTmp = villainCounter.GetHighCardKicker();

                if (heroTmp > villanTmp)
                {
                    result   = AHEAD;
                    resolved = true;
                }
                else if (heroTmp < villanTmp)
                {
                    result   = BEHIND;
                    resolved = true;
                }
                else
                {
                    result   = TIE;
                    resolved = true;
                }
            }
            else if (heroRank == HandRank.OnePair)
            {
                int heroTmp   = this.GetPairRank();
                int villanTmp = villainCounter.GetPairRank();

                if (heroTmp > villanTmp)
                {
                    result   = AHEAD;
                    resolved = true;
                }
                else if (heroTmp < villanTmp)
                {
                    result   = BEHIND;
                    resolved = true;
                }
                else
                {
                    heroTmp   = this.GetOnePairKicker(heroTmp);
                    villanTmp = villainCounter.GetOnePairKicker(villanTmp);

                    if (heroTmp > villanTmp)
                    {
                        result   = AHEAD;
                        resolved = true;
                    }
                    else if (heroTmp < villanTmp)
                    {
                        result   = BEHIND;
                        resolved = true;
                    }
                    else
                    {
                        result   = TIE;
                        resolved = true;
                    }
                }
            }
            else if (heroRank == HandRank.TwoPair)
            {
                int heroTmp   = this.GetTwoPairRank();
                int villanTmp = villainCounter.GetTwoPairRank();

                if (heroTmp > villanTmp)
                {
                    result   = AHEAD;
                    resolved = true;
                }
                else if (heroTmp < villanTmp)
                {
                    result   = BEHIND;
                    resolved = true;
                }
                else
                {
                    heroTmp   = this.GetTwoPairKicker();
                    villanTmp = villainCounter.GetTwoPairKicker();

                    if (heroTmp > villanTmp)
                    {
                        result   = AHEAD;
                        resolved = true;
                    }
                    else if (heroTmp < villanTmp)
                    {
                        result   = BEHIND;
                        resolved = true;
                    }
                    else
                    {
                        result   = TIE;
                        resolved = true;
                    }
                }
            }
            else if (heroRank == HandRank.Trips)
            {
                int heroTmp   = this.GetTripsRank();
                int villanTmp = villainCounter.GetTripsRank();

                if (heroTmp > villanTmp)
                {
                    result   = AHEAD;
                    resolved = true;
                }
                else if (heroTmp < villanTmp)
                {
                    result   = BEHIND;
                    resolved = true;
                }
                else
                {
                    heroTmp   = this.GetTripsKicker();
                    villanTmp = villainCounter.GetTripsKicker();

                    if (heroTmp > villanTmp)
                    {
                        result   = AHEAD;
                        resolved = true;
                    }
                    else if (heroTmp < villanTmp)
                    {
                        result   = BEHIND;
                        resolved = true;
                    }
                    else
                    {
                        result   = TIE;
                        resolved = true;
                    }
                }
            }
            else if (heroRank == HandRank.Straight)
            {
                int heroTmp   = this.GetStreightRank();
                int villanTmp = villainCounter.GetStreightRank();

                if (heroTmp > villanTmp)
                {
                    result   = AHEAD;
                    resolved = true;
                }
                else if (heroTmp < villanTmp)
                {
                    result   = BEHIND;
                    resolved = true;
                }
                else
                {
                    result   = TIE;
                    resolved = true;
                }
            }
            else if (heroRank == HandRank.Flush)
            {
                int heroTmp   = GetFlushRank(heroHoleCards, sortedBoard, this.GetFlushSuite());
                int villanTmp = GetFlushRank(villainHoleCards, sortedBoard, villainCounter.GetFlushSuite());

                if (heroTmp > villanTmp)
                {
                    result   = AHEAD;
                    resolved = true;
                }
                else if (heroTmp < villanTmp)
                {
                    result   = BEHIND;
                    resolved = true;
                }
                else
                {
                    result   = TIE;
                    resolved = true;
                }
            }
            else if (heroRank == HandRank.FullHouse)
            {
                int heroTmp   = this.GetFullRank();
                int villanTmp = villainCounter.GetFullRank();

                if (heroTmp > villanTmp)
                {
                    result   = AHEAD;
                    resolved = true;
                }
                else if (heroTmp < villanTmp)
                {
                    result   = BEHIND;
                    resolved = true;
                }
                else
                {
                    result   = TIE;
                    resolved = true;
                }
            }
            else if (heroRank == HandRank.Poker)
            {
                int heroTmp   = this.GetPokerRank();
                int villanTmp = villainCounter.GetPokerRank();

                if (heroTmp > villanTmp)
                {
                    result   = AHEAD;
                    resolved = true;
                }
                else if (heroTmp < villanTmp)
                {
                    result   = BEHIND;
                    resolved = true;
                }
                else
                {
                    heroTmp   = this.GetPokerKicker();
                    villanTmp = villainCounter.GetPokerKicker();

                    if (heroTmp > villanTmp)
                    {
                        result   = AHEAD;
                        resolved = true;
                    }
                    else if (heroTmp < villanTmp)
                    {
                        result   = BEHIND;
                        resolved = true;
                    }
                    else
                    {
                        result   = TIE;
                        resolved = true;
                    }
                }
            }

            if (!resolved)
            {
                villainCounter.GetHandStrength(villainHoleCards, sortedBoard);

                int villanStrength = villainCounter.GetHandStrength(villainHoleCards, sortedBoard);
                int heroStrength   = this.GetHandStrength(heroHoleCards, sortedBoard);

                if (heroStrength > villanStrength)
                {
                    result = AHEAD;
                }
                else if (heroStrength < villanStrength)
                {
                    result = BEHIND;
                }
                else
                {
                    result = TIE;
                }
            }

            return(result);
        }