public Manager()
 {
     board = new Board();
     players = new List<Player>();
     dead = new List<Player>();
     random = new Random();
     shuffledTokens = new List<TerritoryToken>();
     am = new AlphaManager();
 }
 public object Clone()
 {
     Board ret = new Board();
     List<Continent> cloneContinents = new List<Continent>();
     foreach (Continent c in continents)
     {
         cloneContinents.Add((Continent)c.Clone());
     }
     List<Territory> cloneTerritories = new List<Territory>();
     foreach (Territory t in territories)
     {
         cloneTerritories.Add((Territory)t.Clone());
     }
     ret.continents = cloneContinents;
     ret.territories = cloneTerritories;
     return ret;
 }
 public override void TradeCards(Board board)
 {
     if (cards.Count > 2)
     {
         if (cards.Count > 5)
         {
             //force to trade
         }
         //ask to trade
     }
     //tell not enough cards
 }
        public Territory bestReinforce(Board board, Player player)
        {
            float best = 0;
            float territoryValue = 0;
            List<Territory> bestTerritories = new List<Territory>();
            Territory bestTerritory = null;
            Territory biggest = null;
            Board cloneBoard = (Board)board.Clone();
            Player clonePlayer = (Player)player.Clone();

            foreach (Territory t in clonePlayer.territories)
            {
                foreach (Territory adj in t.adjacent)
                {
                    if (adj.owner.name != clonePlayer.name)
                    {
                        if (biggest == null || adj.armies > biggest.armies)
                            biggest = adj;
                        if (adj.armies < t.armies)
                            territoryValue += 1 + alpha[0];
                        territoryValue += 1 + alpha[1];
                        Continent adjParent = getParentContinent(board, adj);
                        int ownedTerInCont = continentTerritoriesOwned(adjParent, t.owner);
                        if ((ownedTerInCont + 1) == adjParent.territories.Count || (ownedTerInCont + 2) == adjParent.territories.Count)
                            territoryValue += 5 + alpha[2];
                        if (adj.owner.territories.Count <= 4)
                            territoryValue += 3 + alpha[3];
                    }
                }
                if (biggest == null)
                    territoryValue += (0 - t.armies) + alpha[4];
                else
                    territoryValue += (biggest.armies - t.armies) + alpha[5];
                //Adds the corrisponding alpha value of the territories parent continent
                Continent parent = getParentContinent(board, t);
                switch (parent.name)
                {
                    case "North America":
                        territoryValue += alpha[10];
                        break;
                    case "South America":
                        territoryValue += alpha[11];
                        break;
                    case "Europe":
                        territoryValue += alpha[12];
                        break;
                    case "Africa":
                        territoryValue += alpha[13];
                        break;
                    case "Asia":
                        territoryValue += alpha[14];
                        break;
                    case "Australia":
                        territoryValue += alpha[15];
                        break;
                }
                //Add value if the reinforcement is next to the needed territory to complete a continent
                //Add value if the reinforcement is next to a players last reinforcement
                if (territoryValue > best)
                {
                    best = territoryValue;
                    bestTerritories.Clear();
                    bestTerritories.Add(t);
                }
                else if (territoryValue == best)
                {
                    bestTerritories.Add(t);
                }
                territoryValue = 0;
                biggest = null;
            }
            if (bestTerritories.Count > 1)
            {
                Random rand = new Random();
                int select = rand.Next(bestTerritories.Count);
                bestTerritory = bestTerritories[select];
            }
            else if (bestTerritories.Count < 1)
            {
                bestTerritories.Add(null);
                bestTerritories.Add(null);
            }
            else
            {
                bestTerritory = bestTerritories[0];
            }
            return bestTerritory;
        }
        public override void ReinforcementPhase(Board board)
        {
            //Repeats until all reinforcements are used
            while (reinforcements > 0)
            {
                //Asks for which territory they want to place on.
                //Console.WriteLine("Choose a territory to place armies on.");
                //Console.WriteLine("Remaining reinforcements: {0}", reinforcements);

                //Shows all territories
                for (int i = 0; i < territories.Count; i++)
                {
                    //Console.WriteLine((i + 1) + ". {0}, armies: {1}", territories[i].name, territories[i].armies);
                }

                //Gets input and grabs the appropriate territory
                int input = int.Parse(Console.ReadLine());
                Territory toPlaceOn = territories[(input - 1)];

                input = -1;
                //Asks how many armies to place on the territory
                while (input > reinforcements || input < 0)
                {
                    //Console.WriteLine("How many armies do you want to place on {0}?", toPlaceOn.name);
                    input = int.Parse(Console.ReadLine());
                }
                //Places the armies
                toPlaceOn.armies += input;
                reinforcements -= input;

            }
        }
 public abstract void GetReinforcements(Board board);
 public abstract void ReinforcementPhase(Board board);
        public override bool AttackPhase(Board board, List<Player> players, List<Player> dead)
        {
            //Make attack?
            //Perform attack
            Die die = new Die();
            int attackDice = 0;
            int defendDice = 0;
            List<Territory> attackTerritories = new List<Territory>();
            List<Territory> cloneTerritories = new List<Territory>();
            List<Territory> lastAttack = new List<Territory>();
            attackTerritories.Add(null);
            attackTerritories.Add(null);
            cloneTerritories.Add(null);
            cloneTerritories.Add(null);
            lastAttack.Add(null);
            lastAttack.Add(null);
            List<int> attackRolls = new List<int>();
            List<int> defendRolls = new List<int>();
            bool started = false;
            while (((attackTerritories[0] != null && attackTerritories[1] != null) || !started) && territories.Count != board.territories.Count)
            {
                //Console.WriteLine("{0} is thinking...", this.name);
                started = true;
                cloneTerritories.Clear();
                cloneTerritories = calculator.bestAttack(board, this);
                attackTerritories.Clear();
                if (cloneTerritories[0] == null && cloneTerritories[1] == null)
                    break;
                attackTerritories.Add(board.territories.Where(x => x.name == cloneTerritories[0].name).First());
                attackTerritories.Add(board.territories.Where(x => x.name == cloneTerritories[1].name).First());
                if (lastAttack[0] != null && lastAttack[1] != null)
                    if (attackTerritories[0].name == lastAttack[0].name &&
                       attackTerritories[1].name == lastAttack[1].name)
                        break;
                bool attackDone = false;

                while (!attackDone &&
                    attackTerritories[0].armies > 1 &&
                    attackTerritories[1].armies > 0 &&
                    territories.Count != board.territories.Count)
                {
                    lastAttack[0] = (Territory)attackTerritories[0].Clone();
                    lastAttack[1] = (Territory)attackTerritories[1].Clone();
                    if (attackTerritories[0].armies < attackTerritories[1].armies)
                        break;
                    //Console.WriteLine("Attacking {0} from {1}", attackTerritories[1].name, attackTerritories[0].name);
                    //Console.WriteLine("{0}: {1}\n{2}: {3}", attackTerritories[0].name, attackTerritories[0].armies, attackTerritories[1].name, attackTerritories[1].armies);
                    System.Threading.Thread.Sleep(0);
                    switch (attackTerritories[0].armies)
                    {
                        case 2:
                            attackDice = 1;
                            break;
                        case 3:
                            attackDice = 2;
                            break;
                        case 4:
                            attackDice = 3;
                            break;
                        default:
                            attackDice = 3;
                            break;
                    }

                    defendDice = attackTerritories[1].armies == 1 ? 1 : 2;

                    attackRolls = die.rollMultipleDice(attackDice).OrderByDescending(x => x).ToList();
                    defendRolls = die.rollMultipleDice(defendDice).OrderByDescending(x => x).ToList();

                    if (attackRolls[0] > defendRolls[0])
                    {
                        attackTerritories[1].armies--;
                    }
                    else
                    {
                        attackTerritories[0].armies--;
                    }
                    if (attackRolls.Count > 1 && defendRolls.Count > 1)
                    {
                        if (attackRolls[1] > defendRolls[1])
                        {
                            attackTerritories[1].armies--;
                        }
                        else
                        {
                            attackTerritories[0].armies--;
                        }

                    }
                    manager.vUpdateMap();
                    System.Threading.Thread.Sleep(0);
                    if (attackTerritories[0].armies < 2)
                        break;
                    else if (attackTerritories[1].armies < 1)
                    {
                        Player defeated = attackTerritories[1].owner;
                        //Console.WriteLine("{0} defeated {1} in {2} from {3}", this.name, defeated.name, attackTerritories[1].name, attackTerritories[0].name);
                        TakeOwnership(this, attackTerritories[1]);
                        attackTerritories[1].armies += attackRolls.Count;
                        attackTerritories[0].armies -= attackRolls.Count;

                        int halfAttack = attackTerritories[0].armies / 2;
                        if (halfAttack == 0)
                            halfAttack = 1;
                        if (attackTerritories[0].armies - 1 != 0)
                        {
                            attackTerritories[1].armies += halfAttack;
                            attackTerritories[0].armies -= halfAttack;
                        }

                        if (attackTerritories[0].armies == 0 ||
                            attackTerritories[1].armies == 0)
                            //Console.WriteLine("Something bad happened.");

                        attackDone = true;
                        manager.vUpdateMap();
                        System.Threading.Thread.Sleep(0);
                        if (defeated.territories.Count == 0)
                        {
                            foreach (Card card in defeated.cards)
                                cards.Add(card);
                            if (cards.Count > 4)
                                TradeCards(board);
                            //Console.WriteLine("{0} defeated!", defeated.name);
                            int toNull = players.IndexOf(defeated);
                            dead.Add((Player)players[toNull]);
                            players[toNull] = null;
                            System.Threading.Thread.Sleep(0);
                        }
                    }
                }

            }
            //Occupied?
            //Move armies
            //Player eliminated?
            //Take Cards
            //Trade if > 4
            return false;
        }
        public override bool AttackPhase(Board board, List<Player> players, List<Player> dead)
        {
            int input = -1;
            List<Territory> canAttack;
            List<Territory> attackableTerritories;
            Territory attacker;
            Territory defender;
            int attackDice = 0;
            int defendDice = 0;
            string output;
            int attackerLoss = 0;
            int defenderLoss = 0;

            //Sees if the player wants to attack
            while (input > 2 || input < 0)
            {
                //Console.WriteLine("Do you want to attack?\n1. Yes\n2. No");
                input = int.Parse(Console.ReadLine());
            }

            if (input == 1)
            {
                //Displays all territories that the player can attack from
                canAttack = territories.Where(x => x.armies > 1).ToList();
                input = -1;
                while (input > canAttack.Count || input < 0)
                {
                    //Console.WriteLine("Choose a territory to attack from?");
                    for (int i = 0; i < canAttack.Count; i++)
                    {
                        //Console.WriteLine("{0}. {1}: {2}", i + 1, canAttack[i].name, canAttack[i].armies);
                    }
                    input = int.Parse(Console.ReadLine());
                }

                attacker = canAttack[(input - 1)];

                input = -1;

                //Displays all the territories that the player can attack from the selected territory
                attackableTerritories = attacker.adjacent.Where(x => x.owner != attacker.owner).ToList();
                while (input > attackableTerritories.Count || input < 0)
                {
                    //Console.WriteLine("Choose a territory to attack?");
                    for (int i = 0; i < attackableTerritories.Count; i++)
                    {
                        //Console.WriteLine("{0}. {1}: {2}", i + 1, attackableTerritories[i].name, attackableTerritories[i].armies);
                    }
                    input = int.Parse(Console.ReadLine());
                }

                defender = attackableTerritories[(input - 1)];

                input = -1;

                //The roll loop
                while (input != 2)
                {
                    //Sees if the player wants to roll or retreat
                    //Console.WriteLine("1. Roll 2. Retreat\n{0}: {1}\n{2}: {3}", attacker.name, attacker.armies, defender.name, defender.armies);
                    input = int.Parse(Console.ReadLine());

                    if (input == 2)
                    {
                        input = -1;
                        break;
                    }
                    else
                    {
                        //Resets the input
                        input = -1;

                        //Rolls the dice and sets dice counts to max
                        Die die = new Die();
                        switch (attacker.armies)
                        {
                            case 2:
                                attackDice = 1;
                                break;
                            case 3:
                                attackDice = 2;
                                break;
                            default:
                                attackDice = 3;
                                break;
                        }
                        defendDice = defender.armies == 1 ? 1 : 2;

                        List<int> attackRolls = die.rollMultipleDice(attackDice).OrderByDescending(x => x).ToList();
                        List<int> defendRolls = die.rollMultipleDice(defendDice).OrderByDescending(x => x).ToList();

                        //Displays the attackers rolls
                        output = "Attacker: ";
                        for (int i = 0; i < attackRolls.Count - 1; i++)
                        {
                            output += attackRolls[i] + ", ";
                        }
                        output += attackRolls[attackRolls.Count - 1];
                        //Console.WriteLine(output);

                        //Displays the defenders rolls
                        output = "Defender: ";
                        for (int i = 0; i < defendRolls.Count - 1; i++)
                        {
                            output += defendRolls[i] + ", ";
                        }
                        output += defendRolls[defendRolls.Count - 1];
                        //Console.WriteLine(output);

                        //Calculates losses
                        if (attackRolls[0] > defendRolls[0])
                        {
                            defender.armies--;
                            defenderLoss++;
                        }
                        else
                        {
                            attacker.armies--;
                            attackerLoss++;
                        }
                        if (attackRolls.Count > 1 && defendRolls.Count > 1)
                        {
                            if (attackRolls[1] > defendRolls[1])
                            {
                                defender.armies--;
                                defenderLoss++;
                            }
                            else
                            {
                                attacker.armies--;
                                attackerLoss++;
                            }
                        }

                        //Displays the results of the skirmish
                        //Console.WriteLine("Attacker lost {0} armies and Defender lost {1} armies.", attackerLoss, defenderLoss);
                        attackerLoss = 0;
                        defenderLoss = 0;
                        if (attacker.armies < 2)
                        {
                            //Console.WriteLine("Not enough armies to attack.");
                            break;
                        }
                        else if (defender.armies < 1)
                        {
                            //Displays that you have conquered the territory
                            //Console.WriteLine("You defeated {0} in {1}.", defender.owner.name, defender.name);
                            Player defeated = defender.owner;

                            //Takes ownership and transfers the attacking armies
                            TakeOwnership(this, defender);
                            defender.armies += attackRolls.Count;
                            attacker.armies -= attackRolls.Count;

                            input = -1;
                            //Asks for how many armies to move mover
                            while (input > attacker.armies - 1 || input < 0)
                            {
                                //Console.WriteLine("How many armies do you want to move over?");
                                //Console.WriteLine("Available armies: {0}", attacker.armies - 1);
                                input = int.Parse(Console.ReadLine());
                            }

                            //Moves the armies over
                            attacker.armies -= input;
                            defender.armies += input;

                            //Console.WriteLine("{0}: {1}\n{2}: {3}", attacker.name, attacker.armies, defender.name, defender.armies);

                            //Checks to see if the opponent was eliminated
                            if (defeated.territories.Count == 0)
                            {
                                foreach (Card card in defeated.cards)
                                    cards.Add(card);
                                if (cards.Count > 4)
                                    TradeCards(board);
                                //Console.WriteLine("{0} defeated!", defeated.name);
                                int toNull = players.IndexOf(defeated);
                                dead.Add((Player)players[toNull].Clone());
                                players[toNull] = null;
                            }
                            input = 2;
                        }
                    }
                }
                return true;
            }
            else
                return false;
        }
 public override void PlaceReinforcement(Board board)
 {
     Territory toPlace = calculator.bestReinforce(board, this);
     if (toPlace == null)
     {
         Random rand = new Random();
         int select = rand.Next(territories.Count);
         toPlace = territories[select];
     }
     else
     {
         toPlace = territories.Where(x => x.name == toPlace.name).First();
     }
     toPlace.armies++;
     reinforcements--;
     //Select Territory
 }
 public override void ReinforcementPhase(Board board)
 {
     while (reinforcements > 0)
     {
         Territory toPlace = calculator.bestReinforce(board, this);
         if (toPlace == null)
         {
             Random rand = new Random();
             int select = rand.Next(territories.Count);
             toPlace = territories[select];
         }
         else
         {
             toPlace = territories.Where(x => x.name == toPlace.name).First();
         }
         toPlace.armies++;
         reinforcements--;
     }
     //While reinforcements are left
     //Select territory
     //Place armies
 }
        public override void FortifyPhase(Board board)
        {
            List<Territory> moveTerritories = calculator.bestMove(board, this);
            if (moveTerritories[0] != null && moveTerritories[1] != null)
            {
                moveTerritories[1].armies += moveTerritories[0].armies - 1;
                moveTerritories[0].armies = 1;
            }
            else
            {
                //Console.WriteLine("Making no move");
            }

            //Choose territory
            //Move armies
        }
 public Continent getParentContinent(Board board, Territory territory)
 {
     Continent parent = null;
     foreach (Continent c in board.continents)
     {
         foreach (Territory t in c.territories)
         {
             if (t.name == territory.name)
             {
                 parent = c;
                 break;
             }
         }
     }
     return parent;
 }
        public List<Territory> bestAttack(Board board, Player player)
        {
            float best = 0;
            float attackValue = 0;
            List<Territory> bestAttack = new List<Territory>();
            List<Territory> bestAttacks = new List<Territory>();
            Territory biggest = null;
            Board cloneBoard = (Board)board.Clone();
            Player clonePlayer = (Player)player.Clone();

            foreach (Territory t in clonePlayer.territories)
            {
                foreach (Territory adj in t.adjacent)
                {
                    if ((biggest == null || adj.armies > biggest.armies) && adj.owner.name != player.name)
                        biggest = adj;
                }
                foreach (Territory adj in t.adjacent)
                {
                    if (adj.owner.name != clonePlayer.name && t.armies > 1)
                    {
                        attackValue = (t.armies - adj.armies) + alpha[6];
                        if (playerOwnsContinent(getParentContinent(board, adj), adj.owner))
                        {
                            attackValue += 5 + alpha[7];
                        }
                        int contTerrOwned = continentTerritoriesOwned(getParentContinent(board, adj), t.owner);
                        if ((contTerrOwned + 1) == getParentContinent(board, adj).territories.Count || (contTerrOwned + 2) == getParentContinent(board, adj).territories.Count)
                        {
                            attackValue += 5 + alpha[8];
                        }

                        attackValue += ((float)contTerrOwned / (float)getParentContinent(board, adj).territories.Count) + alpha[9];

                        Continent parent = getParentContinent(board, adj);
                        switch (parent.name)
                        {
                            case "North America":
                                attackValue += alpha[10];
                                break;
                            case "South America":
                                attackValue += alpha[11];
                                break;
                            case "Europe":
                                attackValue += alpha[12];
                                break;
                            case "Africa":
                                attackValue += alpha[13];
                                break;
                            case "Asia":
                                attackValue += alpha[14];
                                break;
                            case "Australia":
                                attackValue += alpha[15];
                                break;
                        }

                        //if adj.owner contains all territories in that continent,
                        //add a large value to attack value.
                        //add continent ownership percentage
                        //if t.owner is missing only one from that continent and adj is it,
                        //add a large value to the attack value.
                        if (attackValue > best)
                        {
                            best = attackValue;
                            bestAttacks.Clear();
                            bestAttacks.Add(t);
                            bestAttacks.Add(adj);
                        }
                        else if (attackValue == best)
                        {
                            bestAttacks.Add(t);
                            bestAttacks.Add(adj);
                        }
                    }
                }
                biggest = null;
            }
            if (bestAttacks.Count > 2)
            {
                Random rand = new Random();
                int select = rand.Next((bestAttacks.Count / 2));
                bestAttack.Add(bestAttacks[select * 2]);
                bestAttack.Add(bestAttacks[(select * 2) + 1]);
            }
            else if (best < 1)
            {
                bestAttack.Clear();
                bestAttack.Add(null);
                bestAttack.Add(null);
            }
            else
            {
                bestAttack.Add(bestAttacks[0]);
                bestAttack.Add(bestAttacks[1]);
            }
            return bestAttack;
        }
 public abstract bool AttackPhase(Board board, List<Player> players, List<Player> dead);
        public override void FortifyPhase(Board board)
        {
            Territory toMoveFrom;
            Territory toMoveTo;
            int numArmiesToMove = 0;
            int input = -1;

            while (input > 2 || input < 0)
            {
                //Console.WriteLine("Do you want to fortify a territory?\n1. Yes\n2. No");
                input = int.Parse(Console.ReadLine());
            }

            if (input == 1)
            {
                input = -1;
                while (input > territories.Count || input < 0)
                {
                    //Asks for which territory they want to move to
                    //Console.WriteLine("Choose a territory to move armies from.");

                    //Shows all territories
                    for (int i = 0; i < territories.Count; i++)
                    {
                        //Console.WriteLine("{0}. {1}, available armies: {2}", i + 1, territories[i].name, territories[i].armies);
                    }
                    input = int.Parse(Console.ReadLine());
                }

                //Gets input and grabs the appropriate territory
                toMoveFrom = territories[(input - 1)];

                input = -1;
                //Asks how many armies to move to the territory
                while (input > toMoveFrom.adjacent.Count || input < 0)
                {
                    //Console.WriteLine("Choose a territory to move the armies to.");
                    for (int i = 0; i < toMoveFrom.adjacent.Count; i++)
                    {
                        //Console.WriteLine("{0}. {1}, armies: {2}", i + 1, toMoveFrom.adjacent[i].name, toMoveFrom.adjacent[i].armies);
                    }
                    input = int.Parse(Console.ReadLine());
                }
                toMoveTo = toMoveFrom.adjacent[(input - 1)];

                input = -1;
                while (input > toMoveFrom.armies - 1 || input < 0)
                {
                    //Console.WriteLine("How many armies do you want to move over?\n{0}-{1}", 0, toMoveFrom.armies - 1);
                    input = int.Parse(Console.ReadLine());
                }
                numArmiesToMove = input;

                //moves the armies
                toMoveFrom.armies -= numArmiesToMove;
                toMoveTo.armies += numArmiesToMove;
            }
        }
 public abstract void FortifyPhase(Board board);
        public override void GetReinforcements(Board board)
        {
            int min = 3;
            int total = territories.Count / 3;
            reinforcements += min > total ? min : total;

            foreach (Continent c in board.continents)
            {
                bool containsAll = true;
                foreach (Territory t in c.territories)
                {
                    if (!(territories.Contains(t)))
                    {
                        containsAll = false;
                        break;
                    }
                }
                if (containsAll)
                {
                    reinforcements += c.value;
                }
            }
        }
 public abstract void PlaceReinforcement(Board board);
        public override void PlaceReinforcement(Board board)
        {
            //Asks for which territory they want to place on.
            //Console.WriteLine("Choose a territory to place 1 army.");
            //Console.WriteLine("Remaining reinforcements: {0}", reinforcements);

            //Shows all territories
            for (int i = 0; i < territories.Count; i++)
            {
                //Console.WriteLine((i + 1) + ". {0}, armies: {1}", territories[i].name, territories[i].armies);
            }

            //Gets input and adds one army to that territory
            int input = int.Parse(Console.ReadLine());
            territories[(input - 1)].armies++;
            reinforcements--;
        }
 public abstract void TradeCards(Board board);
        public List<Territory> bestMove(Board board, Player player)
        {
            List<Territory> moveTerritories = new List<Territory>();
            Board cloneBoard = (Board)board.Clone();
            Player clonePlayer = (Player)player.Clone();
            List<Territory> isolatedTerritories = new List<Territory>();
            List<Territory> emptyIsolated = new List<Territory>();
            List<Territory> adjToIsolatedTerritories = new List<Territory>();
            bool isIsolated = true;

            List<Territory> bestTerritories = new List<Territory>();
            Territory bestTerritory = null;
            Territory bestIsolated = null;

            foreach (Territory t in clonePlayer.territories)
            {
                foreach (Territory adj in t.adjacent)
                {
                    if (adj.owner.name != clonePlayer.name)
                    {
                        isIsolated = false;
                    }
                }
                if (isIsolated && t.armies > 1)
                {
                    isolatedTerritories.Add(t);
                }
                else if (isIsolated && t.armies == 1)
                {
                    emptyIsolated.Add(t);
                }
                isIsolated = true;
            }

            if (isolatedTerritories.Count < 1)
            {
                moveTerritories.Add(null);
                moveTerritories.Add(null);
                return moveTerritories;
            }
            else
            {
                bestIsolated = null;
                foreach (Territory t in isolatedTerritories)
                {
                    if (bestIsolated == null || t.armies > bestIsolated.armies)
                        bestIsolated = t;
                    foreach (Territory adj in t.adjacent)
                    {
                        if (adj.owner.name == clonePlayer.name &&
                            !adjToIsolatedTerritories.Exists(x => x.name == adj.name) &&
                            !isolatedTerritories.Exists(x => x.name == adj.name))
                            adjToIsolatedTerritories.Add(adj);
                    }

                }
                moveTerritories.Clear();
                moveTerritories.Add(bestIsolated);

                foreach (Territory t in bestIsolated.adjacent)
                {
                    foreach (Territory adj in adjToIsolatedTerritories)
                    {
                        if (t.name == adj.name && !(emptyIsolated.Contains(adj)) && (bestTerritory == null || adj.armies < bestTerritory.armies))
                        {
                            bestTerritory = adj;
                        }
                    }
                }
                moveTerritories.Add(bestTerritory);
            }
            return moveTerritories;
        }