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(); } }