コード例 #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
        /// <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);
            }
        }
コード例 #3
0
        private int GetMissingArmies(BotTerritory expandingTerritory, BotTerritory toBeTakenTerritory, Moves madeExpansionDecisions, BotTerritory.DeploymentType conservativeLevel)
        {
            var idleArmies = GetOverflowIdleArmies(expandingTerritory, madeExpansionDecisions);
            var toBeTakenTerritoryArmies = toBeTakenTerritory.GetArmiesAfterDeploymentAndIncomingAttacks
                                               (conservativeLevel);
            var neededArmies = toBeTakenTerritory.getNeededBreakArmies(toBeTakenTerritory.Armies.DefensePower);

            if (idleArmies.AttackPower >= neededArmies)
            {
                return(0);
            }
            else
            {
                return(neededArmies - idleArmies.AttackPower);
            }
        }