Exemple #1
0
        // TODO weitermachen
        private void DeleteBadTransferMoves(Moves movesSoFar)
        {
            var interestingTransfers = new List <BotOrderAttackTransfer>();

            foreach (var atm in movesSoFar.Orders.OfType <BotOrderAttackTransfer>())
            {
                if (atm.Armies.AttackPower > 1 && atm.To.OwnerPlayerID == BotState.Me.ID && atm.From.GetTotalDeployment(BotTerritory.DeploymentType.Normal) > 0)
                {
                    interestingTransfers.Add(atm);
                }
            }
            foreach (var atm_1 in interestingTransfers)
            {
                var deploymentToShift = Math.Min(atm_1.From.GetTotalDeployment(BotTerritory.DeploymentType.Normal), atm_1.Armies.AttackPower);
                atm_1.Armies = atm_1.Armies.Subtract(new Armies(deploymentToShift));
                var pam = new BotOrderDeploy(BotState.Me.ID, atm_1.To, deploymentToShift);
                MovesCommitter.CommittPlaceArmiesMove(pam);
                movesSoFar.AddOrder(pam);
                foreach (var oldDeployment in atm_1.From.GetDeployment(BotTerritory.DeploymentType.Normal))
                {
                    while (deploymentToShift > 0)
                    {
                        if (oldDeployment.Armies > 0)
                        {
                            deploymentToShift--;
                            oldDeployment.Armies = oldDeployment.Armies - 1;
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }
        }
        /// <summary>Calculates the necessary moves to take the specified territories to take.</summary>
        /// <param name="maxDeployment">the maximum allowed deployment. If no deployment constraint then put -1.
        /// </param>
        /// <param name="territoriesToTake">the territories that should be taken this turn.</param>
        /// <returns>the necessary moves to take the territories or null if no solution was found.
        /// </returns>
        public Moves CalculateTakeTerritoriesTask(int maxDeployment, List <BotTerritory> territoriesToTake, BotTerritory.DeploymentType conservativeLevel, string attackSource)
        {
            var outvar = new Moves();

            if (maxDeployment == -1)
            {
                maxDeployment = int.MaxValue;
            }

            var stillAvailableDeployment = maxDeployment;

            foreach (var missingTerritory in territoriesToTake)
            {
                var bestNeighborTerritory  = GetBestNeighborTerritory(missingTerritory, outvar, territoriesToTake);
                var missingTerritoryArmies = missingTerritory.GetArmiesAfterDeploymentAndIncomingAttacks(conservativeLevel);
                var neededAttackArmies     = missingTerritory.getNeededBreakArmies(missingTerritory.Armies.DefensePower);
                //var neededAttackArmies = (int)Math.Round(missingTerritoryArmies.DefensePower / BotState.Settings.OffensiveKillRate);
                var missingArmies = GetMissingArmies(bestNeighborTerritory, missingTerritory, outvar, conservativeLevel);
                if (missingArmies > stillAvailableDeployment)
                {
                    return(null);
                }

                if (missingArmies > 0)
                {
                    var pam = new BotOrderDeploy(BotState.Me.ID, bestNeighborTerritory, missingArmies);
                    outvar.AddOrder(pam);
                    stillAvailableDeployment -= missingArmies;
                }
                outvar.AddOrder(new BotOrderAttackTransfer(BotState.Me.ID, bestNeighborTerritory, missingTerritory, new Armies(neededAttackArmies), attackSource));
            }
            return(outvar);
        }
        public Moves CalculateOneStepExpandBonusTask(int maxDeployment, BotBonus bonus, bool acceptStackOnly, BotMap workingMap, BotTerritory.DeploymentType conservativeLevel)
        {
            var outvar = new Moves();

            if (maxDeployment == -1)
            {
                maxDeployment = 1000;
            }

            var visibleNeutralTerritories = bonus.GetVisibleNeutralTerritories();
            var territoriesToRemove       = new List <BotTerritory>();

            foreach (var territory in visibleNeutralTerritories)
            {
                if (workingMap.Territories[territory.ID].OwnerPlayerID == BotState.Me.ID)
                {
                    territoriesToRemove.Add(territory);
                }
            }

            visibleNeutralTerritories.RemoveAll(territoriesToRemove);
            if (visibleNeutralTerritories.Count == 0)
            {
                return(null);
            }

            var sortedNeutralTerritories = BotState.TerritoryValueCalculator.SortExpansionValue(visibleNeutralTerritories);
            var territoryToTake          = new List <BotTerritory>();

            territoryToTake.Add(sortedNeutralTerritories[0]);
            var takeTerritoryMoves = CalculateTakeTerritoriesTask(-1, territoryToTake, conservativeLevel, "CalculateOneStepExpandBonusTask");

            if (takeTerritoryMoves.GetTotalDeployment() > maxDeployment)
            {
                if (acceptStackOnly)
                {
                    if (maxDeployment > 0)
                    {
                        var territoryToDeploy = takeTerritoryMoves.Orders.OfType <BotOrderDeploy>().First().Territory;
                        var pam = new BotOrderDeploy(BotState.Me.ID, territoryToDeploy, maxDeployment);
                        outvar.AddOrder(pam);
                        return(outvar);
                    }
                    else
                    {
                        return(null);
                    }
                }
                else
                {
                    return(null);
                }
            }
            else
            {
                outvar = takeTerritoryMoves;
                return(outvar);
            }
        }
        /// <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);
            }
        }
        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);
            }
        }
 public void GuessOpponentDeployment(PlayerIDType opponentID)
 {
     Assert.Fatal(BotState.NumberOfTurns != -1);
     if (BotState.NumberOfTurns == 0)
     {
         foreach (var vmTerritory in BotState.VisibleMap.OpponentTerritories(opponentID))
         {
             var armies = BotState.Settings.MinimumArmyBonus;
             MovesCommitter.CommittPlaceArmiesMove(new BotOrderDeploy(opponentID, vmTerritory, armies));
         }
     }
     else
     {
         foreach (var vmTerritory1 in BotState.VisibleMap.OpponentTerritories(opponentID))
         {
             var lvmTerritory = BotState.LastVisibleMapX.Territories[vmTerritory1.ID];
             var guessedOpponentDeployment = 0;
             if (lvmTerritory.IsVisible && lvmTerritory.OwnerPlayerID == opponentID)
             {
                 var opponentIncome = BotState.GetGuessedOpponentIncome(opponentID, BotState.VisibleMap);
                 guessedOpponentDeployment = Math.Min(lvmTerritory.GetTotalDeployment(BotTerritory.DeploymentType.Normal), opponentIncome);
                 if (HasDeploymentReasonDisapeared(lvmTerritory, vmTerritory1))
                 {
                     var boundDeployment = GetBoundOpponentDeployment(opponentID, vmTerritory1);
                     var maxDeployment   = BotState.GetGuessedOpponentIncome(opponentID, BotState.VisibleMap) - boundDeployment;
                     guessedOpponentDeployment = Math.Min(5, maxDeployment);
                 }
             }
             else
             {
                 var boundDeployment = GetBoundOpponentDeployment(opponentID, vmTerritory1);
                 var maxDeployment   = BotState.GetGuessedOpponentIncome(opponentID, BotState.VisibleMap) - boundDeployment;
                 guessedOpponentDeployment = Math.Max(1, Math.Min(5, maxDeployment));
             }
             var pam = new BotOrderDeploy(opponentID, vmTerritory1, guessedOpponentDeployment);
             MovesCommitter.CommittPlaceArmiesMove(pam);
             var conservativePam = new BotOrderDeploy(opponentID, vmTerritory1, BotState.GetGuessedOpponentIncome(opponentID, BotState.VisibleMap));
             MovesCommitter.CommittPlaceArmiesMove(conservativePam, BotTerritory.DeploymentType.Conservative);
         }
     }
 }