Esempio n. 1
0
        private static int RemainingArmiesAfterFullScaleAssault(int defendingArmies, List <Region> attackingRegions, int attackingBonusArmies)
        {
            foreach (var neighbor in attackingRegions)
            {
                BattleResult result = BattleAnalysis.AnalyzeBattle(confidence, defendingArmies, neighbor.Armies + attackingBonusArmies);
                defendingArmies      = result.DefenderRemainingArmies;
                attackingBonusArmies = 0; // we only want the bonus applied once so set to zero after first pass
            }

            return(defendingArmies);
        }
Esempio n. 2
0
        public static Dictionary <int, int> RemainingArmiesAfterFullScaleAssault(int defendingArmies, List <Tuple <Region, int> > attackingRegionArmies)
        {
            var remainingArmies = new Dictionary <int, int>();

            foreach (var attackingRegion in attackingRegionArmies)
            {
                BattleResult result = BattleAnalysis.AnalyzeBattle(confidence, defendingArmies, attackingRegion.Item2);
                defendingArmies = result.DefenderRemainingArmies;
                remainingArmies.Add(attackingRegion.Item1.Id, result.AttackerRemainingArmiesLow);

                // no need for any other regions to participate if the enemy is destroyed
                if (defendingArmies == 0)
                {
                    break;
                }
            }

            remainingArmies.Add(-1, defendingArmies);
            return(remainingArmies);
        }
        public static int MaximumArmiesNecessaryToConquer(float confidenceForDefiniteWin, float confidenceForPossibleWin, int defenderArmies, int maxAttackerArmiesAvailable)
        {
            int  armiesNeeded = 0;
            bool defeated;

            do
            {
                armiesNeeded = System.Math.Min(armiesNeeded + 2, maxAttackerArmiesAvailable);
                BattleResult result = AnalyzeBattle(confidenceForDefiniteWin, defenderArmies, armiesNeeded);
                defeated = result.AttackerExpectedToWinForSure();
            } while (!defeated && armiesNeeded < maxAttackerArmiesAvailable);

            // Putting this here so that we don't throw armies away on battles we absolutely cannot win
            if (!defeated)
            {
                BattleResult result = AnalyzeBattle(confidenceForPossibleWin, defenderArmies, maxAttackerArmiesAvailable);
                armiesNeeded = (result.AttackerExpectedToWinAtAll()) ? maxAttackerArmiesAvailable : int.MaxValue;
            }

            return(armiesNeeded);
        }
        /// <param name="confidence">Probability that the true result will fall within the low and high numbers in the predicted result</param>
        /// <param name="defenderArmies"></param>
        /// <param name="attackerArmies"></param>
        /// <returns></returns>
        public static BattleResult AnalyzeBattle(float confidence, int defenderArmies, int attackerArmies)
        {
            var result = new BattleResult(confidence, defenderArmies, attackerArmies);

            return(result);
        }