private double GetFailureProbabilityForSuit(int cards, int discards, CardSuit suit) { int cardSet = BitwiseCardHelper.GetCardSet(cards, suit); int discardsCount = BitwiseCardHelper.GetSuitCount(discards, suit); int otherSuitsDistribution = CardSuitDistribution.GetDistribution(cards, discards, suit); return(MisereProbabilities.GetFailureProbability(cardSet, discardsCount, otherSuitsDistribution, IsFirstHand)); }
protected override double EvaluateCards(int cards, int discards) { Debug.Assert(BitwiseCardHelper.GetCardCount(cards) == 10); int trumpCount = BitwiseCardHelper.GetSuitCount(cards, mTrumpSuit); // Don't consider trump game if the number of trumps is less than 4. // TODO Consider 3-3-3-1. if (trumpCount < 4) { return(double.MinValue); } IEnumerable <TrickProbability> totalProbabilities = Enumerable.Empty <TrickProbability>(); // Calculate sum of tricks with corresponding probabilities in all suits. for (var suit = CardSuit.Spades; suit <= CardSuit.Hearts; suit++) { int cardSet = BitwiseCardHelper.GetCardSet(cards, suit); IEnumerable <TrickProbability> probabilities = TrickPlayProbabilities.GetTrickProbabilities(cardSet); // Combine probabilities.. totalProbabilities = totalProbabilities.Combine(probabilities); } bool isEasyLevel = (Game.Options.DifficultyLevel == GameDifficultyLevel.Beginner) || (Game.Options.DifficultyLevel == GameDifficultyLevel.Amateur); // The following stuff is too complex for weak players. if (!isEasyLevel) { totalProbabilities = ConsiderTrumpAdvancing(totalProbabilities); totalProbabilities = ConsiderTrickTaking(totalProbabilities); } return(totalProbabilities.Expectation( tricks => Game.Rules.GetGameCost( GameType.TrickPlay, Game.Options.NumberOfPlayers, DeclaredTricks, tricks))); }