public AI( Grid _grid, Grid _gridTopBar, Player _player, int difficulty)
        {
            aiTower = new Tower(2000, 50, 250, 1, false, _grid, _gridTopBar);
            player = _player;
            grid = _grid;

            switch (difficulty)
            {
                case 1:
                    _op = 0.6;
                    _chanceToGenSoldier = 120000;
                    _chanceToUpgradeTower = 100000;
                    _towerLVlimit = 1;
                    _soldierLimit = 10;
                    _canCounterAttack = false;
                    break;
                case 2:
                    _op = 1;
                    _chanceToGenSoldier = 85000;
                    _chanceToUpgradeTower = 50000;
                    _towerLVlimit = 3;
                    _soldierLimit = 15;
                    _canCounterAttack = true;
                    break;
                case 3:
                    _op = 1.5;
                    _chanceToGenSoldier = 60000;
                    _chanceToUpgradeTower = 10000;
                    _towerLVlimit = 5;
                    _soldierLimit = 15;
                    _canCounterAttack = true;
                    break;
                case 4:
                    _op = 3;
                    _chanceToGenSoldier = 50000;
                    _chanceToUpgradeTower = 1000;
                    _towerLVlimit = 10;
                    _soldierLimit = 20;
                    _canCounterAttack = true;
                    break;
                default:
                    MessageBox.Show("AI Difficulty Error");
                    break;
            }
        }
 public Player( Grid grid1, Grid _gridTopBar)
 {
     grid = grid1;
     _money = 5000;      // 初始資金
     _towerUpgradePrice = 100; //塔升級費用
     moneyGainSpeed = 10;
     myTower = new Tower(2000, 50, 250, 1, true, grid1, _gridTopBar);
     lbMoney = new Label();
     lbMoney.Margin = new Thickness(938, 0, 0, 270);
     lbMoney.VerticalAlignment = VerticalAlignment.Bottom;
     lbMoney.HorizontalAlignment = HorizontalAlignment.Left;
     lbMoney.Width = 120;
     lbMoney.Height = 25;
     lbMoney.HorizontalContentAlignment = HorizontalAlignment.Right;
     lbMoney.BorderBrush = System.Windows.Media.Brushes.Black;
     lbMoney.FontWeight = FontWeights.Bold;
     lbMoney.BorderThickness = new System.Windows.Thickness(1, 1, 1, 1);
     grid1.Children.Add(lbMoney);
 }
 public void MaintainSolidersPosition(List<Soldier> enemyS, Tower enemyTower)
 {
     for (int i = 0; i <soldier.Count; i++)
     {
         // 每個士兵該往前的往前,該打的打
         soldier[i].Move(enemyS, enemyTower);
         // Checking life
         if (soldier[i].HP <= 0)
         {
             grid.Children.Remove(soldier[i].LifeCheck());
             soldier.RemoveAt(i);
         }
     }
     for (int i = 0; i < enemyS.Count; i++)
     {
         if (enemyS[i].HP <= 0)
         {
             EarnMoney(enemyS[i].PRICE);
             grid.Children.Remove( enemyS[i].LifeCheck());
             enemyS.RemoveAt(i);
         }
     }
 }
 public void MaintainSolidersPosition(List<Soldier> enemyS, Tower enemyTower)
 {
     for (int i = 0; i <soldier.Count; i++)
     {
         soldier[i].Move(enemyS, enemyTower);
     }
 }
        public override bool Attack(Tower Enemy)
        {
            int movePerStepX = this.RANGE / 10 ;
            if (Math.Abs(Enemy.POSITION - this.POSITION) <= this.RANGE)
            {
                bool isShooted = false; //如果已開槍,則在未打到目標前 isShooted == true
                if (bullet == null && counter == this.APS-15)
                {
                    grid.Children.Add(BulletShow()); //把子彈放進Grid
                }
                if (counter >= this.APS-15)
                    isShooted = true;

                if ((++counter % this.APS) == 0) //控制攻速
                {
                    counter = 0;
                    Enemy.GetHurt(this.ATK);
                    grid.Children.Remove(bullet);
                    bullet = null;
                }
                else
                {
                    if (bullet != null && isShooted)
                    {
                        if (isEnemy)
                        {
                            bullet.Margin = new System.Windows.Thickness(0, 0, bullet.Margin.Right - movePerStepX, bullet.Margin.Bottom );
                        }
                        else
                        {
                            bullet.Margin = new System.Windows.Thickness(0, 0, bullet.Margin.Right + movePerStepX, bullet.Margin.Bottom );
                        }
                    }
                }
                if (!isAttack) //判斷是否需要換gif圖
                {
                    if (imgSourceAttack == null)
                        imgSourceAttack = imgSourceMove.Replace("Move", "Attack");
                    //MessageBox.Show(imgSourceAttack);

                    var _image = new BitmapImage();
                    _image.BeginInit();
                    _image.UriSource = new Uri(imgSourceAttack, UriKind.Absolute);
                    _image.EndInit();
                    ImageBehavior.SetAnimatedSource(Image, _image);
                    Image.Width = Image.ActualWidth + 15;
                    spImg.Width = Image.Width;

                    isAttack = true;
                }

                return true;
            }
            else
            {
              //  if (bullet != null)
                grid.Children.Remove(bullet);
                bullet = null;
                return false;
            }
        }
        public void Move(List<Soldier> enemyS, Tower enemyTower)
        {
            if (!Attack(enemyS) && !Attack(enemyTower))
            {
                if (isAttack) //判斷是否要換gif
                {
                    if (_imageMove == null)
                    {
                        _imageMove = new BitmapImage();
                        _imageMove.BeginInit();
                        _imageMove.UriSource = new Uri(imgSourceMove, UriKind.Absolute);
                        _imageMove.EndInit();
                    }

                    ImageBehavior.SetAnimatedSource(Image, _imageMove);
                    Image.Width = Image.ActualWidth - 15;
                    spImg.Width = Image.Width;
                }

                if (isEnemy)
                {
                    spImg.Margin = new Thickness(spImg.Margin.Left + SPEED, spImg.Margin.Top, spImg.Margin.Right - SPEED, spImg.Margin.Bottom);
                    POSITION = spImg.Margin.Right;
                }
                else
                {
                    spImg.Margin = new Thickness(spImg.Margin.Left - SPEED, spImg.Margin.Top, spImg.Margin.Right + SPEED, spImg.Margin.Bottom);
                    POSITION = spImg.Margin.Right + spImg.Width ;
                }
                isAttack = false;
            }
        }
        public virtual bool Attack(Tower Enemy)
        {
            if (Math.Abs(Enemy.POSITION - this.POSITION) <= this.RANGE)
            {
                if ((++counter % APS) == 0)
                {
                    Enemy.GetHurt(ATK);
                    counter = 0;
                }
                if (!isAttack) //判斷是否需要換gif圖
                {
                    if (imgSourceAttack == null)
                        imgSourceAttack = imgSourceMove.Replace("Move", "Attack");
                    //MessageBox.Show(imgSourceAttack);

                    if (_imageAttack == null)
                    {
                        _imageAttack = new BitmapImage();
                        _imageAttack.BeginInit();
                        _imageAttack.UriSource = new Uri(imgSourceAttack, UriKind.Absolute);
                        _imageAttack.EndInit();
                    }
                   // Image.Source = _imageAttack;

                    ImageBehavior.SetAnimatedSource(Image, _imageAttack);
                    Image.Width = Image.ActualWidth + 15;
                    spImg.Width = Image.Width;
                    isAttack = true;
                }

                return true;
            }
            return false;
        }