コード例 #1
0
        public static Moves CalculateBreakTerritoryTask(BotMain state, BotTerritory opponentTerritory, int maxDeployment, BotTerritory.DeploymentType conservativeLevel)
        {
            var outvar                  = new Moves();
            var opponentArmies          = opponentTerritory.GetArmiesAfterDeploymentAndIncomingAttacks(conservativeLevel);
            var neededAttackArmies      = opponentTerritory.getNeededBreakArmies(opponentArmies.DefensePower);
            var ownedNeighbors          = opponentTerritory.GetOwnedNeighbors();
            var presortedOwnedNeighbors = state.TerritoryValueCalculator.SortDefenseValue(ownedNeighbors);
            var sortedOwnedNeighbors    = BotMap.GetOrderedListOfTerritoriesByIdleArmies(presortedOwnedNeighbors);
            var territoryToUse          = sortedOwnedNeighbors[0];
            var idleArmies              = territoryToUse.GetIdleArmies();
            var neededDeployment        = Math.Max(0, neededAttackArmies - idleArmies.AttackPower);

            if (neededDeployment > maxDeployment)
            {
                return(null);
            }

            if (neededDeployment > 0)
            {
                outvar.AddOrder(new BotOrderDeploy(state.Me.ID, territoryToUse, neededDeployment));
            }

            Armies attackArmies = new Armies(neededAttackArmies);

            //var atm = new BotOrderAttackTransfer(state.Me.ID, territoryToUse, opponentTerritory, idleArmies.Add(new Armies(neededDeployment)), "OneHitBreakTerritoryTask");
            var atm = new BotOrderAttackTransfer(state.Me.ID, territoryToUse, opponentTerritory, attackArmies, "OneHitBreakTerritoryTask");

            outvar.AddOrder(atm);
            return(outvar);
        }
コード例 #2
0
        private Moves CalculateAttackNeutralMoves(BotTerritory neutralTerritory, int maxDeployment)
        {
            Moves outvar             = null;
            var   neededAttackArmies = neutralTerritory.getNeededBreakArmies(neutralTerritory.Armies.DefensePower);
            var   ownedNeighbors     = neutralTerritory.GetOwnedNeighbors();
            var   bestNeighbor       = ownedNeighbors[0];

            foreach (var ownedNeighbor in ownedNeighbors)
            {
                if (ownedNeighbor.GetIdleArmies().AttackPower > bestNeighbor.GetIdleArmies().ArmiesOrZero)
                {
                    bestNeighbor = ownedNeighbor;
                }
            }
            var neededDeployment = Math.Max(0, neededAttackArmies - bestNeighbor.GetIdleArmies().ArmiesOrZero);

            if (neededDeployment <= maxDeployment)
            {
                outvar = new Moves();
                if (neededDeployment > 0)
                {
                    outvar.AddOrder(new BotOrderDeploy(BotState.Me.ID, bestNeighbor, neededDeployment));
                }

                var atm = new BotOrderAttackTransfer(BotState.Me.ID, bestNeighbor, neutralTerritory, new Armies(neededAttackArmies), "PreventOpponentExpandBonusTask");
                // TODO bad?
                if (bestNeighbor.GetOpponentNeighbors().Count == 0)
                {
                    atm.Message = AttackMessage.Snipe;
                }

                outvar.AddOrder(atm);
            }
            return(outvar);
        }
コード例 #3
0
        private int GetOpponentNeededDeployment(BotTerritory opponentTerritory)
        {
            var neededDeployment = 0;

            if (opponentTerritory.AttackTerritoryValue < TerritoryValueCalculator.LOWEST_MEDIUM_PRIORITY_VALUE)
            {
                return(0);
            }

            var ourAttackingArmies = 0;

            foreach (var ownedNeighbor in opponentTerritory.GetOwnedNeighbors())
            {
                ourAttackingArmies += ownedNeighbor.Armies.AttackPower - BotState.MustStandGuardOneOrZero;
            }

            if (opponentTerritory.AttackTerritoryValue > TerritoryValueCalculator.LOWEST_HIGH_PRIORITY_VALUE)
            {
                ourAttackingArmies += 5;
            }

            // TODO adapt to no luck
            neededDeployment = Math.Max(0, (int)Math.Round(ourAttackingArmies * BotState.Settings.OffenseKillRate));

            return(neededDeployment);
        }
コード例 #4
0
        private List <BotTerritory> GetNeighborsWithIdleArmies(BotTerritory territoryToDefend)
        {
            var unsortedNeighbors = new List <BotTerritory>();

            foreach (var ownedNeighbor in territoryToDefend.GetOwnedNeighbors())
            {
                if (ownedNeighbor.GetOpponentNeighbors().Count == 0 && ownedNeighbor.GetIdleArmies().NumArmies > 0)
                {
                    unsortedNeighbors.Add(ownedNeighbor);
                }
            }
            // Sort according to the amount of idle armies
            var outvar = new List <BotTerritory>();

            while (unsortedNeighbors.Count != 0)
            {
                var biggestIdleArmyTerritory = unsortedNeighbors[0];
                foreach (var territory in unsortedNeighbors)
                {
                    if (territory.GetIdleArmies().AttackPower > biggestIdleArmyTerritory.GetIdleArmies().AttackPower)
                    {
                        biggestIdleArmyTerritory = territory;
                    }
                }
                outvar.Add(biggestIdleArmyTerritory);
                unsortedNeighbors.Remove(biggestIdleArmyTerritory);
            }
            return(outvar);
        }
