HoldemHand.Hand.HandPlayerMultiOpponentOdds C# (CSharp) Method

HandPlayerMultiOpponentOdds() public static method

public static HandPlayerMultiOpponentOdds ( ulong ourcards, ulong board, int numOpponents, double duration, double &player, double &opponent ) : void
ourcards ulong
board ulong
numOpponents int
duration double
player double
opponent double
return void
        public static void HandPlayerMultiOpponentOdds(ulong ourcards, ulong board, int numOpponents, double duration, ref double[] player, ref double[] opponent)
        {
            long playerCount = 0, OpponentCount = 0;
            Random rand = new Random();

            for (int i = 0; i < 9; i++)
            {
                player[i] = 0.0; opponent[i] = 0.0;
            }
            #if DEBUG
            if (BitCount(ourcards) != 2) throw new ArgumentException("pocket must contain exactly 2 cards");
            if (numOpponents < 1 || numOpponents > 9) throw new ArgumentException("numOpponents must be 1-9");
            if (BitCount(board) > 5) throw new ArgumentException("board must contain 0-5 cards");
            if (duration <= 0.0) throw new ArgumentException("duration musn't be 0.0 or negative");
            #endif
            switch (numOpponents)
            {
                case 1:
                    foreach (ulong boardmask in Hand.RandomHands(board, ourcards, 5, duration))
                    {
                        ulong opp1 = Hand.RandomHand(rand, 0UL, ourcards | boardmask, 2);
                        uint playerHandVal = Hand.Evaluate(ourcards | boardmask, 7);
                        uint opp1HandVal = Hand.Evaluate(opp1 | boardmask, 7);

                        if (playerHandVal >= opp1HandVal)
                        {
                            player[HandType(playerHandVal)] += 1.0;
                        }
                        else
                        {
                            opponent[HandType(opp1HandVal)] += 1.0;
                        }
                        playerCount++;
                        OpponentCount++;
                    }

                    for (int i = 0; i < 9; i++)
                    {
                        player[i] = player[i] / playerCount;
                        opponent[i] = opponent[i] / OpponentCount;
                    }

                    return;
                case 2:
                    foreach (ulong boardmask in Hand.RandomHands(board, ourcards, 5, duration))
                    {
                        ulong opp1 = Hand.RandomHand(rand, 0UL, ourcards | boardmask, 2);
                        ulong opp2 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1, 2);
                        uint playerHandVal = Hand.Evaluate(ourcards | boardmask, 7);
                        uint opp1HandVal = Hand.Evaluate(opp1 | boardmask, 7);
                        uint opp2HandVal = Hand.Evaluate(opp2 | boardmask, 7);

                        if (playerHandVal >= opp1HandVal && playerHandVal >= opp2HandVal)
                        {
                            player[HandType(playerHandVal)] += 1.0;
                        }
                        playerCount++;

                        if (opp1HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp1HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp2HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp2HandVal)] += 1.0;
                        }
                        OpponentCount++;
                    }

                    for (int i = 0; i < 9; i++)
                    {
                        player[i] = player[i] / playerCount;
                        opponent[i] = opponent[i] / OpponentCount;
                    }

                    return;
                case 3:
                    foreach (ulong boardmask in Hand.RandomHands(board, ourcards, 5, duration))
                    {
                        ulong opp1 = Hand.RandomHand(rand, 0UL, ourcards | boardmask, 2);
                        ulong opp2 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1, 2);
                        ulong opp3 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2, 2);
                        uint playerHandVal = Hand.Evaluate(ourcards | boardmask, 7);
                        uint opp1HandVal = Hand.Evaluate(opp1 | boardmask, 7);
                        uint opp2HandVal = Hand.Evaluate(opp2 | boardmask, 7);
                        uint opp3HandVal = Hand.Evaluate(opp3 | boardmask, 7);

                        if (playerHandVal >= opp1HandVal && playerHandVal >= opp2HandVal && playerHandVal >= opp3HandVal)
                        {
                            player[HandType(playerHandVal)] += 1.0;
                        }
                        playerCount++;

                        if (opp1HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp1HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp2HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp2HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp3HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp3HandVal)] += 1.0;
                        }
                        OpponentCount++;
                    }

                    for (int i = 0; i < 9; i++)
                    {
                        player[i] = player[i] / playerCount;
                        opponent[i] = opponent[i] / OpponentCount;
                    }

                    return;
                case 4:
                    foreach (ulong boardmask in Hand.RandomHands(board, ourcards, 5, duration))
                    {
                        ulong opp1 = Hand.RandomHand(rand, 0UL, ourcards | boardmask, 2);
                        ulong opp2 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1, 2);
                        ulong opp3 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2, 2);
                        ulong opp4 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3, 2);
                        uint playerHandVal = Hand.Evaluate(ourcards | boardmask, 7);
                        uint opp1HandVal = Hand.Evaluate(opp1 | boardmask, 7);
                        uint opp2HandVal = Hand.Evaluate(opp2 | boardmask, 7);
                        uint opp3HandVal = Hand.Evaluate(opp3 | boardmask, 7);
                        uint opp4HandVal = Hand.Evaluate(opp4 | boardmask, 7);

                        if (playerHandVal >= opp1HandVal && playerHandVal >= opp2HandVal &&
                            playerHandVal >= opp3HandVal && playerHandVal >= opp4HandVal)
                        {
                            player[HandType(playerHandVal)] += 1.0;
                        }
                        playerCount++;

                        if (opp1HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp1HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp2HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp2HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp3HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp3HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp4HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp4HandVal)] += 1.0;
                        }
                        OpponentCount++;
                    }

                    for (int i = 0; i < 9; i++)
                    {
                        player[i] = player[i] / playerCount;
                        opponent[i] = opponent[i] / OpponentCount;
                    }

                    return;
                case 5:
                    foreach (ulong boardmask in Hand.RandomHands(board, ourcards, 5, duration))
                    {
                        ulong opp1 = Hand.RandomHand(rand, 0UL, ourcards | boardmask, 2);
                        ulong opp2 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1, 2);
                        ulong opp3 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2, 2);
                        ulong opp4 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3, 2);
                        ulong opp5 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3 | opp4, 2);
                        uint playerHandVal = Hand.Evaluate(ourcards | boardmask, 7);
                        uint opp1HandVal = Hand.Evaluate(opp1 | boardmask, 7);
                        uint opp2HandVal = Hand.Evaluate(opp2 | boardmask, 7);
                        uint opp3HandVal = Hand.Evaluate(opp3 | boardmask, 7);
                        uint opp4HandVal = Hand.Evaluate(opp4 | boardmask, 7);
                        uint opp5HandVal = Hand.Evaluate(opp5 | boardmask, 7);

                        if (playerHandVal >= opp1HandVal && playerHandVal >= opp2HandVal &&
                            playerHandVal >= opp3HandVal && playerHandVal >= opp4HandVal &&
                            playerHandVal >= opp5HandVal)
                        {
                            player[HandType(playerHandVal)] += 1.0;
                        }
                        playerCount++;

                        if (opp1HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp1HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp2HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp2HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp3HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp3HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp4HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp4HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp5HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp5HandVal)] += 1.0;
                        }
                        OpponentCount++;
                    }

                    for (int i = 0; i < 9; i++)
                    {
                        player[i] = player[i] / playerCount;
                        opponent[i] = opponent[i] / OpponentCount;
                    }

                    return;
                case 6:
                    foreach (ulong boardmask in Hand.RandomHands(board, ourcards, 5, duration))
                    {
                        ulong opp1 = Hand.RandomHand(rand, 0UL, ourcards | boardmask, 2);
                        ulong opp2 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1, 2);
                        ulong opp3 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2, 2);
                        ulong opp4 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3, 2);
                        ulong opp5 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3 | opp4, 2);
                        ulong opp6 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3 | opp4 | opp5, 2);
                        uint playerHandVal = Hand.Evaluate(ourcards | boardmask, 7);
                        uint opp1HandVal = Hand.Evaluate(opp1 | boardmask, 7);
                        uint opp2HandVal = Hand.Evaluate(opp2 | boardmask, 7);
                        uint opp3HandVal = Hand.Evaluate(opp3 | boardmask, 7);
                        uint opp4HandVal = Hand.Evaluate(opp4 | boardmask, 7);
                        uint opp5HandVal = Hand.Evaluate(opp5 | boardmask, 7);
                        uint opp6HandVal = Hand.Evaluate(opp6 | boardmask, 7);

                        if (playerHandVal >= opp1HandVal && playerHandVal >= opp2HandVal &&
                            playerHandVal >= opp3HandVal && playerHandVal >= opp4HandVal &&
                            playerHandVal >= opp5HandVal && playerHandVal >= opp6HandVal)
                        {
                            player[HandType(playerHandVal)] += 1.0;
                        }
                        playerCount++;

                        if (opp1HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp1HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp2HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp2HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp3HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp3HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp4HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp4HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp5HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp5HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp6HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp6HandVal)] += 1.0;
                        }
                        OpponentCount++;
                    }

                    for (int i = 0; i < 9; i++)
                    {
                        player[i] = player[i] / playerCount;
                        opponent[i] = opponent[i] / OpponentCount;
                    }

                    return;
                case 7:
                    foreach (ulong boardmask in Hand.RandomHands(board, ourcards, 5, duration))
                    {
                        ulong opp1 = Hand.RandomHand(rand, 0UL, ourcards | boardmask, 2);
                        ulong opp2 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1, 2);
                        ulong opp3 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2, 2);
                        ulong opp4 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3, 2);
                        ulong opp5 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3 | opp4, 2);
                        ulong opp6 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3 | opp4 | opp5, 2);
                        ulong opp7 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3 | opp4 | opp5 | opp6, 2);
                        uint playerHandVal = Hand.Evaluate(ourcards | boardmask, 7);
                        uint opp1HandVal = Hand.Evaluate(opp1 | boardmask, 7);
                        uint opp2HandVal = Hand.Evaluate(opp2 | boardmask, 7);
                        uint opp3HandVal = Hand.Evaluate(opp3 | boardmask, 7);
                        uint opp4HandVal = Hand.Evaluate(opp4 | boardmask, 7);
                        uint opp5HandVal = Hand.Evaluate(opp5 | boardmask, 7);
                        uint opp6HandVal = Hand.Evaluate(opp6 | boardmask, 7);
                        uint opp7HandVal = Hand.Evaluate(opp7 | boardmask, 7);

                        if (playerHandVal >= opp1HandVal && playerHandVal >= opp2HandVal &&
                            playerHandVal >= opp3HandVal && playerHandVal >= opp4HandVal &&
                            playerHandVal >= opp5HandVal && playerHandVal >= opp6HandVal &&
                            playerHandVal >= opp7HandVal)
                        {
                            player[HandType(playerHandVal)] += 1.0;
                        }
                        playerCount++;

                        if (opp1HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp1HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp2HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp2HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp3HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp3HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp4HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp4HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp5HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp5HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp6HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp6HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp7HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp7HandVal)] += 1.0;
                        }
                        OpponentCount++;
                    }

                    for (int i = 0; i < 9; i++)
                    {
                        player[i] = player[i] / playerCount;
                        opponent[i] = opponent[i] / OpponentCount;
                    }

                    return;
                case 8:
                    foreach (ulong boardmask in Hand.RandomHands(board, ourcards, 5, duration))
                    {
                        ulong opp1 = Hand.RandomHand(rand, 0UL, ourcards | boardmask, 2);
                        ulong opp2 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1, 2);
                        ulong opp3 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2, 2);
                        ulong opp4 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3, 2);
                        ulong opp5 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3 | opp4, 2);
                        ulong opp6 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3 | opp4 | opp5, 2);
                        ulong opp7 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3 | opp4 | opp5 | opp6, 2);
                        ulong opp8 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3 | opp4 | opp5 | opp6 | opp7, 2);
                        uint playerHandVal = Hand.Evaluate(ourcards | boardmask, 7);
                        uint opp1HandVal = Hand.Evaluate(opp1 | boardmask, 7);
                        uint opp2HandVal = Hand.Evaluate(opp2 | boardmask, 7);
                        uint opp3HandVal = Hand.Evaluate(opp3 | boardmask, 7);
                        uint opp4HandVal = Hand.Evaluate(opp4 | boardmask, 7);
                        uint opp5HandVal = Hand.Evaluate(opp5 | boardmask, 7);
                        uint opp6HandVal = Hand.Evaluate(opp6 | boardmask, 7);
                        uint opp7HandVal = Hand.Evaluate(opp7 | boardmask, 7);
                        uint opp8HandVal = Hand.Evaluate(opp8 | boardmask, 7);

                        if (playerHandVal >= opp1HandVal && playerHandVal >= opp2HandVal &&
                            playerHandVal >= opp3HandVal && playerHandVal >= opp4HandVal &&
                            playerHandVal >= opp5HandVal && playerHandVal >= opp6HandVal &&
                            playerHandVal >= opp7HandVal && playerHandVal >= opp8HandVal)
                        {
                            player[HandType(playerHandVal)] += 1.0;
                        }
                        playerCount++;

                        if (opp1HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp1HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp2HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp2HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp3HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp3HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp4HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp4HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp5HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp5HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp6HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp6HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp7HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp7HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp8HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp7HandVal)] += 1.0;
                        }
                        OpponentCount++;
                    }

                    for (int i = 0; i < 9; i++)
                    {
                        player[i] = player[i] / playerCount;
                        opponent[i] = opponent[i] / OpponentCount;
                    }

                    return;
                case 9:
                    foreach (ulong boardmask in Hand.RandomHands(board, ourcards, 5, duration))
                    {
                        ulong opp1 = Hand.RandomHand(rand, 0UL, ourcards | boardmask, 2);
                        ulong opp2 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1, 2);
                        ulong opp3 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2, 2);
                        ulong opp4 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3, 2);
                        ulong opp5 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3 | opp4, 2);
                        ulong opp6 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3 | opp4 | opp5, 2);
                        ulong opp7 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3 | opp4 | opp5 | opp6, 2);
                        ulong opp8 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3 | opp4 | opp5 | opp6 | opp7, 2);
                        ulong opp9 = Hand.RandomHand(rand, 0UL, ourcards | boardmask | opp1 | opp2 | opp3 | opp4 | opp5 | opp6 | opp7 | opp8, 2);
                        uint playerHandVal = Hand.Evaluate(ourcards | boardmask, 7);
                        uint opp1HandVal = Hand.Evaluate(opp1 | boardmask, 7);
                        uint opp2HandVal = Hand.Evaluate(opp2 | boardmask, 7);
                        uint opp3HandVal = Hand.Evaluate(opp3 | boardmask, 7);
                        uint opp4HandVal = Hand.Evaluate(opp4 | boardmask, 7);
                        uint opp5HandVal = Hand.Evaluate(opp5 | boardmask, 7);
                        uint opp6HandVal = Hand.Evaluate(opp6 | boardmask, 7);
                        uint opp7HandVal = Hand.Evaluate(opp7 | boardmask, 7);
                        uint opp8HandVal = Hand.Evaluate(opp8 | boardmask, 7);
                        uint opp9HandVal = Hand.Evaluate(opp9 | boardmask, 7);

                        if (playerHandVal >= opp1HandVal && playerHandVal >= opp2HandVal &&
                            playerHandVal >= opp3HandVal && playerHandVal >= opp4HandVal &&
                            playerHandVal >= opp5HandVal && playerHandVal >= opp6HandVal &&
                            playerHandVal >= opp7HandVal && playerHandVal >= opp8HandVal &&
                            playerHandVal >= opp9HandVal)
                        {
                            player[HandType(playerHandVal)] += 1.0;
                        }
                        playerCount++;

                        if (opp1HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp1HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp2HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp2HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp3HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp3HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp4HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp4HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp5HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp5HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp6HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp6HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp7HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp7HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp8HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp8HandVal)] += 1.0;
                        }
                        OpponentCount++;

                        if (opp9HandVal >= playerHandVal)
                        {
                            opponent[HandType(opp8HandVal)] += 1.0;
                        }
                        OpponentCount++;
                    }

                    for (int i = 0; i < 9; i++)
                    {
                        player[i] = player[i] / playerCount;
                        opponent[i] = opponent[i] / OpponentCount;
                    }

                    return;
                default:
                    Debug.Assert(false); // Should never get here
                    return;
            }
        }