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; }
/// <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); }