//all the logic that makes the units do their actions and make the game function
        public void GameLogic(unit[] arrUnits)
        {
            gameRounds++;
            Random rnd = new Random();
            bool   death;
            string direction;

            direction = " ";

            death = false;

            OutputString = "";
            for (int i = 0; i < this.arrUnits.Length; i++)
            {
                death = this.arrUnits[i].Death();



                unit closestunit = this.arrUnits[i].ClosestUnit(arrUnits);
                if (arrUnits[i].unitName == "Wizard")
                {                      //wizard check
                    if (death == true) //death check
                    {
                        arrUnits[i].HP = 0;
                    }
                    else
                    {
                        if (this.arrUnits[i] == closestunit)
                        {
                            closestunit = arrUnits[i].ClosestUnit(arrUnits);
                        }                                                   //makes sure closest unit worked correctly
                        else
                        {
                            this.arrUnits[i].AttackRange(closestunit);                  //checks if target is in range
                            if (this.arrUnits[i].HP <= (this.arrUnits[i].maxHP * 0.50)) //checks if units health is low enough to run away
                            {                                                           //makes unit run away in random direction
                                string randomDirection;
                                int    random;

                                random = rnd.Next(1, 5);

                                if (random == 1)
                                {
                                    randomDirection = "left";
                                }
                                else if (random == 2)
                                {
                                    randomDirection = "right";
                                }
                                else if (random == 3)
                                {
                                    randomDirection = "up";
                                }
                                else
                                {
                                    randomDirection = "down";
                                }

                                this.arrUnits[i].Move(randomDirection);

                                this.arrUnits[i].HP += 4;
                            }
                            else
                            {     //if hp above runaway amount
                                if (this.arrUnits[i].isAttacking == true)
                                { //makes unit attack
                                    Wizard unit = (Wizard)arrUnits[i];
                                    unit.WizardAOE(this.arrUnits);
                                }
                                else
                                {//makes unit move closer to target
                                    int oldX, oldY;
                                    oldX      = this.arrUnits[i].xPos;
                                    oldY      = this.arrUnits[i].yPos;
                                    direction = Direction(this.arrUnits[i], closestunit);
                                    this.arrUnits[i].Move(direction);
                                    map.MapUpdate(this.arrUnits[i], oldX, oldY);
                                }
                            }
                        }
                    }//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                }
                else
                {
                    if (death == true)
                    {
                        arrUnits[i].HP = 0;
                    }
                    else
                    {
                        Building closestBuilding = this.arrUnits[i].ClosestUnit(map.arrBuildings);


                        //sees if the building or unit is closer so that it knows witch one to attack
                        int xDistb     = Math.Abs(this.arrUnits[i].xPos - closestBuilding.xPos);
                        int yDistb     = Math.Abs(this.arrUnits[i].yPos - closestBuilding.yPos);
                        int totalDistb = xDistb + yDistb;

                        int xDistu     = Math.Abs(this.arrUnits[i].xPos - closestunit.xPos);
                        int yDistu     = Math.Abs(this.arrUnits[i].yPos - closestunit.yPos);
                        int totalDistu = xDistu + yDistu;



                        if (totalDistb < totalDistu && closestBuilding.hP > 0)
                        {//if building is closer
                            this.arrUnits[i].AttackRange(closestBuilding);
                            if (this.arrUnits[i].HP <= (this.arrUnits[i].maxHP * 0.25))
                            {
                                string randomDirection;
                                int    random;

                                random = rnd.Next(1, 5);

                                if (random == 1)
                                {
                                    randomDirection = "left";
                                }
                                else if (random == 2)
                                {
                                    randomDirection = "right";
                                }
                                else if (random == 3)
                                {
                                    randomDirection = "up";
                                }
                                else
                                {
                                    randomDirection = "down";
                                }

                                this.arrUnits[i].Move(randomDirection);

                                this.arrUnits[i].HP += 2;
                            }
                            else
                            {
                                if (this.arrUnits[i].isAttacking == true)
                                {
                                    this.arrUnits[i].Combat(closestBuilding);
                                }
                                else
                                {
                                    int oldX, oldY;
                                    oldX      = this.arrUnits[i].xPos;
                                    oldY      = this.arrUnits[i].yPos;
                                    direction = Direction(this.arrUnits[i], closestBuilding);
                                    this.arrUnits[i].Move(direction);
                                    map.MapUpdate(this.arrUnits[i], oldX, oldY);
                                }
                            }
                        }
                        else
                        {//if unit is closer
                            if (this.arrUnits[i] == closestunit)
                            {
                                closestunit = arrUnits[i].ClosestUnit(arrUnits);
                            }
                            else
                            {
                                this.arrUnits[i].AttackRange(closestunit);
                                if (this.arrUnits[i].HP <= (this.arrUnits[i].maxHP * 0.25))
                                {
                                    string randomDirection;
                                    int    random;

                                    random = rnd.Next(1, 5);

                                    if (random == 1)
                                    {
                                        randomDirection = "left";
                                    }
                                    else if (random == 2)
                                    {
                                        randomDirection = "right";
                                    }
                                    else if (random == 3)
                                    {
                                        randomDirection = "up";
                                    }
                                    else
                                    {
                                        randomDirection = "down";
                                    }

                                    this.arrUnits[i].Move(randomDirection);

                                    this.arrUnits[i].HP += 2;
                                }
                                else
                                {
                                    if (this.arrUnits[i].isAttacking == true)
                                    {
                                        this.arrUnits[i].Combat(closestunit);
                                    }
                                    else
                                    {
                                        int oldX, oldY;
                                        oldX      = this.arrUnits[i].xPos;
                                        oldY      = this.arrUnits[i].yPos;
                                        direction = Direction(this.arrUnits[i], closestunit);
                                        this.arrUnits[i].Move(direction);
                                        map.MapUpdate(this.arrUnits[i], oldX, oldY);
                                    }
                                }
                            }
                        }
                    }
                }


                //compiles a string to output all the tostring stats of the units
                OutputString += "\n" + this.arrUnits[i].ToString();



                OutputString += "\n";
            }

            buildingOutput = " ";

            for (int i = 0; i < map.arrBuildings.Length; i++)
            {//buildings do their actions
                string   buildingType = map.arrBuildings[i].GetType().ToString();
                string[] buildingArr  = buildingType.Split('.');
                buildingType = buildingArr[buildingArr.Length - 1];

                //typecheck and explicit cast
                if (buildingType == "ResourceBuilding")
                {
                    ResourceBuilding building = (ResourceBuilding)map.arrBuildings[i];
                    if (building.Death() == true)
                    {
                    }  //death check
                    else
                    {
                        building.ResourceManagement();
                        if (building.team == "Team1")
                        {//checks team and adds to their resources that have been gathered
                            t1Resources += building.resourcesGeneratedPerRound;
                        }
                        else
                        {
                            t2Resources += building.resourcesGeneratedPerRound;
                        }
                    }
                }
                else if (buildingType == "FactoryBuilding")
                {
                    FactoryBuilding building = (FactoryBuilding)map.arrBuildings[i];

                    if (building.Death() == true)
                    {
                    }
                    else
                    {
                        if (building.team == "Team1")
                        {
                            if (t1Resources >= 60)
                            {//checks team and if there are enough resources to be able to spawn a unit and subtracts from the total gathered resources if it creates a unit
                                Array.Resize(ref this.arrUnits, this.arrUnits.Length + 1);;
                                this.arrUnits[this.arrUnits.Length - 1] = building.CreateUnit();
                                map.arrUnits = this.arrUnits;
                                t1Resources -= 60;
                            }
                        }
                        else
                        {
                            if (t2Resources >= 60)
                            {
                                Array.Resize(ref this.arrUnits, this.arrUnits.Length + 1);;
                                this.arrUnits[this.arrUnits.Length - 1] = building.CreateUnit();
                                map.arrUnits = this.arrUnits;
                                t2Resources -= 60;
                            }
                        }
                    }
                }//outputs the buildings tostring
                buildingOutput += "\n" + map.arrBuildings[i].toString();
                buildingOutput += "\n";
            }//makes sure the two unit arrays dont differ
            map.arrUnits = this.arrUnits;
        }
        //
        public void GameLogic(unit[] arrUnits)
        {
            gameRounds++;
            Random rnd = new Random();
            bool   death;
            string direction;

            direction = " ";

            death = false;

            OutputString = "";
            for (int i = 0; i < this.arrUnits.Length; i++)
            {
                death = this.arrUnits[i].Death();
                if (death == true)
                {
                    this.arrUnits[i].HP = 0;
                }
                else
                {
                    unit closestunit;
                    closestunit = this.arrUnits[i].ClosestUnit(arrUnits);
                    if (this.arrUnits[i] == closestunit)
                    {
                    }
                    else
                    {
                        this.arrUnits[i].AttackRange(closestunit);
                        if (this.arrUnits[i].HP <= (this.arrUnits[i].maxHP * 0.25))
                        {
                            string randomDirection;
                            int    random;

                            random = rnd.Next(1, 5);

                            if (random == 1)
                            {
                                randomDirection = "left";
                            }
                            else if (random == 2)
                            {
                                randomDirection = "right";
                            }
                            else if (random == 3)
                            {
                                randomDirection = "up";
                            }
                            else
                            {
                                randomDirection = "down";
                            }

                            this.arrUnits[i].Move(randomDirection);

                            this.arrUnits[i].HP += 2;
                        }
                        else
                        {
                            if (this.arrUnits[i].isAttacking == true)
                            {
                                this.arrUnits[i].Combat(closestunit);
                            }
                            else
                            {
                                int oldX, oldY;
                                oldX      = this.arrUnits[i].xPos;
                                oldY      = this.arrUnits[i].yPos;
                                direction = Direction(this.arrUnits[i], closestunit);
                                this.arrUnits[i].Move(direction);
                                map.MapUpdate(this.arrUnits[i], oldX, oldY);
                            }
                        }
                    }
                }
                OutputString += "\n" + this.arrUnits[i].ToString();



                OutputString += "\n";
            }

            buildingOutput = " ";

            for (int i = 0; i < map.arrBuildings.Length; i++)
            {
                string   buildingType = map.arrBuildings[i].GetType().ToString();
                string[] buildingArr  = buildingType.Split('.');
                buildingType = buildingArr[buildingArr.Length - 1];


                if (buildingType == "ResourceBuilding")
                {
                    ResourceBuilding building = (ResourceBuilding)map.arrBuildings[i];
                    if (building.Death() == true)
                    {
                    }
                    else
                    {
                        building.ResourceManagement();
                    }
                }
                else if (buildingType == "FactoryBuilding")
                {
                    FactoryBuilding building = (FactoryBuilding)map.arrBuildings[i];

                    if (building.Death() == true)
                    {
                    }
                    else
                    {
                        if ((gameRounds % building.productionSpeed) == 0)
                        {
                            Array.Resize(ref this.arrUnits, this.arrUnits.Length + 1);;
                            this.arrUnits[this.arrUnits.Length - 1] = building.CreateUnit();
                        }
                    }
                }
                buildingOutput += "\n" + map.arrBuildings[i].toString();
                buildingOutput += "\n";
            }
        }