コード例 #5
0
        /// <remarks>
        /// Calculates the highest defense territory value of a bordering territory that the opponent might break from his slippery territory. If there is no such territory then returns -1.
        /// </remarks>
        /// <param name="opponentTerritory"></param>
        /// <returns></returns>
        private int GetSlipperyOpponentTerritoryNumber(BotTerritory slipperyOpponentTerritory)
        {
            List <BotTerritory> territoriesOpponentMightBreak = new List <BotTerritory>();
            var opponentIncome          = BotState.GetGuessedOpponentIncome(slipperyOpponentTerritory.OwnerPlayerID, BotState.VisibleMap);
            var opponentAttackingArmies = opponentIncome + slipperyOpponentTerritory.Armies.AttackPower - BotState.MustStandGuardOneOrZero;
            var neededArmiesForDefense  = (int)Math.Round(opponentAttackingArmies * BotState.Settings.OffensiveKillRate);

            foreach (var ownedNeighbor in slipperyOpponentTerritory.GetOwnedNeighbors())
            {
                if (ownedNeighbor.GetArmiesAfterDeploymentAndIncomingMoves().DefensePower < neededArmiesForDefense)
                {
                    territoriesOpponentMightBreak.Add(ownedNeighbor);
                }
            }
            var sortedOwnedNeighbors = BotState.TerritoryValueCalculator.SortDefenseValue(territoriesOpponentMightBreak);

            if (sortedOwnedNeighbors.Count > 0)
            {
                return(sortedOwnedNeighbors[0].DefenceTerritoryValue);
            }
            else
            {
                return(-1);
            }
        }
コード例 #6
0
        private BotTerritory GetBestNeighborTerritory(BotTerritory missingTerritory, Moves madeExpansionDecisions, List <BotTerritory> territoriesToTake)
        {
            var ownedNeighbors          = missingTerritory.GetOwnedNeighbors();
            var presortedOwnedNeighbors = BotState.TerritoryValueCalculator.SortDefenseValueFullReturn
                                              (ownedNeighbors);
            var maximumIdleArmies = 0;

            // First calculate the maximum amount of armies of an owned neighbor.
            foreach (var ownedNeighbbor in presortedOwnedNeighbors)
            {
                var idleArmies = GetOverflowIdleArmies(ownedNeighbbor, madeExpansionDecisions);
                if (idleArmies.NumArmies > maximumIdleArmies)
                {
                    maximumIdleArmies = idleArmies.NumArmies;
                }
            }
            // Second calculate the owned neighbor having the maximum amount of idle armies while having a minimum amount of sill missing neighbors.
            var          minimumMissingNeighbors = 1000;
            BotTerritory outvar = null;

            foreach (var ownedNeighbor in presortedOwnedNeighbors)
            {
                var missingNeighborTerritories = GetStillMissingNeighborTerritories(ownedNeighbor, madeExpansionDecisions, territoriesToTake).Count;
                if (GetOverflowIdleArmies(ownedNeighbor, madeExpansionDecisions).NumArmies == maximumIdleArmies && missingNeighborTerritories < minimumMissingNeighbors)
                {
                    outvar = ownedNeighbor;
                    minimumMissingNeighbors = missingNeighborTerritories;
                }
            }
            if (outvar == null)
            {
                outvar = presortedOwnedNeighbors[0];
            }
            return(outvar);
        }
