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