Esempio n. 1
0
        public static Moves CalculateGuessedOpponentTakeOverMoves(BotMain state, List <BotTerritory> territories, PlayerIDType opponentID, bool doesOpponentDeploy, BotTerritory.DeploymentType conservativeLevel)
        {
            var opponentIncome = state.Settings.MinimumArmyBonus;

            if (conservativeLevel == BotTerritory.DeploymentType.Conservative)
            {
                opponentIncome = state.GetGuessedOpponentIncome(opponentID, state.VisibleMap);
            }

            var ownedTerritories = territories.Where(o => o.OwnerPlayerID == state.Me.ID).ToList();
            var opponentAttacks  = CalculateMinimumOpponentMoves(state, opponentID, ownedTerritories, conservativeLevel);

            if (opponentAttacks.GetTotalDeployment() > opponentIncome)
            {
                return(null);
            }

            if (doesOpponentDeploy)
            {
                var remainingOpponentIncome = opponentIncome - opponentAttacks.GetTotalDeployment();
                while (remainingOpponentIncome > 0 && opponentAttacks.Orders.OfType <BotOrderAttackTransfer>().Any())
                {
                    foreach (var atm in opponentAttacks.Orders.OfType <BotOrderAttackTransfer>())
                    {
                        atm.Armies = atm.Armies.Add(new Armies(1));
                        remainingOpponentIncome--;
                        if (remainingOpponentIncome == 0)
                        {
                            break;
                        }
                    }
                }
            }
            return(opponentAttacks);
        }
Esempio n. 2
0
        /// <summary>Tries to find an attack move to make the support move obsolete.</summary>
        private BotOrderAttackTransfer GetSubstituteMove(BotOrderAttackTransfer supportMove, BotMap movesMap, List <BotOrder> unhandledMoves)
        {
            var territoryToDefend   = supportMove.To;
            var mmTerritoryToDefend = movesMap.Territories[territoryToDefend.ID];

            if (mmTerritoryToDefend.GetOpponentNeighbors().Count > 1)
            {
                return(null);
            }

            var mmOpponentTerritory = mmTerritoryToDefend.GetOpponentNeighbors()[0];

            foreach (var unhandledMove in unhandledMoves.OfType <BotOrderAttackTransfer>())
            {
                if (unhandledMove.To.ID == mmOpponentTerritory.ID)
                {
                    if (!CanOpponentAttackTerritory(mmOpponentTerritory.OwnerPlayerID, unhandledMove.From))
                    {
                        if (unhandledMove.Armies.AttackPower * BotState.Settings.OffensiveKillRate > mmOpponentTerritory.Armies.DefensePower + BotState.GetGuessedOpponentIncome(mmOpponentTerritory.OwnerPlayerID, BotState.VisibleMap) + 3)
                        {
                            return(unhandledMove);
                        }
                    }
                }
            }
            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);
         }
     }
 }
Esempio n. 4
0
 private static bool IsRiskyAttackPresent(BotMain state, Moves movesSoFar)
 {
     foreach (var atm in movesSoFar.Orders.OfType <BotOrderAttackTransfer>())
     {
         if (state.IsOpponent(atm.To.OwnerPlayerID))
         {
             var attackingArmies   = atm.Armies;
             var maxOpponentArmies = atm.To.Armies.Add(new Armies(state.GetGuessedOpponentIncome(atm.To.OwnerPlayerID, state.VisibleMap)));
             if (attackingArmies.AttackPower > 1 && attackingArmies.AttackPower * state.Settings.OffensiveKillRate <= maxOpponentArmies.DefensePower * state.Settings.DefensiveKillRate)
             {
                 return(true);
             }
         }
     }
     return(false);
 }
Esempio n. 5
0
        private static int CalculateAmountOfSafeMoves(BotMain state, Moves movesSoFar)
        {
            var outvar = 0;

            foreach (var atm in movesSoFar.Orders.OfType <BotOrderAttackTransfer>())
            {
                if (atm.Armies.AttackPower <= 1 || state.IsOpponent(atm.To.OwnerPlayerID))
                {
                    outvar++;
                }
                else
                {
                    var maxOpponentArmies = atm.To.Armies.Add(new Armies(state.GetGuessedOpponentIncome(atm.To.OwnerPlayerID, state.VisibleMap)));
                    var attackingArmies   = atm.Armies;
                    if (attackingArmies.AttackPower * state.Settings.OffensiveKillRate > maxOpponentArmies.DefensePower * state.Settings.DefensiveKillRate)
                    {
                        outvar++;
                    }
                }
            }
            return(outvar);
        }
        /// <summary>Returns the needed moves to defend the territory.</summary>
        /// <remarks>
        /// Returns the needed moves to defend the territory. If not possible then returns null. If no defense needed returns
        /// empty moves. First tries to fulfill the needed armies with background armies.
        /// </remarks>
        /// <param name="territoryToDefend"></param>
        /// <param name="maxDeployment"></param>
        /// <returns></returns>
        public Moves CalculateDefendTerritoryTask(BotTerritory territoryToDefend, int maxDeployment, bool useBackgroundArmies, BotTerritory.DeploymentType lowerConservativeLevel, BotTerritory.DeploymentType upperConservativeLevel)
        {
            var outvar       = new Moves();
            var oppNeighbors = territoryToDefend.GetOpponentNeighbors();

            if (oppNeighbors.Count == 0)
            {
                return(null);
            }

            var maxOpponentDeployment = oppNeighbors.Select(o => o.OwnerPlayerID).Distinct().Max(o => BotState.GetGuessedOpponentIncome(o, BotState.VisibleMap));

            for (var i = 0; i < maxOpponentDeployment; i++)
            {
                var defendMoves = CalculateDefendTerritoryMoves(territoryToDefend, maxDeployment, useBackgroundArmies, i, lowerConservativeLevel, upperConservativeLevel);
                if (defendMoves != null)
                {
                    outvar = defendMoves;
                }
                else
                {
                    return(outvar);
                }
            }
            return(null);
        }