Ejemplo n.º 1
0
        // 01. Armies needed to combat and result
        private void InitCombat()
        {
            // Reset to my armies only
            SuperRegion.Regions.ForEach(R =>
            {
                R.SimulateArmies = R.CurrentPlayer.Is(PlayerType.Me) ? R.CurrentArmies : 0;
                R.SimulatePlayer = R.CurrentPlayer;
            }
                                        );

            // Insert intial net armies
            Connections.ForEach(Conn =>
            {
                int attackersNeeded = Combat.AttackersNeeded(Conn.TargetRegion.CurrentArmies);
                int attackersLosses = Combat.AttackersLosses(Conn.TargetRegion.CurrentArmies);
                Conn.SourceRegion.SimulateArmies -= attackersNeeded;
                Conn.TargetRegion.SimulateArmies += (attackersNeeded - attackersLosses);
            }
                                );
        }
Ejemplo n.º 2
0
        public static List <AttackTransfer> GetAttackTransferList()
        {
            List <AttackTransfer> AT = new List <AttackTransfer>();

            // Try fighting with all my regions
            IEnumerable <Region> regionsMe = Map.Current.Regions.Player(PlayerType.Me).Where(R => R.CurrentArmies >= 3);

            // OneWay out -> go for it !!
            foreach (Connection OneWayOut in MeOneOther())
            {
                if (Combat.AttackersNeeded(OneWayOut.TargetRegion.CurrentArmies) < OneWayOut.SourceRegion.CurrentArmies)
                {
                    AT.Add(AddAttack(OneWayOut.SourceRegion, OneWayOut.TargetRegion, OneWayOut.SourceRegion.CurrentArmies - 1));
                }
            }

            foreach (Region rm in regionsMe)
            {
                // find opponent neighbours (biggest first)
                IEnumerable <Region> ros = rm.Neighbours.Where(N => N.CurrentPlayer.Is(PlayerType.Opponent))
                                           .OrderByDescending(N => N.CurrentArmies);
                if (ros.Any())
                {
                    foreach (Region ro in ros)
                    {
                        int goNext = 2;
                        if ((goNext > 0) && (rm.CurrentArmies > ro.ArmiesToAttack))
                        {
                            AT.Add(AddAttack(rm, ro,
                                             Math.Max(rm.CurrentArmies / rm.Neighbours.Count(N => N.CurrentPlayer.In(PlayerType.NotMe)),
                                                      Combat.AttackersNeeded(ro.CurrentArmies + 5))));
                        }
                        else
                        {
                            goNext--;
                        }
                    }
                }
                else
                {
                    // find neutral neighbours (biggest first)
                    IEnumerable <Region> rns = rm.Neighbours.Where(N => N.CurrentPlayer.Is(PlayerType.Neutral))
                                               .OrderByDescending(N => N.CurrentArmies);
                    if (rns.Any())
                    {
                        int maxOpponent = rns.FirstOrDefault().CurrentArmies;
                    }

                    foreach (Region rn in rns)
                    {
                        if (rm.CurrentArmies >= (2 * rn.CurrentArmies))
                        {
                            AT.Add(AddAttack(rm, rn, (rn.CurrentArmies * 2 - 1)));
                        }
                    }
                }
            }

            // move armies to front
            IEnumerable <Region> saveArea = Map.Current.Regions.Where(R =>
                                                                      (R.CurrentPlayer.Is(PlayerType.Me)) &&
                                                                      (R.CurrentArmies > 1) &&
                                                                      (R.DangerousBorderDistance > 1));

            foreach (Region saveRegion in saveArea)
            {
                IEnumerable <Region> buren = saveRegion.Neighbours
                                             .Where(N =>
                                                    N.CurrentPlayer.In(PlayerType.Me) &&
                                                    (N.DangerousBorderDistance < saveRegion.DangerousBorderDistance))
                                             .OrderBy(N => N.DangerousBorderDistance);
                if (buren.Any())
                {
                    AT.Add(AddAttack(saveRegion, buren.First(), saveRegion.CurrentArmies - 1));
                }
            }

            return(AT);
        }