Пример #1
0
        public MultiMoves CalculateTakeTerritoriesMoves(List <TerritoryIDType> territoriesToTake, MultiMoves precondition)
        {
            MultiMoves             resultMoves           = precondition.Clone();
            List <TerritoryIDType> territoriesToTakeCopy = new List <TerritoryIDType>(territoriesToTake);


            while (territoriesToTakeCopy.Count > 0)
            {
                var reachableTerritories = FilterNonBorderingTerritories(territoriesToTakeCopy, resultMoves);
                if (reachableTerritories.Count == 0)
                {
                    return(null);
                }
                var bestStartTerritory  = GetBestAttackingTerritory(reachableTerritories, resultMoves);
                var bestAttackTerritory = GetBestAttackTerritory(reachableTerritories, territoriesToTakeCopy, bestStartTerritory, resultMoves);
                int neededAttackArmies  = AttackInformer.GetNeededBreakArmies
                                              (resultMoves.GetTerritoryStandingsAfterAllMoves()[bestAttackTerritory].NumArmies.ArmiesOrZero);
                GameOrderAttackTransfer attackOrder = GameOrderAttackTransfer.Create
                                                          (GameState.MyPlayerId, bestStartTerritory, bestAttackTerritory, AttackTransferEnum.AttackTransfer, new Armies(neededAttackArmies), REASON);

                var  standing       = resultMoves.GetTerritoryStandingsAfterAllMoves().Where(o => o.Key == attackOrder.From).First().Value;
                int  leftoverArmies = standing.NumArmies.ArmiesOrZero - standing.ArmiesMarkedAsUsed.ArmiesOrZero - 1;
                int  armiesToPump   = Math.Max(0, attackOrder.NumArmies.ArmiesOrZero - leftoverArmies);
                bool successfull    = resultMoves.PumpArmies(attackOrder.From, armiesToPump, REASON);
                if (!successfull)
                {
                    return(null);
                }
                resultMoves.AddAttackOrder(attackOrder);
                territoriesToTakeCopy.Remove(bestAttackTerritory);
            }

            return(resultMoves);
        }
Пример #2
0
        private int GetClassification(GameOrderAttackTransfer attackMove)
        {
            var  initialState              = GameState.CurrentTurn().LatestTurnStanding.Territories;
            bool opponentAttack            = initialState[attackMove.To].OwnerPlayerID == GameState.OpponentPlayerId;
            var  attackFromNeighbors       = MapInformer.GetNeighborTerritories(initialState[attackMove.From].ID);
            var  opponentTerritories       = MapInformer.GetOwnedTerritories(initialState.Values.ToList(), GameState.OpponentPlayerId);
            var  opponentNeighboringAttack = false;

            foreach (var opponentTerritory in opponentTerritories)
            {
                if (attackFromNeighbors.Contains(opponentTerritory.ID))
                {
                    opponentNeighboringAttack = true;
                }
            }
            bool clearOpponentBreak = false;
            int  opponentIncome     = GameState.CurrentTurn().Incomes[GameState.OpponentPlayerId].FreeArmies;
            int  maxOpponentArmies  = 0;

            if (opponentAttack)
            {
                maxOpponentArmies = initialState[attackMove.To].NumArmies.ArmiesOrZero + opponentIncome;
                int maxNeededArmies = AttackInformer.GetNeededBreakArmies(maxOpponentArmies);
                if (attackMove.NumArmies.ArmiesOrZero >= maxNeededArmies)
                {
                    clearOpponentBreak = true;
                }
            }
            bool isTransfer  = initialState[attackMove.To].OwnerPlayerID == GameState.MyPlayerId;
            bool isExpansion = initialState[attackMove.To].IsNeutral;

            if (clearOpponentBreak)
            {
                return(1);
            }
            if (isTransfer)
            {
                return(2);
            }
            if (isExpansion && !opponentNeighboringAttack)
            {
                return(3);
            }
            if (isExpansion && opponentNeighboringAttack)
            {
                return(4);
            }
            // non clear opponent attacks
            return(5);
        }