// On a knock-out, reduce the dimension of the joint distribution array and renormalize it public void KnockOutFilter(int SittingOrder, int DiscardedValue) { Debug.Assert(SittingOrder != MySittingOrder); Debug.Assert(DiscardedValue >= CardController.VALUE_GUARD && DiscardedValue <= CardController.VALUE_PRINCESS); int CardIndex = DiscardedValue - 1; int HiddenHandIndex = GetHiddenHandIndex(SittingOrder); // Account for the discared card AccountForCard(DiscardedValue); // Merge down the current matrix to one dimension lower, taking the slice that corresponds to the knocked-out player's actual hand if (CurrentOpponentCount == 3) { TwoOpponentsHandsDistribution = ThreeOpponentsHandsDistribution.GetSlice(HiddenHandIndex, CardIndex); TwoOpponentsHandsDistribution.Renormalize(); // Also, we move out the knocked-out player's sitting order to the last place of the HiddenHands array AIUtil.ShiftToLast(ref HiddenHands, HiddenHandIndex); } else if (CurrentOpponentCount == 2) { SingleOpponentHandDistribution = TwoOpponentsHandsDistribution.GetSlice(HiddenHandIndex, CardIndex); SingleOpponentHandDistribution.Renormalize(); AIUtil.ShiftToLast(ref HiddenHands, HiddenHandIndex); } // Update player situation CurrentOpponentCount -= 1; PlayerIsKnockedOut[SittingOrder] = true; }