コード例 #7
0
        /// <param name="opponentTerritory"></param>
        /// <param name="maxDeployment"></param>
        /// <returns></returns>
        public static Moves CalculateAttackTerritoryTask(BotMain state, BotTerritory opponentTerritory, int maxDeployment)
        {
            var outvar                  = new Moves();
            var ownedNeighbors          = opponentTerritory.GetOwnedNeighbors();
            var presortedOwnedNeighbors = state.TerritoryValueCalculator.SortDefenseValue(ownedNeighbors
                                                                                          );
            var sortedOwnedNeighbors = BotMap.GetOrderedListOfTerritoriesByIdleArmies(
                presortedOwnedNeighbors);

            // Calculate the attacks
            for (var i = 0; i < sortedOwnedNeighbors.Count; i++)
            {
                var attackingTerritory = sortedOwnedNeighbors[i];
                if (i == 0 && maxDeployment > 0)
                {
                    var pam = new BotOrderDeploy(state.Me.ID, attackingTerritory, maxDeployment);
                    outvar.AddOrder(pam);
                    if (attackingTerritory.GetIdleArmies().AttackPower + maxDeployment > 1)
                    {
                        var atm = new BotOrderAttackTransfer(state.Me.ID, attackingTerritory, opponentTerritory, attackingTerritory.GetIdleArmies().Add(new Armies(maxDeployment)), "AttackTerritoriesTask1");
                        outvar.AddOrder(atm);
                    }
                }
                else
                {
                    if (attackingTerritory.GetIdleArmies().AttackPower > 1)
                    {
                        var atm = new BotOrderAttackTransfer(state.Me.ID, attackingTerritory, opponentTerritory, attackingTerritory.GetIdleArmies(), "AttackTerritoriesTask2");
                        outvar.AddOrder(atm);
                    }
                }
            }
            // Check if we are killing more or equal armies than the opponent
            // double currentOpponentArmies = opponentTerritory.ArmiesAfterDeployment;
            var    currentOpponentArmies = opponentTerritory.GetArmiesAfterDeploymentAndIncomingAttacks(BotTerritory.DeploymentType.Normal).DefensePower;
            double opponentKills         = 0;
            double ownKills = 0;

            foreach (var atm_1 in outvar.Orders.OfType <BotOrderAttackTransfer>())
            {
                int ourKills = opponentTerritory.getOwnKills(atm_1.Armies.AttackPower, currentOpponentArmies);
                //var ourKills = Math.Min(currentOpponentArmies, atm_1.Armies.AttackPower * state.Settings.OffensiveKillRate);
                var opponentKillsAttack = Math.Min(atm_1.Armies.AttackPower, currentOpponentArmies * state.Settings.DefenseKillRate);
                ownKills             += ourKills;
                opponentKills        += opponentKillsAttack;
                currentOpponentArmies = Math.Max(0, currentOpponentArmies - ourKills);
            }
            if (ownKills >= opponentKills && outvar.Orders.OfType <BotOrderAttackTransfer>().Any())
            {
                return(outvar);
            }
            else
            {
                return(null);
            }
        }
コード例 #8
0
        private Moves CalculateBreakTerritoryMoves(BotTerritory opponentTerritory, int maxDeployment, int opponentDeployment, string source)
        {
            var outvar         = new Moves();
            var opponentArmies = opponentTerritory.Armies.DefensePower;

            opponentArmies += opponentDeployment;
            var neededAttackArmies = opponentTerritory.getNeededBreakArmies(opponentArmies);
            //var neededAttackArmies = SharedUtility.Round(opponentArmies / BotState.Settings.OffensiveKillRate);
            var ownedNeighbors          = opponentTerritory.GetOwnedNeighbors();
            var presortedOwnedNeighbors = BotState.TerritoryValueCalculator.SortDefenseValue(ownedNeighbors);
            var sortedOwnedNeighbors    = BotMap.GetOrderedListOfTerritoriesByIdleArmies(
                presortedOwnedNeighbors);
            // First deploy and then pull in more territories if necessary.
            // First deploy and then pull in more territories if necessary.
            var attackedWithSoFar = 0;

            for (var i = 0; i < sortedOwnedNeighbors.Count; i++)
            {
                if (i == 0)
                {
                    var neededDeployment = Math.Max(0, neededAttackArmies - sortedOwnedNeighbors[0].GetIdleArmies().NumArmies);
                    var totalDeployment  = Math.Min(neededDeployment, maxDeployment);
                    if (totalDeployment > 0)
                    {
                        var pam = new BotOrderDeploy(BotState.Me.ID, sortedOwnedNeighbors[0], totalDeployment);
                        outvar.AddOrder(pam);
                    }
                    var attackingArmies = Math.Min(neededAttackArmies, sortedOwnedNeighbors[0].GetIdleArmies().NumArmies + totalDeployment);

                    outvar.AddOrder(new BotOrderAttackTransfer(BotState.Me.ID, sortedOwnedNeighbors[0], opponentTerritory, new Armies(attackingArmies), source));
                    attackedWithSoFar += attackingArmies;
                }
                else
                {
                    // i != 0
                    var stillNeededArmies = neededAttackArmies - attackedWithSoFar;
                    if (stillNeededArmies > 0 && sortedOwnedNeighbors[i].GetIdleArmies().NumArmies > 1)
                    {
                        var newAttackingArmies = Math.Min(stillNeededArmies, sortedOwnedNeighbors[i].GetIdleArmies().NumArmies);
                        outvar.AddOrder(new BotOrderAttackTransfer(BotState.Me.ID, sortedOwnedNeighbors[i], opponentTerritory, new Armies(newAttackingArmies), "BreakTerritoryTask2"));
                        attackedWithSoFar += newAttackingArmies;
                    }
                }
            }
            if (attackedWithSoFar >= neededAttackArmies)
            {
                return(outvar);
            }
            else
            {
                return(null);
            }
        }
コード例 #9
0
ファイル: DefendBonusTask.cs プロジェクト: Norman1/WarLightAI
        private static int GetAmountOfTerritoriesUnderThreat(BotTerritory threateningTerritory, BotBonus bonus)
        {
            var outvar = 0;

            foreach (var neighbor in threateningTerritory.GetOwnedNeighbors())
            {
                if (neighbor.Details.PartOfBonuses.Contains(bonus.ID))
                {
                    outvar++;
                }
            }
            return(outvar);
        }