From 4e7190a0a0f48f5a01450d2ea7b950bcca0198f4 Mon Sep 17 00:00:00 2001 From: Garifullin-Farid <95081032+Garifullin-Farid@users.noreply.github.com> Date: Sun, 17 Mar 2024 01:53:19 +0400 Subject: [PATCH] LabWork_2 --- ProjectTank/ProjectTank.sln | 2 +- .../{ => Drawning}/DirectionType.cs | 7 +- .../Drawning/DrawningBattleTank.cs | 64 +++++ .../ProjectTank/Drawning/DrawningTank.cs | 239 ++++++++++++++++++ ProjectTank/ProjectTank/DrawningBattleTank.cs | 231 ----------------- .../ProjectTank/Entities/EntityTank.cs | 41 +++ .../ProjectTank/Entities/EntiyBattleTank.cs | 44 ++++ ProjectTank/ProjectTank/EntiyBattleTank.cs | 59 ----- .../ProjectTank/FormBattleTank.Designer.cs | 64 ++++- ProjectTank/ProjectTank/FormBattleTank.cs | 117 +++++++-- .../MovementStrategy/AbstractStrategy.cs | 118 +++++++++ .../MovementStrategy/IMoveableObject.cs | 22 ++ .../MovementStrategy/MoveToBorder.cs | 38 +++ .../MovementStrategy/MoveToCenter.cs | 53 ++++ .../MovementStrategy/MoveableTank.cs | 58 +++++ .../MovementStrategy/MovementDirecton.cs | 22 ++ .../MovementStrategy/ObjectParameters.cs | 60 +++++ .../MovementStrategy/StrategyStatus.cs | 18 ++ 18 files changed, 925 insertions(+), 332 deletions(-) rename ProjectTank/ProjectTank/{ => Drawning}/DirectionType.cs (75%) create mode 100644 ProjectTank/ProjectTank/Drawning/DrawningBattleTank.cs create mode 100644 ProjectTank/ProjectTank/Drawning/DrawningTank.cs delete mode 100644 ProjectTank/ProjectTank/DrawningBattleTank.cs create mode 100644 ProjectTank/ProjectTank/Entities/EntityTank.cs create mode 100644 ProjectTank/ProjectTank/Entities/EntiyBattleTank.cs delete mode 100644 ProjectTank/ProjectTank/EntiyBattleTank.cs create mode 100644 ProjectTank/ProjectTank/MovementStrategy/AbstractStrategy.cs create mode 100644 ProjectTank/ProjectTank/MovementStrategy/IMoveableObject.cs create mode 100644 ProjectTank/ProjectTank/MovementStrategy/MoveToBorder.cs create mode 100644 ProjectTank/ProjectTank/MovementStrategy/MoveToCenter.cs create mode 100644 ProjectTank/ProjectTank/MovementStrategy/MoveableTank.cs create mode 100644 ProjectTank/ProjectTank/MovementStrategy/MovementDirecton.cs create mode 100644 ProjectTank/ProjectTank/MovementStrategy/ObjectParameters.cs create mode 100644 ProjectTank/ProjectTank/MovementStrategy/StrategyStatus.cs diff --git a/ProjectTank/ProjectTank.sln b/ProjectTank/ProjectTank.sln index c5664fa..9f3bbd3 100644 --- a/ProjectTank/ProjectTank.sln +++ b/ProjectTank/ProjectTank.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.8.34316.72 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectTank", "ProjectTank\ProjectTank.csproj", "{65B41360-B289-4A4E-8BA7-E53F4AF9336A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProjectTank", "ProjectTank\ProjectTank.csproj", "{65B41360-B289-4A4E-8BA7-E53F4AF9336A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/ProjectTank/ProjectTank/DirectionType.cs b/ProjectTank/ProjectTank/Drawning/DirectionType.cs similarity index 75% rename from ProjectTank/ProjectTank/DirectionType.cs rename to ProjectTank/ProjectTank/Drawning/DirectionType.cs index 7810a36..1ae02f9 100644 --- a/ProjectTank/ProjectTank/DirectionType.cs +++ b/ProjectTank/ProjectTank/Drawning/DirectionType.cs @@ -1,10 +1,14 @@ -namespace ProjectTank +namespace ProjectTank.Drawning { /// /// направление перемещенния /// public enum DirectionType { + /// + /// Неизвестное направление + /// + Unknow = -1, /// /// Вверх /// @@ -21,5 +25,6 @@ /// Вправо /// Right = 4, + } } diff --git a/ProjectTank/ProjectTank/Drawning/DrawningBattleTank.cs b/ProjectTank/ProjectTank/Drawning/DrawningBattleTank.cs new file mode 100644 index 0000000..8c7a0ac --- /dev/null +++ b/ProjectTank/ProjectTank/Drawning/DrawningBattleTank.cs @@ -0,0 +1,64 @@ +namespace ProjectTank.Drawning; +/// +/// Класс, отвечающий за прорисовку и перемещение объекта-сущности +/// +public class DrawningBattleTank :DrawningTank +{ + /// + /// Конструктор + /// + /// Скорость + /// Вес автомобиля + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия пушки + /// признак наличия пулемета + /// + public DrawningBattleTank(int speed, double weight, Color bodyColor, Color additionalColor, bool gun, bool machinGun) : base(150, 87) + { + EntityTank = new EntityBattleTank(speed, weight, bodyColor, additionalColor, gun, machinGun); + } + + /// + /// Прорисовка объекта + /// + /// + public override void DrawTransport(Graphics g) + { + if (EntityTank == null || EntityTank is not EntityBattleTank battleTank || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + Pen pen = new(Color.Black); + Brush additionalBrush = new SolidBrush(battleTank.AdditionalColor); + + if (battleTank.Gun) + { + g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 30, 45, 5); + + g.FillRectangle(additionalBrush, _startPosX.Value, _startPosY.Value + 30, 45, 5); + } + + //пулемет + if (battleTank.MachinGun) + { + g.DrawRectangle(pen, _startPosX.Value + 65, _startPosY.Value + 15, 16, 5); + g.DrawRectangle(pen, _startPosX.Value + 72, _startPosY.Value + 10, 5, 5); + g.DrawRectangle(pen, _startPosX.Value + 71, _startPosY.Value + 3, 7, 7); + g.DrawRectangle(pen, _startPosX.Value + 55, _startPosY.Value + 5, 15, 3); + + g.FillRectangle(additionalBrush, _startPosX.Value + 65, _startPosY.Value + 15, 16, 5); + g.FillRectangle(additionalBrush, _startPosX.Value + 72, _startPosY.Value + 10, 5, 5); + g.FillRectangle(additionalBrush, _startPosX.Value + 71, _startPosY.Value + 3, 7, 7); + g.FillRectangle(additionalBrush, _startPosX.Value + 55, _startPosY.Value + 5, 15, 3); + } + _startPosY += 20; + base.DrawTransport(g); + _startPosY -= 20; + + } + +} + + + diff --git a/ProjectTank/ProjectTank/Drawning/DrawningTank.cs b/ProjectTank/ProjectTank/Drawning/DrawningTank.cs new file mode 100644 index 0000000..a497d50 --- /dev/null +++ b/ProjectTank/ProjectTank/Drawning/DrawningTank.cs @@ -0,0 +1,239 @@ +using ProjectTank.Entities; +namespace ProjectTank.Drawning +{ + public class DrawningTank + { + /// + /// класс - сущность + /// + public EntityTank? EntityTank { get; protected set; } + + /// + /// ширина окна + /// + private int? _pictureWidth; + + /// + /// высота окна + /// + private int? _pictureHeight; + + /// + /// Левая координата прорисовки танка + /// + protected int? _startPosX; + + /// + /// Верхняя координата прорисовки танка + /// + protected int? _startPosY; + + /// + /// ширина прорисовки танка + /// /// + private readonly int _drawningTankWidth = 150; + + /// + /// высота прорисовки танка + /// + private readonly int _drawningTankHeight = 67; + + /// + /// Координата X объекта + /// + public int? GetPosX => _startPosX; + + /// + /// Координата Y объекта + /// + public int? GetPosY => _startPosY; + + /// + /// Ширина объекта + /// + public int GetWidth => _drawningTankWidth; + + /// + /// Высота объекта + /// + public int GetHeight => _drawningTankHeight; + + /// + /// Пустой конструктор + /// + private DrawningTank() + { + _pictureWidth = null; + _pictureHeight = null; + _startPosX = null; + _startPosY = null; + } + + /// + /// Конструктор + /// + /// Скорость + /// Вес танка + /// Основной цвет + public DrawningTank(int speed, double weight, Color bodyColor) : this() + { + EntityTank = new EntityTank(speed, weight, bodyColor); + } + /// + /// Конструктор + /// + /// Ширина прорисовки танка + /// Высота прорисовки танка + protected DrawningTank(int drawningTankWidth, int drawningTankHeight) : this() + { + _drawningTankWidth = drawningTankWidth; + _drawningTankHeight = drawningTankHeight; + } + /// + /// Установка границ поля + /// + /// Ширина поля + /// Высота поля + /// true - границы заданы, false - проверка не пройдена , нельзя разместить объект в этих размерах + public bool SetPictureSize(int width, int height) + { + + if (height < _drawningTankHeight || width < _drawningTankWidth) + { + return false; + } + _pictureHeight = height; + _pictureWidth = width; + if (_startPosX != null && _startPosY != null) + { + if (_startPosX < 0) _startPosX = 0; + if (_startPosY < 0) _startPosY = 0; + if (_pictureHeight.Value < _startPosY + _drawningTankHeight) + { + _startPosY = _pictureHeight - _drawningTankHeight; + } + if (_pictureWidth.Value < _startPosX + _drawningTankWidth) + { + _startPosX = _pictureWidth - _drawningTankWidth; + } + } + + return true; + } + /// + /// Установка позиции + /// + /// Координата X + /// Координата Y + public void SetPosition(int x, int y) + { + if (!_pictureWidth.HasValue || !_pictureHeight.HasValue) + { + return; + } + _startPosX = x; + _startPosY = y; + if (_startPosX < 0) _startPosX = 0; + if (_startPosY < 0) _startPosY = 0; + if (_pictureHeight.Value < _startPosY + _drawningTankHeight) + { + _startPosY = _pictureHeight - _drawningTankHeight; + } + if (_pictureWidth.Value < _startPosX + _drawningTankWidth) + { + _startPosX = _pictureWidth - _drawningTankWidth; + } + + } + /// + /// Изменение направления перемещения + /// + /// направление + /// + public bool MoveTransport(DirectionType dicretion) + { + if (EntityTank == null || _startPosX == null || _startPosY == null) + { + return false; + } + switch (dicretion) + { + //влево + case DirectionType.Left: + if (_startPosX.Value - EntityTank.Step > 0) + { + _startPosX -= (int)EntityTank.Step; + } + return true; + //вправо + case DirectionType.Right: + if (_startPosX.Value + _drawningTankWidth + EntityTank.Step < _pictureWidth) + { + _startPosX += (int)EntityTank.Step; + } + return true; + //вверх + case DirectionType.Up: + if (_startPosY.Value - EntityTank.Step > 0) + { + _startPosY -= (int)EntityTank.Step; + } + return true; + //вниз + case DirectionType.Down: + if (_startPosY + EntityTank.Step + _drawningTankHeight < _pictureHeight) + { + _startPosY += (int)EntityTank.Step; + } + return true; + default: + return false; + } + + } + + /// + /// прорисовка танка + /// + /// + public virtual void DrawTransport(Graphics g) + { + if (EntityTank == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + Pen pen = new(Color.Black); + Brush Br = new SolidBrush(EntityTank.BodyColor); + //основная часть танка + g.DrawRectangle(pen, _startPosX.Value + 6, _startPosY.Value + 20, 135, 20); + g.DrawRectangle(pen, _startPosX.Value + 45, _startPosY.Value, 55, 20); + + g.FillRectangle(Br, _startPosX.Value + 6, _startPosY.Value + 20, 135, 20); + g.FillRectangle(Br, _startPosX.Value + 45, _startPosY.Value, 55, 20); + + //гусеницы + + g.DrawArc(pen, _startPosX.Value, _startPosY.Value + 40, 15, 30, 100, 170); + g.DrawArc(pen, _startPosX.Value + 135, _startPosY.Value + 40, 15, 30, -90, 170); + g.DrawLine(pen, _startPosX.Value + 5, _startPosY.Value + 40, _startPosX.Value + 145, _startPosY.Value + 40); + g.DrawLine(pen, _startPosX.Value + 5, _startPosY.Value + 70, _startPosX.Value + 145, _startPosY.Value + 70); + Pen WidePen = new(Color.Black); + WidePen.Width = 2; + g.DrawEllipse(WidePen, _startPosX.Value, _startPosY.Value + 40, 24, 24); + g.DrawEllipse(WidePen, _startPosX.Value + 125, _startPosY.Value + 40, 24, 24); + + //катки + g.DrawEllipse(pen, _startPosX.Value + 26, _startPosY.Value + 50, 20, 20); + g.DrawEllipse(pen, _startPosX.Value + 52, _startPosY.Value + 50, 20, 20); + g.DrawEllipse(pen, _startPosX.Value + 78, _startPosY.Value + 50, 20, 20); + g.DrawEllipse(pen, _startPosX.Value + 104, _startPosY.Value + 50, 20, 20); + + + g.DrawEllipse(pen, _startPosX.Value + 49, _startPosY.Value + 40, 5, 5); + g.DrawEllipse(pen, _startPosX.Value + 75, _startPosY.Value + 40, 5, 5); + g.DrawEllipse(pen, _startPosX.Value + 101, _startPosY.Value + 40, 5, 5); + + } + + } +} diff --git a/ProjectTank/ProjectTank/DrawningBattleTank.cs b/ProjectTank/ProjectTank/DrawningBattleTank.cs deleted file mode 100644 index 0b3e6a3..0000000 --- a/ProjectTank/ProjectTank/DrawningBattleTank.cs +++ /dev/null @@ -1,231 +0,0 @@ -namespace ProjectTank; -/// -/// Класс, отвечающий за прорисовку и перемещение объекта-сущности -/// -public class DrawningBattleTank -{ - /// - /// класс - сущность - /// - public EntityBattleTank? EntityBattleTank { get; private set; } - - /// - /// ширина окна - /// - private int? _pictureWidth; - - /// - /// высота окна - /// - private int? _pictureHeight; - - /// - /// Левая координата прорисовки танка - /// - private int? _startPosX; - - /// - /// Верхняя координата прорисовки автомобиля - /// - private int? _startPosY; - - /// - /// ширина прорисовки танка - /// /// - private readonly int _drawningTankWidth = 150; - - /// - /// высота прорисовки танка - /// - private readonly int _drawingTankHeight = 87; - - /// - /// Инициализация свойств - /// - /// Скорость - /// Вес - /// Основной цвет - /// Дополнительный цвет - /// орудие - /// пулемет на башне - public void Init(EntityBattleTank entityBattleTank) - { - EntityBattleTank = entityBattleTank; - _pictureHeight = null; - _pictureWidth = null; - _startPosX = null; - _startPosY = null; - - } - - /// - /// Установка границ поля - /// - /// Ширина поля - /// Высота поля - /// true - границы заданы, false - проверка не пройдена , нельзя разместить объект в этих размерах - public bool SetPictureSize(int width, int height) - { - - if (height < _drawingTankHeight || width < _drawningTankWidth) - { - return false; - } - _pictureHeight = height; - _pictureWidth = width; - if (_startPosX != null && _startPosY != null) - { - if (_startPosX < 0) _startPosX = 0; - if (_startPosY < 0) _startPosY = 0; - if (_pictureHeight.Value < (_startPosY + _drawingTankHeight)) - { - _startPosY = _pictureHeight - _drawingTankHeight; - } - if (_pictureWidth.Value < (_startPosX + _drawningTankWidth)) - { - _startPosX = _pictureWidth - _drawningTankWidth; - } - } - - return true; - } - /// - /// Установка позиции - /// - /// Координата X - /// Координата Y - public void SetPosition(int x, int y) - { - if (!_pictureWidth.HasValue || !_pictureHeight.HasValue) - { - return; - } - _startPosX = x; - _startPosY = y; - if (_startPosX < 0) _startPosX = 0; - if (_startPosY < 0) _startPosY = 0; - if (_pictureHeight.Value < (_startPosY + _drawingTankHeight)) - { - _startPosY = _pictureHeight - _drawingTankHeight; - } - if (_pictureWidth.Value < (_startPosX + _drawningTankWidth)) - { - _startPosX = _pictureWidth - _drawningTankWidth; - } - - } - /// - /// Изменение направления перемещения - /// - /// направление - /// - public bool MoveTransport(DirectionType dicretion) - { - if (EntityBattleTank == null || _startPosX == null || _startPosY == null) - { - return false; - } - switch (dicretion) - { - //влево - case DirectionType.Left: - if (_startPosX.Value - EntityBattleTank.Step > 0) - { - _startPosX -= (int)EntityBattleTank.Step; - } - return true; - //вправо - case DirectionType.Right: - if (_startPosX.Value + _drawningTankWidth + EntityBattleTank.Step < _pictureWidth) - { - _startPosX += (int)EntityBattleTank.Step; - } - return true; - //вверх - case DirectionType.Up: - if (_startPosY.Value - EntityBattleTank.Step > 0) - { - _startPosY -= (int)EntityBattleTank.Step; - } - return true; - //вниз - case DirectionType.Down: - if (_startPosY + EntityBattleTank.Step + _drawingTankHeight < _pictureHeight) - { - _startPosY += (int)EntityBattleTank.Step; - } - return true; - default: - return false; - } - - } - - /// - /// прорисовка танка - /// - /// - public void DrawTransport(Graphics g) - { - if (EntityBattleTank == null || !_startPosX.HasValue || !_startPosY.HasValue) - { - return; - } - Pen pen = new(Color.Black); - Brush addititionalBrush = new SolidBrush(EntityBattleTank.AdditionalColor); - Brush Br = new SolidBrush(EntityBattleTank.BodyColor); - //основная часть танка - g.DrawRectangle(pen, _startPosX.Value + 6, _startPosY.Value + 40, 135, 20); - g.DrawRectangle(pen, _startPosX.Value + 45, _startPosY.Value + 20, 55, 20); - - g.FillRectangle(Br, _startPosX.Value + 6, _startPosY.Value + 40, 135, 20); - g.FillRectangle(Br, _startPosX.Value + 45, _startPosY.Value + 20, 55, 20); - - //гусеницы - - g.DrawArc(pen, _startPosX.Value, _startPosY.Value + 60, 15, 30, 100, 170); - g.DrawArc(pen, _startPosX.Value + 135, _startPosY.Value + 60, 15, 30, -90, 170); - g.DrawLine(pen, _startPosX.Value + 5, _startPosY.Value + 60, _startPosX.Value + 145, _startPosY.Value + 60); - g.DrawLine(pen, _startPosX.Value + 5, _startPosY.Value + 90, _startPosX.Value + 145, _startPosY.Value + 90); - Pen WidePen = new(Color.Black); - WidePen.Width = 2; - g.DrawEllipse(WidePen, _startPosX.Value, _startPosY.Value + 60, 24, 24); - g.DrawEllipse(WidePen, _startPosX.Value + 125, _startPosY.Value + 60, 24, 24); - - //катки - g.DrawEllipse(pen, _startPosX.Value + 26, _startPosY.Value + 70, 20, 20); - g.DrawEllipse(pen, _startPosX.Value + 52, _startPosY.Value + 70, 20, 20); - g.DrawEllipse(pen, _startPosX.Value + 78, _startPosY.Value + 70, 20, 20); - g.DrawEllipse(pen, _startPosX.Value + 104, _startPosY.Value + 70, 20, 20); - - - g.DrawEllipse(pen, _startPosX.Value + 49, _startPosY.Value + 60, 5, 5); - g.DrawEllipse(pen, _startPosX.Value + 75, _startPosY.Value + 60, 5, 5); - g.DrawEllipse(pen, _startPosX.Value + 101, _startPosY.Value + 60, 5, 5); - - //пушка - Brush AdditionalBrush = new SolidBrush(EntityBattleTank.AdditionalColor); - if (EntityBattleTank.Gun) - { - g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 30, 45, 5); - - g.FillRectangle(AdditionalBrush, _startPosX.Value, _startPosY.Value + 30, 45, 5); - } - - //пулемет - if (EntityBattleTank.MachinGun) - { - g.DrawRectangle(pen, _startPosX.Value + 65, _startPosY.Value + 15, 16, 5); - g.DrawRectangle(pen, _startPosX.Value + 72, _startPosY.Value + 10, 5, 5); - g.DrawRectangle(pen, _startPosX.Value + 71, _startPosY.Value + 3, 7, 7); - g.DrawRectangle(pen, _startPosX.Value + 55, _startPosY.Value + 5, 15, 3); - - g.FillRectangle(AdditionalBrush, _startPosX.Value + 65, _startPosY.Value + 15, 16, 5); - g.FillRectangle(AdditionalBrush, _startPosX.Value + 72, _startPosY.Value + 10, 5, 5); - g.FillRectangle(AdditionalBrush, _startPosX.Value + 71, _startPosY.Value + 3, 7, 7); - g.FillRectangle(AdditionalBrush, _startPosX.Value + 55, _startPosY.Value + 5, 15, 3); - } - } -} - - diff --git a/ProjectTank/ProjectTank/Entities/EntityTank.cs b/ProjectTank/ProjectTank/Entities/EntityTank.cs new file mode 100644 index 0000000..3ec8cc3 --- /dev/null +++ b/ProjectTank/ProjectTank/Entities/EntityTank.cs @@ -0,0 +1,41 @@ +namespace ProjectTank.Entities +{ + public class EntityTank + { + + /// + /// Скорость + /// + public int Speed { get; private set; } + + /// + /// Вес + /// + public double Weight { get; private set; } + + /// + /// Основной цвет + /// + public Color BodyColor { get; private set; } + + /// + /// Шаг перемещения танка + /// + public double Step => Speed * 100 / Weight; + + /// + /// Конструктор сущности + /// + /// Скорость + /// Веc + /// Основной цвет + + public EntityTank(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + + } + } +} diff --git a/ProjectTank/ProjectTank/Entities/EntiyBattleTank.cs b/ProjectTank/ProjectTank/Entities/EntiyBattleTank.cs new file mode 100644 index 0000000..0a39d87 --- /dev/null +++ b/ProjectTank/ProjectTank/Entities/EntiyBattleTank.cs @@ -0,0 +1,44 @@ +using ProjectTank.Entities; + +namespace ProjectTank +{ + /// + /// Класс-сущность танк + /// + public class EntityBattleTank : EntityTank + + { + /// + /// Дополнительный цвет (для опциональных элементов) + /// + public Color AdditionalColor { get; private set; } + + /// + /// Признак (опция) наличия пушки + /// + public bool Gun { get; private set; } + + + /// + /// Признак (опция) наличия Пулемета на башне + /// /// + public bool MachinGun { get; private set; } + + /// + /// Конструктор объекта-класса Боевого Танка + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Пушка танка + /// Пклемет на башне + public EntityBattleTank(int speed, double weight, Color bodyColor, Color additionalColor, bool gun, bool machinGun) : base(speed, weight, bodyColor) + { + AdditionalColor = additionalColor; + MachinGun= machinGun; + Gun = gun; + } + + } +} diff --git a/ProjectTank/ProjectTank/EntiyBattleTank.cs b/ProjectTank/ProjectTank/EntiyBattleTank.cs deleted file mode 100644 index d90eb21..0000000 --- a/ProjectTank/ProjectTank/EntiyBattleTank.cs +++ /dev/null @@ -1,59 +0,0 @@ -namespace ProjectTank -{ - /// - /// Класс-сущность танк - /// - public class EntityBattleTank - { - /// - /// скорость - /// - public int Speed { get; set; } - - /// - /// вес - /// - public double Weight { get; set; } - - /// - /// основный цвет - /// - public Color BodyColor { get; set; } - - /// - /// дополнительный цвет - /// - public Color AdditionalColor { get; set; } - - /// - /// Признак (опция) наличия пушки - /// - public bool Gun { get; private set; } - /// - /// Признак (опция) наличия пулемета - /// - public bool MachinGun { get; private set; } - /// - /// шаг - /// - public double Step => Speed * 100 / Weight; - /// - /// Инициализация полей объекта-класса танк - /// - /// Скорость - /// Вес - /// Основной цвет - /// Дополнительный цвет - /// орудие - /// пулемет на башне - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool gun, bool machinGun) - { - Speed = speed; - Weight = weight; - BodyColor = bodyColor; - AdditionalColor = additionalColor; - Gun = gun; - MachinGun = machinGun; - } - } -} diff --git a/ProjectTank/ProjectTank/FormBattleTank.Designer.cs b/ProjectTank/ProjectTank/FormBattleTank.Designer.cs index fab9104..c083573 100644 --- a/ProjectTank/ProjectTank/FormBattleTank.Designer.cs +++ b/ProjectTank/ProjectTank/FormBattleTank.Designer.cs @@ -29,11 +29,14 @@ private void InitializeComponent() { pictureBoxBattleTank = new PictureBox(); - Создать = new Button(); + ButtonCreateBattkeTank = new Button(); buttonLeft = new Button(); buttonUp = new Button(); buttonRight = new Button(); buttonDown = new Button(); + ButtonCreateTank = new Button(); + СomboBoxStrategy = new ComboBox(); + buttonStrategyStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxBattleTank).BeginInit(); SuspendLayout(); // @@ -47,16 +50,16 @@ pictureBoxBattleTank.TabStop = false; pictureBoxBattleTank.Click += ButtonMove_Click; // - // Создать + // ButtonCreateBattkeTank // - Создать.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - Создать.Location = new Point(12, 443); - Создать.Name = "Создать"; - Создать.Size = new Size(75, 23); - Создать.TabIndex = 1; - Создать.Text = "Создать"; - Создать.UseVisualStyleBackColor = true; - Создать.Click += ButtonCreate_Click; + ButtonCreateBattkeTank.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + ButtonCreateBattkeTank.Location = new Point(12, 443); + ButtonCreateBattkeTank.Name = "ButtonCreateBattkeTank"; + ButtonCreateBattkeTank.Size = new Size(150, 23); + ButtonCreateBattkeTank.TabIndex = 1; + ButtonCreateBattkeTank.Text = "Создать Боевой Танк"; + ButtonCreateBattkeTank.UseVisualStyleBackColor = true; + ButtonCreateBattkeTank.Click += ButtonCreateButtleTank_Ckick; // // buttonLeft // @@ -106,16 +109,50 @@ buttonDown.UseVisualStyleBackColor = true; buttonDown.Click += ButtonMove_Click; // + // ButtonCreateTank + // + ButtonCreateTank.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + ButtonCreateTank.Location = new Point(168, 443); + ButtonCreateTank.Name = "ButtonCreateTank"; + ButtonCreateTank.Size = new Size(150, 23); + ButtonCreateTank.TabIndex = 6; + ButtonCreateTank.Text = "Создать Танк"; + ButtonCreateTank.UseVisualStyleBackColor = true; + ButtonCreateTank.Click += ButtonCreateTank_Ckick; + // + // СomboBoxStrategy + // + СomboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList; + СomboBoxStrategy.FormattingEnabled = true; + СomboBoxStrategy.Items.AddRange(new object[] { "К центру", "К краю" }); + СomboBoxStrategy.Location = new Point(698, 12); + СomboBoxStrategy.Name = "СomboBoxStrategy"; + СomboBoxStrategy.Size = new Size(121, 23); + СomboBoxStrategy.TabIndex = 7; + // + // buttonStrategyStep + // + buttonStrategyStep.Location = new Point(744, 50); + buttonStrategyStep.Name = "buttonStrategyStep"; + buttonStrategyStep.Size = new Size(75, 23); + buttonStrategyStep.TabIndex = 8; + buttonStrategyStep.Text = "шаг"; + buttonStrategyStep.UseVisualStyleBackColor = true; + buttonStrategyStep.Click += ButtonStrategyStep_Ckick; + // // FormBattleTank // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(831, 478); + Controls.Add(buttonStrategyStep); + Controls.Add(СomboBoxStrategy); + Controls.Add(ButtonCreateTank); Controls.Add(buttonDown); Controls.Add(buttonRight); Controls.Add(buttonUp); Controls.Add(buttonLeft); - Controls.Add(Создать); + Controls.Add(ButtonCreateBattkeTank); Controls.Add(pictureBoxBattleTank); Name = "FormBattleTank"; Text = "FormBattleTank"; @@ -126,10 +163,13 @@ #endregion private PictureBox pictureBoxBattleTank; - private Button Создать; + private Button ButtonCreateBattkeTank; private Button buttonLeft; private Button buttonUp; private Button buttonRight; private Button buttonDown; + private Button ButtonCreateTank; + private ComboBox СomboBoxStrategy; + private Button buttonStrategyStep; } } \ No newline at end of file diff --git a/ProjectTank/ProjectTank/FormBattleTank.cs b/ProjectTank/ProjectTank/FormBattleTank.cs index 7aeaa4d..be2a6aa 100644 --- a/ProjectTank/ProjectTank/FormBattleTank.cs +++ b/ProjectTank/ProjectTank/FormBattleTank.cs @@ -1,4 +1,8 @@ -namespace ProjectTank +using ProjectTank.Drawning; +using ProjectTank.Entities; +using ProjectTank.MovementStrategy; + +namespace ProjectTank { /// /// Форма работы с объектом "Танк" @@ -8,55 +12,72 @@ /// /// Поле-объект для прорисовки объекта /// - private DrawningBattleTank? _drawningBattleTank; + private DrawningTank? _drawningTank; /// - /// класс - сущность + /// Стратегия перемещения /// - private EntityBattleTank? _entityBattleTank; - + private AbstractStrategy? _strategy; /// /// Конструктор формы /// public FormBattleTank() { InitializeComponent(); + _strategy = null; } - /// - /// Метод прорисовки танкаx + /// Метод прорисовки танка /// private void Draw() { - if (_drawningBattleTank == null) + if (_drawningTank == null) { return; } Bitmap bmp = new(pictureBoxBattleTank.Width, pictureBoxBattleTank.Height); Graphics gr = Graphics.FromImage(bmp); - _drawningBattleTank.DrawTransport(gr); + _drawningTank.DrawTransport(gr); pictureBoxBattleTank.Image = bmp; } + /// + /// Создание объекта класса-перемещения + /// + /// Тип создаваемого объекта + private void CreateObject(string type) + { + Random random = new Random(); + switch (type) + { + case nameof(DrawningTank): + _drawningTank = new DrawningTank(random.Next(100, 300), random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256))); + break; + case nameof(DrawningBattleTank): + _drawningTank = new DrawningBattleTank(random.Next(100, 300), random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2))); + break; + default: + return; + } + _drawningTank.SetPictureSize(pictureBoxBattleTank.Width, pictureBoxBattleTank.Height); + _drawningTank.SetPosition(random.Next(10, 100), random.Next(10, 100)); + _strategy = null; + СomboBoxStrategy.Enabled = true; + Draw(); + } /// /// Обработка нажатия кнопки "Создать" /// /// /// - private void ButtonCreate_Click(object sender, EventArgs e) - { - Random random = new Random(); - _drawningBattleTank = new DrawningBattleTank(); - _entityBattleTank = new EntityBattleTank(); - _entityBattleTank.Init(random.Next(100, 300), random.Next(1000, 3000), - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), - Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2))); - _drawningBattleTank.Init(_entityBattleTank); - _drawningBattleTank.SetPictureSize(pictureBoxBattleTank.Width, pictureBoxBattleTank.Height); - _drawningBattleTank.SetPosition(random.Next(10, 100), random.Next(10, 100)); - Draw(); - } + + private void ButtonCreateButtleTank_Ckick(object sender, EventArgs e) => CreateObject(nameof(DrawningBattleTank)); + private void ButtonCreateTank_Ckick(object sender, EventArgs e) => CreateObject(nameof(DrawningTank)); + /// /// Перемещение объекта по форме (нажатие кнопок навигации) /// @@ -64,7 +85,7 @@ /// private void ButtonMove_Click(object sender, EventArgs e) { - if (_drawningBattleTank == null) + if (_drawningTank == null) { return; } @@ -73,16 +94,16 @@ switch (name) { case "buttonUp": - result = _drawningBattleTank.MoveTransport(DirectionType.Up); + result = _drawningTank.MoveTransport(DirectionType.Up); break; case "buttonLeft": - result = _drawningBattleTank.MoveTransport(DirectionType.Left); + result = _drawningTank.MoveTransport(DirectionType.Left); break; case "buttonRight": - result = _drawningBattleTank.MoveTransport(DirectionType.Right); + result = _drawningTank.MoveTransport(DirectionType.Right); break; case "buttonDown": - result = _drawningBattleTank.MoveTransport(DirectionType.Down); + result = _drawningTank.MoveTransport(DirectionType.Down); break; } if (result) @@ -90,5 +111,45 @@ Draw(); } } + /// + /// Обработка нажатия кнопки "Шаг" + /// + /// + /// + private void ButtonStrategyStep_Ckick(object sender, EventArgs e) + { + if (_drawningTank == null) + { + return; + } + if (СomboBoxStrategy.Enabled) + { + _strategy = СomboBoxStrategy.SelectedIndex switch + { + 0 => new MoveToCenter(), + 1 => new MoveToBorder(), + _ => null, + }; + if (_strategy == null) + { + return; + } + _strategy.SetData(new MoveableTank(_drawningTank), + pictureBoxBattleTank.Width, pictureBoxBattleTank.Height); + } + if (_strategy == null) + { + return; + } + СomboBoxStrategy.Enabled = false; + _strategy.MakeStep(); + Draw(); + if (_strategy.GetStatus() == StrategyStatus.Finish) + { + СomboBoxStrategy.Enabled = true; + _strategy = null; + } + } + } } diff --git a/ProjectTank/ProjectTank/MovementStrategy/AbstractStrategy.cs b/ProjectTank/ProjectTank/MovementStrategy/AbstractStrategy.cs new file mode 100644 index 0000000..2da7450 --- /dev/null +++ b/ProjectTank/ProjectTank/MovementStrategy/AbstractStrategy.cs @@ -0,0 +1,118 @@ +namespace ProjectTank.MovementStrategy +{ + public abstract class AbstractStrategy + { + /// + /// Перемещаемый объект + /// + private IMoveableObject? _moveableObject; + /// + /// Статус перемещения + /// + private StrategyStatus _state = StrategyStatus.NotInit; + /// + /// Ширина поля + /// + protected int FieldWidth { get; private set; } + /// + /// Высота поля + /// + protected int FieldHeight { get; private set; } + /// + /// Статус перемещения + /// + public StrategyStatus GetStatus() { return _state; } + /// + /// Установка данных + /// + /// Перемещаемый объект + /// Ширина поля + /// Высота поля + public void SetData(IMoveableObject moveableObject, int width, int height) + { + if (moveableObject == null) + { + _state = StrategyStatus.NotInit; + return; + } + _state = StrategyStatus.InProgress; + _moveableObject = moveableObject; + FieldWidth = width; + FieldHeight = height; + } + /// + /// Шаг перемещения + /// + public void MakeStep() + { + if (_state != StrategyStatus.InProgress) + { + return; + } + if (IsTargetDestinaion()) + { + _state = StrategyStatus.Finish; + return; + } + MoveToTarget(); + } + /// + /// Перемещение влево + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveLeft() => MoveTo(MovementDirection.Left); + /// + /// Перемещение вправо + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveRight() => MoveTo(MovementDirection.Right); + /// + /// Перемещение вверх + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveUp() => MoveTo(MovementDirection.Up); + /// + /// Перемещение вниз + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveDown() => MoveTo(MovementDirection.Down); + /// + /// Параметры объекта + /// + protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition; + /// + /// Шаг объекта + /// + /// + protected int? GetStep() + { + if (_state != StrategyStatus.InProgress) + { + return null; + } + return _moveableObject?.GetStep; + } + /// + /// Перемещение к цели + /// + protected abstract void MoveToTarget(); + /// + /// Достигнута ли цель + /// + /// + protected abstract bool IsTargetDestinaion(); + /// + /// Попытка перемещения в требуемом направлении + /// + /// Направление + /// Результат попытки (true - удалось переместиться, false - неудача) + private bool MoveTo(MovementDirection movementDirection) + { + if (_state != StrategyStatus.InProgress) + { + return false; + } + return _moveableObject?.TryMoveObject(movementDirection) ?? false; + } + } +} diff --git a/ProjectTank/ProjectTank/MovementStrategy/IMoveableObject.cs b/ProjectTank/ProjectTank/MovementStrategy/IMoveableObject.cs new file mode 100644 index 0000000..0a05061 --- /dev/null +++ b/ProjectTank/ProjectTank/MovementStrategy/IMoveableObject.cs @@ -0,0 +1,22 @@ +namespace ProjectTank.MovementStrategy +{ + public interface IMoveableObject + { + /// + /// Получение координаты объекта + /// + + ObjectParameters? GetObjectPosition { get; } + /// + /// Шаг объекта + /// + int GetStep { get; } + + /// + /// Попытка переместить объект в указанном направлении + /// + /// Направление + /// true - объект перемещен, false - перемещение невозможно + bool TryMoveObject(MovementDirection direction); + } +} diff --git a/ProjectTank/ProjectTank/MovementStrategy/MoveToBorder.cs b/ProjectTank/ProjectTank/MovementStrategy/MoveToBorder.cs new file mode 100644 index 0000000..73c4df8 --- /dev/null +++ b/ProjectTank/ProjectTank/MovementStrategy/MoveToBorder.cs @@ -0,0 +1,38 @@ +namespace ProjectTank.MovementStrategy; + +internal class MoveToBorder : AbstractStrategy +{ + /// + /// Стратегия перемещения объекта к Краю экрана + /// + protected override bool IsTargetDestinaion() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return false; + } + return objParams.RightBorder + GetStep() >= FieldWidth && + objParams.DownBorder + GetStep() >= FieldHeight; + } + protected override void MoveToTarget() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return; + } + + int diffX = objParams.RightBorder - FieldWidth; + if (Math.Abs(diffX) > GetStep()) + { + MoveRight(); + } + + int diffY = objParams.DownBorder - FieldHeight; + if (Math.Abs(diffY) > GetStep()) + { + MoveDown(); + } + } +} diff --git a/ProjectTank/ProjectTank/MovementStrategy/MoveToCenter.cs b/ProjectTank/ProjectTank/MovementStrategy/MoveToCenter.cs new file mode 100644 index 0000000..9f61f22 --- /dev/null +++ b/ProjectTank/ProjectTank/MovementStrategy/MoveToCenter.cs @@ -0,0 +1,53 @@ +namespace ProjectTank.MovementStrategy +{ + /// + /// Стратегия перемещения объекта в центр экрана + /// + public class MoveToCenter : AbstractStrategy + { + protected override bool IsTargetDestinaion() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return false; + } + return objParams.ObjectMiddleHorizontal - GetStep() <= FieldWidth / 2 + && objParams.ObjectMiddleHorizontal + GetStep() >= FieldWidth / 2 && + objParams.ObjectMiddleVertical - GetStep() <= FieldHeight / 2 + && objParams.ObjectMiddleVertical + GetStep() >= FieldHeight / 2; + } + protected override void MoveToTarget() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return; + } + int diffX = objParams.ObjectMiddleHorizontal - FieldWidth / 2; + if (Math.Abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + int diffY = objParams.ObjectMiddleVertical - FieldHeight / 2; + if (Math.Abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } + } +} diff --git a/ProjectTank/ProjectTank/MovementStrategy/MoveableTank.cs b/ProjectTank/ProjectTank/MovementStrategy/MoveableTank.cs new file mode 100644 index 0000000..e725302 --- /dev/null +++ b/ProjectTank/ProjectTank/MovementStrategy/MoveableTank.cs @@ -0,0 +1,58 @@ +using ProjectTank.Drawning; + +namespace ProjectTank.MovementStrategy +{ + public class MoveableTank : IMoveableObject + { + /// + /// Поле-объект класса или его DrawningTank наследника + /// + private readonly DrawningTank? _tank = null; + /// + /// конструктор + /// + /// Объект класса DrawningTank + public MoveableTank(DrawningTank tank) + { + _tank = tank; + } + public ObjectParameters? GetObjectPosition + { + get + { + if (_tank == null || _tank.EntityTank == null || + !_tank.GetPosX.HasValue || !_tank.GetPosY.HasValue) + { + return null; + } + return new ObjectParameters(_tank.GetPosX.Value, + _tank.GetPosY.Value, _tank.GetWidth, _tank.GetHeight); + } + } + public int GetStep => (int)(_tank?.EntityTank?.Step ?? 0); + public bool TryMoveObject(MovementDirection direction) + { + if (_tank == null || _tank.EntityTank == null) + { + return false; + } + return _tank.MoveTransport(GetDirectionType(direction)); + } + /// + /// Конвертация из MovementDirection в DirectionType + /// + /// MovementDirection + /// DirectionType + private static DirectionType GetDirectionType(MovementDirection direction) + { + return direction switch + { + MovementDirection.Left => DirectionType.Left, + MovementDirection.Right => DirectionType.Right, + MovementDirection.Up => DirectionType.Up, + MovementDirection.Down => DirectionType.Down, + _ => DirectionType.Unknow, + }; + } + } +} diff --git a/ProjectTank/ProjectTank/MovementStrategy/MovementDirecton.cs b/ProjectTank/ProjectTank/MovementStrategy/MovementDirecton.cs new file mode 100644 index 0000000..3dcb6a6 --- /dev/null +++ b/ProjectTank/ProjectTank/MovementStrategy/MovementDirecton.cs @@ -0,0 +1,22 @@ +namespace ProjectTank.MovementStrategy +{ + public enum MovementDirection + { + /// + /// Вверх + /// + Up = 1, + /// + /// Вниз + /// + Down = 2, + /// + /// Влево + /// + Left = 3, + /// + /// Вправо + /// + Right = 4, + } +} diff --git a/ProjectTank/ProjectTank/MovementStrategy/ObjectParameters.cs b/ProjectTank/ProjectTank/MovementStrategy/ObjectParameters.cs new file mode 100644 index 0000000..2b5b7a4 --- /dev/null +++ b/ProjectTank/ProjectTank/MovementStrategy/ObjectParameters.cs @@ -0,0 +1,60 @@ +namespace ProjectTank.MovementStrategy +{ + public class ObjectParameters + { + /// + /// Координата X + /// + private readonly int _x; + /// + /// Координата Y + /// + private readonly int _y; + /// + /// Ширина объекта + /// + private readonly int _width; + /// + /// Высота объекта + /// + private readonly int _height; + /// + /// Левая граница + /// + public int LeftBorder => _x; + /// + /// Верхняя граница + /// + public int TopBorder => _y; + /// + /// Правая граница + /// + public int RightBorder => _x + _width; + /// + /// Нижняя граница + /// + public int DownBorder => _y + _height; + /// + /// Середина объекта + /// + public int ObjectMiddleHorizontal => _x + _width / 2; + /// + /// Середина объекта + /// + public int ObjectMiddleVertical => _y + _height / 2; + /// + /// Конструктор + /// + /// Координата X + /// Координата Y + /// Ширина объекта + /// Высота объекта + public ObjectParameters(int x, int y, int width, int height) + { + _x = x; + _y = y; + _width = width; + _height = height; + } + } +} diff --git a/ProjectTank/ProjectTank/MovementStrategy/StrategyStatus.cs b/ProjectTank/ProjectTank/MovementStrategy/StrategyStatus.cs new file mode 100644 index 0000000..e3c8953 --- /dev/null +++ b/ProjectTank/ProjectTank/MovementStrategy/StrategyStatus.cs @@ -0,0 +1,18 @@ +namespace ProjectTank.MovementStrategy +{ + public enum StrategyStatus + { + /// + /// Все готово к началу + /// + NotInit, + /// + /// Выполняется + /// + InProgress, + /// + /// Завершино + /// + Finish + } +} -- 2.25.1