Пример #1
0
        private void DoWithTanks()
        {
            Array     values  = Enum.GetValues(typeof(Direction));
            Direction tankDir = (Direction)values.GetValue(random.Next(values.Length));

            //выстрелы танков
            foreach (var t in Tanks)
            {
                if (random.Next(100) < 1)
                {
                    switch (t.TankDirection)
                    {
                    case Direction.Left:
                        Projectiles.Add(new Projectile(t.X - 22, t.Y - 5, t.TankDirection));
                        break;

                    case Direction.Right:
                        Projectiles.Add(new Projectile(t.X + 12, t.Y - 5, t.TankDirection));
                        break;

                    case Direction.Up:
                        Projectiles.Add(new Projectile(t.X - 5, t.Y - 22, t.TankDirection));
                        break;

                    case Direction.Down:
                        Projectiles.Add(new Projectile(t.X - 5, t.Y + 12, t.TankDirection));
                        break;
                    }
                }
            }

            //расчёт нового направления танка
            foreach (var a in Walls)
            {
                for (int i = 0; i < Tanks.Count; i++)
                {
                    bool wallFlag = false;
                    if (random.Next(100) < 1)
                    {
                        Tanks[i].Turn(tankDir);
                    }
                    switch (Tanks[i].TankDirection)
                    {
                    case Direction.Left:
                        if (AllCollision.BoxCollides(Tanks[i].X - 1, Tanks[i].Y, 20, 20, a.XLeft, a.YUp, a.XRight - a.XLeft, a.YDown - a.YUp))
                        {
                            wallFlag = true;
                        }
                        break;

                    case Direction.Right:
                        if (AllCollision.BoxCollides(Tanks[i].X + 1, Tanks[i].Y, 20, 20, a.XLeft, a.YUp, a.XRight - a.XLeft, a.YDown - a.YUp))
                        {
                            wallFlag = true;
                        }
                        break;

                    case Direction.Up:
                        if (AllCollision.BoxCollides(Tanks[i].X, Tanks[i].Y - 1, 20, 20, a.XLeft, a.YUp, a.XRight - a.XLeft, a.YDown - a.YUp))
                        {
                            wallFlag = true;
                        }
                        break;

                    case Direction.Down:
                        if (AllCollision.BoxCollides(Tanks[i].X, Tanks[i].Y + 1, 20, 20, a.XLeft, a.YUp, a.XRight - a.XLeft, a.YDown - a.YUp))
                        {
                            wallFlag = true;
                        }
                        break;
                    }
                    if (wallFlag)
                    {
                        Tanks[i].TurnAround();
                    }
                }
            }

            //проверка на разворот перед границей танка
            foreach (var element in Tanks)
            {
                switch (element.TankDirection)
                {
                case Direction.Left:
                    if (element.X - 1 < 0)
                    {
                        element.TurnAround();
                    }
                    break;

                case Direction.Right:
                    if (element.X + 21 > _fieldWidth)
                    {
                        element.TurnAround();
                    }
                    break;

                case Direction.Up:
                    if (element.Y - 1 < 0)
                    {
                        element.TurnAround();
                    }
                    break;

                case Direction.Down:
                    if (element.Y + 21 > _fieldHeight)
                    {
                        element.TurnAround();
                    }
                    break;
                }
            }

            //столкновение танков
            for (int i = 0; i < Tanks.Count; i++)
            {
                for (int j = 0; j < Tanks.Count; j++)
                {
                    switch (Tanks[i].TankDirection)
                    {
                    case Direction.Left:
                        if (AllCollision.BoxCollides(Tanks[i].X - 2, Tanks[i].Y, 20, 20, Tanks[j].X, Tanks[j].Y, 20, 20) && (i != j))
                        {
                            Tanks[i].TurnAround();
                            Tanks[j].TurnAround();
                        }
                        break;

                    case Direction.Right:
                        if (AllCollision.BoxCollides(Tanks[i].X + 2, Tanks[i].Y, 20, 20, Tanks[j].X, Tanks[j].Y, 20, 20) && (i != j))
                        {
                            Tanks[i].TurnAround();
                            Tanks[j].TurnAround();
                        }
                        break;

                    case Direction.Up:
                        if (AllCollision.BoxCollides(Tanks[i].X, Tanks[i].Y - 2, 20, 20, Tanks[j].X, Tanks[j].Y, 20, 20) && (i != j))
                        {
                            Tanks[i].TurnAround();
                            Tanks[j].TurnAround();
                        }
                        break;

                    case Direction.Down:
                        if (AllCollision.BoxCollides(Tanks[i].X, Tanks[i].Y + 2, 20, 20, Tanks[j].X, Tanks[j].Y, 20, 20) && (i != j))
                        {
                            Tanks[i].TurnAround();
                            Tanks[j].TurnAround();
                        }
                        break;
                    }
                }
            }

            //столкновение танков с пулей
            foreach (var a in PackmanProjectiles)
            {
                for (int i = 0; i < Tanks.Count; i++)
                {
                    if (AllCollision.BoxCollides(Tanks[i].X, Tanks[i].Y, 20, 20, a.X, a.Y, 10, 10))
                    {
                        Tanks.Remove(Tanks[i]);
                        CreateTanks();
                        break;
                    }
                }
            }

            //движение
            foreach (var t in Tanks)
            {
                t.Run();
            }
        }