From 7bb72da200f55bd77c870a803d256dc416632e2e Mon Sep 17 00:00:00 2001 From: "miromax6005@gmail.com" Date: Mon, 8 Apr 2024 06:00:11 +0400 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81=D1=82=D1=80=D0=B0=D1=82=D0=B5=D0=B3?= =?UTF-8?q?=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProjectBoat/ProjectBoat/DrawningBoat.cs | 237 ----------------- .../{ => Drawningsss}/DirectionType.cs | 7 +- .../ProjectBoat/Drawningsss/DrawningBoat.cs | 76 ++++++ .../ProjectBoat/Drawningsss/DrawningBoatt.cs | 247 ++++++++++++++++++ ProjectBoat/ProjectBoat/Enities/EntityBoat.cs | 46 ++++ .../ProjectBoat/Enities/EntityBoatt.cs | 46 ++++ ProjectBoat/ProjectBoat/FormBoat.Designer.cs | 44 +++- ProjectBoat/ProjectBoat/FormBoat.cs | 117 +++++++-- .../MovementStrategy/AbstractStrategy.cs | 142 ++++++++++ .../MovementStrategy/IMoveableObject.cs | 30 +++ .../MovementStrategy/MoveToBorder.cs | 42 +++ .../MovementStrategy/MoveToCenter.cs | 55 ++++ .../MovementStrategy/MoveableBoatt.cs | 66 +++++ .../MovementStrategy/MovementDirection.cs | 34 +++ .../MovementStrategy/ObjectParameters.cs | 78 ++++++ .../MovementStrategy/StrategyStatus.cs | 28 ++ ProjectBoat/ProjectBoat/ProjectBoat.csproj | 4 - 17 files changed, 1036 insertions(+), 263 deletions(-) delete mode 100644 ProjectBoat/ProjectBoat/DrawningBoat.cs rename ProjectBoat/ProjectBoat/{ => Drawningsss}/DirectionType.cs (72%) create mode 100644 ProjectBoat/ProjectBoat/Drawningsss/DrawningBoat.cs create mode 100644 ProjectBoat/ProjectBoat/Drawningsss/DrawningBoatt.cs create mode 100644 ProjectBoat/ProjectBoat/Enities/EntityBoat.cs create mode 100644 ProjectBoat/ProjectBoat/Enities/EntityBoatt.cs create mode 100644 ProjectBoat/ProjectBoat/MovementStrategy/AbstractStrategy.cs create mode 100644 ProjectBoat/ProjectBoat/MovementStrategy/IMoveableObject.cs create mode 100644 ProjectBoat/ProjectBoat/MovementStrategy/MoveToBorder.cs create mode 100644 ProjectBoat/ProjectBoat/MovementStrategy/MoveToCenter.cs create mode 100644 ProjectBoat/ProjectBoat/MovementStrategy/MoveableBoatt.cs create mode 100644 ProjectBoat/ProjectBoat/MovementStrategy/MovementDirection.cs create mode 100644 ProjectBoat/ProjectBoat/MovementStrategy/ObjectParameters.cs create mode 100644 ProjectBoat/ProjectBoat/MovementStrategy/StrategyStatus.cs diff --git a/ProjectBoat/ProjectBoat/DrawningBoat.cs b/ProjectBoat/ProjectBoat/DrawningBoat.cs deleted file mode 100644 index 972db75..0000000 --- a/ProjectBoat/ProjectBoat/DrawningBoat.cs +++ /dev/null @@ -1,237 +0,0 @@ -namespace ProjectBoat; -/// -/// Класс, отвечающий за прорисовку и перемещение объекта-сущности -/// -public class DrawningBoat -{ - /// - /// Класс-сущность - /// - public EntityBoat? EntityBoat { get; private set; } - - /// - /// Ширина окна - /// - public int? _pictireWight; - - /// - /// Высота окна - /// - public int? _pictireHeight; - - /// - /// Левая координата прорисовки автобуса - /// - public int? _startPosX; - - /// - /// Верхняя координата прорисовки автобуса - /// - public int? _startPosY; - - /// - /// Ширина прорисовки автобуса - /// - public readonly int _drawningBoatWight = 150; - - /// - /// Высота прорисовки автобуса - /// - public readonly int _drawningBoatHeight = 110; - - /// - /// Инициализация свойств - /// - /// Скорость - /// Вес - /// Основной цвет - /// Дополнительный цвет - /// Признак наличия лестницы - /// Признак наличия фонаря - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool ladder, bool flashlight) - { - EntityBoat = new EntityBoat(); - EntityBoat.Init(speed, weight, bodyColor, additionalColor, ladder, flashlight); - _pictireWight = null; - _pictireHeight = null; - _startPosX = null; - _startPosY = null; - } - - /// - /// Установка границ - /// - /// Ширина поля - /// Высота поля - /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах - public bool SetPictureSize(int width, int height) - { - // TODO проверка, что объект "влезает" в размеры поля - // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена - _pictireWight = width; - _pictireHeight = height; - return true; - } - - /// - /// Установка позиций - /// - /// Координата X - /// Координата Y - public void SetPosition(int x, int y) - { - if (!_pictireHeight.HasValue || !_pictireWight.HasValue) - { - return; - } - - // TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы - // то надо изменить координаты, чтобы он омтавался в этих границах - _startPosX = x; - _startPosY = y; - } - - /// - /// Изменение направления перемещения - /// - /// Направление - /// true - перемещение выполнено, false - перемещение невозможно - public bool MoveTransport(DirectionType direction) - { - if (EntityBoat == null || !_startPosX.HasValue || !_startPosY.HasValue) - { - return false; - } - switch (direction) - { - //влево - case DirectionType.Left: - if (_startPosX.Value - EntityBoat.Step > 0) - { - _startPosX -= (int)EntityBoat.Step; - } - return true; - //вверх - case DirectionType.Up: - if (_startPosY.Value - EntityBoat.Step > 0) - { - _startPosY -= (int)EntityBoat.Step; - } - return true; - - - - // вправо - case DirectionType.Right: - if (_startPosX.Value + _drawningBoatWight + EntityBoat.Step < _pictireWight) - { - _startPosX += (int)EntityBoat.Step; - } - return true; - //вниз - case DirectionType.Down: - if (_startPosY.Value + _drawningBoatHeight + EntityBoat.Step < _pictireHeight) - { - _startPosY += (int)EntityBoat.Step; - } - return true; - default: - return false; - } - } - - /// - /// Прорисовка объекта - /// - /// - public void DrawTransport(Graphics g) - { - if (EntityBoat == null || !_startPosX.HasValue || !_startPosY.HasValue) - { - return; - } - - Pen pen = new(Color.Black); - Brush additionalBrush = new SolidBrush(EntityBoat.AdditionalColor); - Brush br = new SolidBrush(EntityBoat.BodyColor); - Brush brRed = new SolidBrush(Color.Red); - Brush brBlue = new SolidBrush(Color.Blue); - Brush brBlack = new SolidBrush(Color.Black); - - // кузов - g.DrawRectangle(pen, _startPosX.Value + 10, _startPosY.Value, 150, 100); - g.FillRectangle(br, _startPosX.Value + 10, _startPosY.Value, 150, 100); - - // фонари - if (EntityBoat.Flashlight) - { - g.DrawEllipse(pen, _startPosX.Value + 140, _startPosY.Value + 55, 10, 10); - g.FillEllipse(brRed, _startPosX.Value + 140, _startPosY.Value + 55, 10, 10); - - g.DrawEllipse(pen, _startPosX.Value + 140, _startPosY.Value + 70, 10, 10); - g.FillEllipse(brRed, _startPosX.Value + 140, _startPosY.Value + 70, 10, 10); - } - - // дверь - g.DrawRectangle(pen, _startPosX.Value + 50, _startPosY.Value + 30, 30, 60); - g.FillRectangle(additionalBrush, _startPosX.Value + 50, _startPosY.Value + 30, 30, 60); - - // ручка двери - g.DrawRectangle(pen, _startPosX.Value + 66, _startPosY.Value + 50,7, 4); - g.FillRectangle(brBlack, _startPosX.Value + 66, _startPosY.Value + 50, 7, 4); - - // окно видителя - - g.DrawRectangle(pen, _startPosX.Value + 135, _startPosY.Value + 5, 20, 40); - g.FillRectangle(brBlue, _startPosX.Value + 135, _startPosY.Value + 5, 20, 40); - - // посажирские окна - // - // первый ряд - g.DrawEllipse(pen, _startPosX.Value + 50, _startPosY.Value + 5, 16, 16); - g.FillEllipse(brBlue, _startPosX.Value + 50, _startPosY.Value + 5, 16, 16); - - g.DrawEllipse(pen, _startPosX.Value + 71, _startPosY.Value + 5, 16, 16); - g.FillEllipse(brBlue, _startPosX.Value + 71, _startPosY.Value + 5, 16, 16); - - g.DrawEllipse(pen, _startPosX.Value + 92, _startPosY.Value + 5, 16, 16); - g.FillEllipse(brBlue, _startPosX.Value + 92, _startPosY.Value + 5, 16, 16); - - g.DrawEllipse(pen, _startPosX.Value + 113, _startPosY.Value + 5, 16, 16); - g.FillEllipse(brBlue, _startPosX.Value + 113, _startPosY.Value + 5, 16, 16); - // второй ряд - g.DrawEllipse(pen, _startPosX.Value + 92, _startPosY.Value + 26, 16, 16); - g.FillEllipse(brBlue, _startPosX.Value + 92, _startPosY.Value + 26, 16, 16); - - g.DrawEllipse(pen, _startPosX.Value + 113, _startPosY.Value + 26, 16, 16); - g.FillEllipse(brBlue, _startPosX.Value + 113, _startPosY.Value + 26, 16, 16); - - // колёса - g.DrawEllipse(pen, _startPosX.Value + 20, _startPosY.Value + 90, 20, 20); - g.FillEllipse(additionalBrush, _startPosX.Value + 20, _startPosY.Value + 90, 20, 20); - - g.DrawEllipse(pen, _startPosX.Value + 130, _startPosY.Value + 90, 20, 20); - g.FillEllipse(additionalBrush, _startPosX.Value + 130, _startPosY.Value + 90, 20, 20); - - // лестница - if (EntityBoat.Ladder) - { - // вертикальные линии - g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 15, 3, 42); - g.FillRectangle(brBlack, _startPosX.Value + 20, _startPosY.Value + 15, 3, 42); - - g.DrawRectangle(pen, _startPosX.Value + 35, _startPosY.Value + 15, 3, 42); - g.FillRectangle(brBlack, _startPosX.Value + 35, _startPosY.Value + 15, 3, 42); - - // горзонтальные линии - g.DrawRectangle(pen, _startPosX.Value + 15, _startPosY.Value + 25, 30, 3); - g.FillRectangle(brBlack, _startPosX.Value + 15, _startPosY.Value + 25, 30, 3); - - g.DrawRectangle(pen, _startPosX.Value + 15, _startPosY.Value + 35, 30, 3); - g.FillRectangle(brBlack, _startPosX.Value + 15, _startPosY.Value + 35, 30, 3); - - g.DrawRectangle(pen, _startPosX.Value + 15, _startPosY.Value + 45, 30, 3); - g.FillRectangle(brBlack, _startPosX.Value + 15, _startPosY.Value + 45, 30, 3); - } - } -} diff --git a/ProjectBoat/ProjectBoat/DirectionType.cs b/ProjectBoat/ProjectBoat/Drawningsss/DirectionType.cs similarity index 72% rename from ProjectBoat/ProjectBoat/DirectionType.cs rename to ProjectBoat/ProjectBoat/Drawningsss/DirectionType.cs index b37c0cc..fc2e004 100644 --- a/ProjectBoat/ProjectBoat/DirectionType.cs +++ b/ProjectBoat/ProjectBoat/Drawningsss/DirectionType.cs @@ -1,10 +1,15 @@ -namespace ProjectBoat; +namespace ProjectBoat.Drawningsss; /// /// Направление перемещения /// public enum DirectionType { + /// + /// Неизвестное направление + /// + Unknow = -1, + /// /// Вверх /// diff --git a/ProjectBoat/ProjectBoat/Drawningsss/DrawningBoat.cs b/ProjectBoat/ProjectBoat/Drawningsss/DrawningBoat.cs new file mode 100644 index 0000000..1d98f5c --- /dev/null +++ b/ProjectBoat/ProjectBoat/Drawningsss/DrawningBoat.cs @@ -0,0 +1,76 @@ + +using ProjectBoat.Enities; +using System.Drawing; + +namespace ProjectBoat.Drawningsss; +/// +/// Класс, отвечающий за прорисовку и перемещение объекта-сущности +/// +public class DrawningBoat : DrawningBoatt +{ + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия лестницы + /// Признак наличия фонаря + public DrawningBoat(int speed, double weight, Color bodyColor, Color additionalColor, bool ladder, bool flashlight) : base(150, 110) + { + EntityBoatt = new EntityBoat(speed, weight, bodyColor, additionalColor, ladder, flashlight); + } + + public override void DrawTransport(Graphics g) + { + + if (EntityBoatt == null || EntityBoatt is not EntityBoat boat || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + Pen pen = new(Color.Black); + Brush additionalBrush = new SolidBrush(boat.AdditionalColor); + Brush br = new SolidBrush(boat.BodyColor); + Brush brRed = new SolidBrush(Color.Red); + Brush brBlue = new SolidBrush(Color.Blue); + Brush brBlack = new SolidBrush(Color.Black); + + _startPosX += 10; + _startPosY += 5; + base.DrawTransport(g); + _startPosX -= 10; + _startPosY -= 5; + + // фонари + if (boat.Flashlight) + { + g.DrawEllipse(pen, _startPosX.Value + 140, _startPosY.Value + 55, 10, 10); + g.FillEllipse(additionalBrush, _startPosX.Value + 140, _startPosY.Value + 55, 10, 10); + + g.DrawEllipse(pen, _startPosX.Value + 140, _startPosY.Value + 70, 10, 10); + g.FillEllipse(additionalBrush, _startPosX.Value + 140, _startPosY.Value + 70, 10, 10); + } + + // лестница + if (boat.Ladder) + { + // вертикальные линии + g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 15, 3, 42); + g.FillRectangle(brBlack, _startPosX.Value + 20, _startPosY.Value + 15, 3, 42); + + g.DrawRectangle(pen, _startPosX.Value + 35, _startPosY.Value + 15, 3, 42); + g.FillRectangle(brBlack, _startPosX.Value + 35, _startPosY.Value + 15, 3, 42); + + // горзонтальные линии + g.DrawRectangle(pen, _startPosX.Value + 15, _startPosY.Value + 25, 30, 3); + g.FillRectangle(brBlack, _startPosX.Value + 15, _startPosY.Value + 25, 30, 3); + + g.DrawRectangle(pen, _startPosX.Value + 15, _startPosY.Value + 35, 30, 3); + g.FillRectangle(brBlack, _startPosX.Value + 15, _startPosY.Value + 35, 30, 3); + + g.DrawRectangle(pen, _startPosX.Value + 15, _startPosY.Value + 45, 30, 3); + g.FillRectangle(brBlack, _startPosX.Value + 15, _startPosY.Value + 45, 30, 3); + } + } +} \ No newline at end of file diff --git a/ProjectBoat/ProjectBoat/Drawningsss/DrawningBoatt.cs b/ProjectBoat/ProjectBoat/Drawningsss/DrawningBoatt.cs new file mode 100644 index 0000000..87581bf --- /dev/null +++ b/ProjectBoat/ProjectBoat/Drawningsss/DrawningBoatt.cs @@ -0,0 +1,247 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ProjectBoat.Enities; + +namespace ProjectBoat.Drawningsss; + +public class DrawningBoatt +{ + /// + /// Класс-сущность + /// + public EntityBoatt? EntityBoatt { get; protected set; } + + /// + /// Ширина окна + /// + private int? _pictireWight; + + /// + /// Высота окна + /// + private int? _pictireHeight; + + /// + /// Левая координата прорисовки автобуса + /// + protected int? _startPosX; + + /// + /// Верхняя координата прорисовки автобуса + /// + protected int? _startPosY; + + /// + /// Ширина прорисовки автобуса + /// + private readonly int _drawningBoatWight = 150; + + /// + /// Высота прорисовки автобуса + /// + private readonly int _drawningBoatHeight = 110; + + /// + /// Координата X объекта + /// + public int? GetPosX => _startPosX; + + /// + /// Координата Y объекта + /// + public int? GetPosY => _startPosY; + + /// + /// Ширина объекта + /// + public int GetWidth => _drawningBoatWight; + + /// + /// Высота объекта + /// + public int GetHeight => _drawningBoatHeight; + + /// + /// Пустой конструктор + /// + private DrawningBoatt() + { + _pictireWight = null; + _pictireHeight = null; + _startPosX = null; + _startPosY = null; + } + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + public DrawningBoatt(int speed, double weight, Color bodyColor) : this() + { + EntityBoatt = new EntityBoatt(speed, weight, bodyColor); + } + /// + /// Конструктор для наследников + /// + /// Ширина прорисовки автобуса + /// Высота прорисовки автобуса + protected DrawningBoatt(int drawningBoatWight, int drawningBoatHeight) : this() + { + _drawningBoatWight = drawningBoatWight; + _drawningBoatHeight = drawningBoatHeight; + } + + /// + /// Установка границ + /// + /// Ширина поля + /// Высота поля + /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах + public bool SetPictureSize(int width, int height) + { + // TODO проверка, что объект "влезает" в размеры поля + // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена + _pictireWight = width; + _pictireHeight = height; + return true; + } + + /// + /// Установка позиций + /// + /// Координата X + /// Координата Y + public void SetPosition(int x, int y) + { + if (!_pictireHeight.HasValue || !_pictireWight.HasValue) + { + return; + } + + // TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы + // то надо изменить координаты, чтобы он омтавался в этих границах + _startPosX = x; + _startPosY = y; + } + + /// + /// Изменение направления перемещения + /// + /// Направление + /// true - перемещение выполнено, false - перемещение невозможно + public bool MoveTransport(DirectionType direction) + { + if (EntityBoatt == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return false; + } + switch (direction) + { + //влево + case DirectionType.Left: + if (_startPosX.Value - EntityBoatt.Step > 0) + { + _startPosX -= (int)EntityBoatt.Step; + } + return true; + //вверх + case DirectionType.Up: + if (_startPosY.Value - EntityBoatt.Step > 0) + { + _startPosY -= (int)EntityBoatt.Step; + } + return true; + + + + // вправо + case DirectionType.Right: + if (_startPosX.Value + _drawningBoatWight + EntityBoatt.Step < _pictireWight) + { + _startPosX += (int)EntityBoatt.Step; + } + return true; + //вниз + case DirectionType.Down: + if (_startPosY.Value + _drawningBoatHeight + EntityBoatt.Step < _pictireHeight) + { + _startPosY += (int)EntityBoatt.Step; + } + return true; + default: + return false; + } + } + + /// + /// Прорисовка объекта + /// + /// + public virtual void DrawTransport(Graphics g) + { + if (EntityBoatt == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + + Pen pen = new(Color.Black); + Brush br = new SolidBrush(EntityBoatt.BodyColor); + Brush brRed = new SolidBrush(Color.Red); + Brush brBlue = new SolidBrush(Color.Blue); + Brush brBlack = new SolidBrush(Color.Black); + + // кузов + g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value - 5, 150, 100); + g.FillRectangle(br, _startPosX.Value, _startPosY.Value - 5, 150, 100); + + + + // дверь + g.DrawRectangle(pen, _startPosX.Value + 40, _startPosY.Value + 25, 30, 60); + g.FillRectangle(brRed, _startPosX.Value + 40, _startPosY.Value + 25, 30, 60); + + // ручка двери + g.DrawRectangle(pen, _startPosX.Value + 56, _startPosY.Value + 45, 7, 4); + g.FillRectangle(brBlack, _startPosX.Value + 56, _startPosY.Value + 45, 7, 4); + + // окно видителя + + g.DrawRectangle(pen, _startPosX.Value + 125, _startPosY.Value, 20, 40); + g.FillRectangle(brBlue, _startPosX.Value + 125, _startPosY.Value, 20, 40); + + // посажирские окна + // + // первый ряд + g.DrawEllipse(pen, _startPosX.Value + 40, _startPosY.Value, 16, 16); + g.FillEllipse(brBlue, _startPosX.Value + 40, _startPosY.Value, 16, 16); + + g.DrawEllipse(pen, _startPosX.Value + 61, _startPosY.Value, 16, 16); + g.FillEllipse(brBlue, _startPosX.Value + 61, _startPosY.Value, 16, 16); + + g.DrawEllipse(pen, _startPosX.Value + 82, _startPosY.Value, 16, 16); + g.FillEllipse(brBlue, _startPosX.Value + 82, _startPosY.Value, 16, 16); + + g.DrawEllipse(pen, _startPosX.Value + 103, _startPosY.Value, 16, 16); + g.FillEllipse(brBlue, _startPosX.Value + 103, _startPosY.Value, 16, 16); + // второй ряд + g.DrawEllipse(pen, _startPosX.Value + 82, _startPosY.Value + 21, 16, 16); + g.FillEllipse(brBlue, _startPosX.Value + 82, _startPosY.Value + 21, 16, 16); + + g.DrawEllipse(pen, _startPosX.Value + 103, _startPosY.Value + 21, 16, 16); + g.FillEllipse(brBlue, _startPosX.Value + 103, _startPosY.Value + 21, 16, 16); + + // колёса + g.DrawEllipse(pen, _startPosX.Value + 10, _startPosY.Value + 85, 20, 20); + g.FillEllipse(brBlack, _startPosX.Value + 10, _startPosY.Value + 85, 20, 20); + + g.DrawEllipse(pen, _startPosX.Value + 120, _startPosY.Value + 85, 20, 20); + g.FillEllipse(brBlack, _startPosX.Value + 120, _startPosY.Value + 85, 20, 20); + + + } +} + diff --git a/ProjectBoat/ProjectBoat/Enities/EntityBoat.cs b/ProjectBoat/ProjectBoat/Enities/EntityBoat.cs new file mode 100644 index 0000000..a7320fa --- /dev/null +++ b/ProjectBoat/ProjectBoat/Enities/EntityBoat.cs @@ -0,0 +1,46 @@ +using ProjectBoat.Enities; + +namespace ProjectBoat; +/// +/// Класс-сущность "Автобус" +/// +public class EntityBoat : EntityBoatt +{ + + /// + /// Дополнительный цвет (для опциональных элементов) + /// + public Color AdditionalColor { get; private set; } + + /// + /// Признак (опция) наличия лестницы + /// + public bool Ladder { get; private set; } + + /// + /// Признак (опция) наличия фонаря + /// + public bool Flashlight { get; private set; } + + + /// + /// Шаг перемещения автобуса + /// + public double Step => Speed * 100 / Weight; + + /// + /// Инициализация полей объекта-класса автобуса + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия лестницы + /// Признак наличия фонарей + public EntityBoat(int speed, double weight, Color bodyColor, Color additionalColor, bool ladder, bool flashlight) : base(speed, weight, bodyColor) + { + AdditionalColor = additionalColor; + Ladder = ladder; + Flashlight = flashlight; + } +} \ No newline at end of file diff --git a/ProjectBoat/ProjectBoat/Enities/EntityBoatt.cs b/ProjectBoat/ProjectBoat/Enities/EntityBoatt.cs new file mode 100644 index 0000000..ff6dd30 --- /dev/null +++ b/ProjectBoat/ProjectBoat/Enities/EntityBoatt.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectBoat.Enities; + +/// +/// Класс-сущность "Автобус." +/// +public class EntityBoatt +{ + /// + /// Скорость + /// + public int Speed { get; private set; } + + /// + /// Вес + /// + public double Weight { get; private set; } + + /// + /// Основной цвет + /// + public Color BodyColor { get; private set; } + + /// + /// Шаг перемещения автобуса + /// + public double Step => Speed * 100 / Weight; + + /// + /// Конструктор сущности + /// + /// Скорость + /// Вес + /// Основной цвет + public EntityBoatt(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + } +} diff --git a/ProjectBoat/ProjectBoat/FormBoat.Designer.cs b/ProjectBoat/ProjectBoat/FormBoat.Designer.cs index c01d471..cb8f4e8 100644 --- a/ProjectBoat/ProjectBoat/FormBoat.Designer.cs +++ b/ProjectBoat/ProjectBoat/FormBoat.Designer.cs @@ -34,6 +34,9 @@ buttonRight = new Button(); buttonDown = new Button(); buttonUp = new Button(); + buttonCreateBoatt = new Button(); + comboBoxStrategy = new ComboBox(); + buttontrategyStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxBoat).BeginInit(); SuspendLayout(); // @@ -51,9 +54,9 @@ buttonCreateBoat.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; buttonCreateBoat.Location = new Point(12, 378); buttonCreateBoat.Name = "buttonCreateBoat"; - buttonCreateBoat.Size = new Size(94, 29); + buttonCreateBoat.Size = new Size(243, 29); buttonCreateBoat.TabIndex = 1; - buttonCreateBoat.Text = "Создать"; + buttonCreateBoat.Text = "Создать безопасный автобус"; buttonCreateBoat.UseVisualStyleBackColor = true; buttonCreateBoat.Click += ButtonCreateBoat_Click; // @@ -105,11 +108,45 @@ buttonUp.UseVisualStyleBackColor = true; buttonUp.Click += ButtonMove_Click; // + // buttonCreateBoatt + // + buttonCreateBoatt.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateBoatt.Location = new Point(261, 378); + buttonCreateBoatt.Name = "buttonCreateBoatt"; + buttonCreateBoatt.Size = new Size(243, 29); + buttonCreateBoatt.TabIndex = 6; + buttonCreateBoatt.Text = "Создать автобус"; + buttonCreateBoatt.UseVisualStyleBackColor = true; + buttonCreateBoatt.Click += ButtonCreateBoatt_Click; + // + // comboBoxStrategy + // + comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Items.AddRange(new object[] { "К центру", "К краю" }); + comboBoxStrategy.Location = new Point(635, 12); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(151, 28); + comboBoxStrategy.TabIndex = 7; + // + // buttontrategyStep + // + buttontrategyStep.Location = new Point(692, 46); + buttontrategyStep.Name = "buttontrategyStep"; + buttontrategyStep.Size = new Size(94, 30); + buttontrategyStep.TabIndex = 8; + buttontrategyStep.Text = "Шаг"; + buttontrategyStep.UseVisualStyleBackColor = true; + buttontrategyStep.Click += ButtonStrategyStep_Click; + // // FormBoat // AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(798, 419); + Controls.Add(buttontrategyStep); + Controls.Add(comboBoxStrategy); + Controls.Add(buttonCreateBoatt); Controls.Add(buttonUp); Controls.Add(buttonDown); Controls.Add(buttonRight); @@ -130,5 +167,8 @@ private Button buttonRight; private Button buttonDown; private Button buttonUp; + private Button buttonCreateBoatt; + private ComboBox comboBoxStrategy; + private Button buttontrategyStep; } } \ No newline at end of file diff --git a/ProjectBoat/ProjectBoat/FormBoat.cs b/ProjectBoat/ProjectBoat/FormBoat.cs index 7e97c3d..c8a49d7 100644 --- a/ProjectBoat/ProjectBoat/FormBoat.cs +++ b/ProjectBoat/ProjectBoat/FormBoat.cs @@ -1,4 +1,8 @@ -namespace ProjectBoat; +using ProjectBoat.Drawningsss; +using ProjectBoat.MovementStrategy; +using System.Runtime.InteropServices; + +namespace ProjectBoat; /// /// Форма работы с объектом "Катер" @@ -8,7 +12,12 @@ public partial class FormBoat : Form /// /// Поле-объект для прорисовки объекта /// - private DrawningBoat? _drawningBoat; + private DrawningBoatt? _drawningBoatt; + + /// + /// + /// + private AbstractStrategy? _strategy; /// /// Конструктор формы @@ -16,6 +25,7 @@ public partial class FormBoat : Form public FormBoat() { InitializeComponent(); + _strategy = null; } /// @@ -23,33 +33,62 @@ public partial class FormBoat : Form /// private void Draw() { - if (_drawningBoat == null) + if (_drawningBoatt == null) { return; } Bitmap bmp = new(pictureBoxBoat.Width, pictureBoxBoat.Height); Graphics gr = Graphics.FromImage(bmp); - _drawningBoat.DrawTransport(gr); + _drawningBoatt.DrawTransport(gr); pictureBoxBoat.Image = bmp; } + private void CreateObject(string type) + { + Random random = new Random(); + + switch (type) + { + case nameof(DrawningBoatt): + _drawningBoatt = new DrawningBoatt(random.Next(100, 500), random.Next(1000, 3000), Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256))); + break; + case nameof(DrawningBoat): + _drawningBoatt = new DrawningBoat(random.Next(100, 500), 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; + } + + _drawningBoatt.SetPictureSize(pictureBoxBoat.Width, pictureBoxBoat.Height); + _drawningBoatt.SetPosition(random.Next(10, 100), random.Next(10, 100)); + _strategy = null; + comboBoxStrategy.Enabled = true; + Draw(); + } + /// - /// Обработка нажатия кнопки "Создать" + /// Обработка нажатия кнопки "Создать безопасный автобус" /// /// /// private void ButtonCreateBoat_Click(object sender, EventArgs e) { - Random random = new(); - _drawningBoat = new DrawningBoat(); - _drawningBoat.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))); - _drawningBoat.SetPictureSize(pictureBoxBoat.Width, pictureBoxBoat.Height); - _drawningBoat.SetPosition(random.Next(10, 100), random.Next(10, 100)); - Draw(); + CreateObject(nameof(DrawningBoat)); + } + + + /// + /// Обработка нажатия кнопки "Создать автобус" + /// + /// + /// + private void ButtonCreateBoatt_Click(object sender, EventArgs e) + { + CreateObject(nameof(DrawningBoatt)); } /// @@ -59,7 +98,7 @@ public partial class FormBoat : Form /// private void ButtonMove_Click(object sender, EventArgs e) { - if (_drawningBoat == null) + if (_drawningBoatt == null) { return; } @@ -69,16 +108,16 @@ public partial class FormBoat : Form switch (name) { case "buttonUp": - result = _drawningBoat.MoveTransport(DirectionType.Up); + result = _drawningBoatt.MoveTransport(DirectionType.Up); break; case "buttonDown": - result = _drawningBoat.MoveTransport(DirectionType.Down); + result = _drawningBoatt.MoveTransport(DirectionType.Down); break; case "buttonLeft": - result = _drawningBoat.MoveTransport(DirectionType.Left); + result = _drawningBoatt.MoveTransport(DirectionType.Left); break; case "buttonRight": - result = _drawningBoat.MoveTransport(DirectionType.Right); + result = _drawningBoatt.MoveTransport(DirectionType.Right); break; } if (result) @@ -86,4 +125,44 @@ public partial class FormBoat : Form Draw(); } } + + /// + /// Обработка нажатия кнопки "Шаг" + /// + /// + /// + private void ButtonStrategyStep_Click(object sender, EventArgs e) + { + if (_drawningBoatt == null) + { + return; + } + if (comboBoxStrategy.Enabled) + { + _strategy = comboBoxStrategy.SelectedIndex switch + { + 0 => new MoveToCenter(), + 1 => new MoveToBorder(), + _ => null, + }; + if (_strategy == null) + { + return; + } + _strategy.SetData(new MoveableBoatt(_drawningBoatt), pictureBoxBoat.Width, pictureBoxBoat.Height); + } + if (_strategy == null) + { + return; + } + comboBoxStrategy.Enabled = false; + _strategy.MakeStep(); + Draw(); + + if (_strategy.GetStatus() == StrategyStatus.Finish) + { + comboBoxStrategy.Enabled = true; + _strategy = null; + } + } } diff --git a/ProjectBoat/ProjectBoat/MovementStrategy/AbstractStrategy.cs b/ProjectBoat/ProjectBoat/MovementStrategy/AbstractStrategy.cs new file mode 100644 index 0000000..4506b3b --- /dev/null +++ b/ProjectBoat/ProjectBoat/MovementStrategy/AbstractStrategy.cs @@ -0,0 +1,142 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectBoat.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 (IsTargetDestination()) + { + _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 IsTargetDestination(); + + /// + /// Попытка перемещения в требуемом направлении + /// + /// Направление + /// Результат попытки (true - удалось переместиться, false - неудача) + private bool MoveTo(MovementDirection movementDirection) + { + if (_state != StrategyStatus.InProgress) + { + return false; + } + return _moveableObject?.TryMoveObject(movementDirection) ?? false; + } + +} diff --git a/ProjectBoat/ProjectBoat/MovementStrategy/IMoveableObject.cs b/ProjectBoat/ProjectBoat/MovementStrategy/IMoveableObject.cs new file mode 100644 index 0000000..ce5b7d1 --- /dev/null +++ b/ProjectBoat/ProjectBoat/MovementStrategy/IMoveableObject.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectBoat.MovementStrategy; + +/// +/// Интерфейс для работы с перемещаемым объектом +/// +public interface IMoveableObject +{ + /// + /// Получение координаты объекта + /// + ObjectParameters? GetObjectPosition { get; } + + /// + /// Шаг объекта + /// + int GetStep { get; } + + /// + /// Попытка переместить объект в указанном направлении + /// + /// Направление + /// true - объект перемещен, false - перемещение невозможно + bool TryMoveObject(MovementDirection direction); +} diff --git a/ProjectBoat/ProjectBoat/MovementStrategy/MoveToBorder.cs b/ProjectBoat/ProjectBoat/MovementStrategy/MoveToBorder.cs new file mode 100644 index 0000000..70b4106 --- /dev/null +++ b/ProjectBoat/ProjectBoat/MovementStrategy/MoveToBorder.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectBoat.MovementStrategy; + +public class MoveToBorder : AbstractStrategy +{ + protected override bool IsTargetDestination() + { + 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/ProjectBoat/ProjectBoat/MovementStrategy/MoveToCenter.cs b/ProjectBoat/ProjectBoat/MovementStrategy/MoveToCenter.cs new file mode 100644 index 0000000..30ffa31 --- /dev/null +++ b/ProjectBoat/ProjectBoat/MovementStrategy/MoveToCenter.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectBoat.MovementStrategy; + +public class MoveToCenter : AbstractStrategy +{ + protected override bool IsTargetDestination() + { + 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/ProjectBoat/ProjectBoat/MovementStrategy/MoveableBoatt.cs b/ProjectBoat/ProjectBoat/MovementStrategy/MoveableBoatt.cs new file mode 100644 index 0000000..cfa64e1 --- /dev/null +++ b/ProjectBoat/ProjectBoat/MovementStrategy/MoveableBoatt.cs @@ -0,0 +1,66 @@ +using ProjectBoat.Drawningsss; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectBoat.MovementStrategy; + +/// +/// Класс-реализация IMoveableObject с использованием DrawningBoatt +/// +public class MoveableBoatt : IMoveableObject +{ + /// + /// Поле-объект класса DrawningBaott или его наследника + /// + private readonly DrawningBoatt? _boatt = null; + + /// + /// Конструктор + /// + /// Объект класса DrawningBoatt + public MoveableBoatt(DrawningBoatt boatt) + { + _boatt = boatt; + } + public ObjectParameters? GetObjectPosition + { + get + { + if (_boatt == null || _boatt.EntityBoatt == null || + !_boatt.GetPosX.HasValue || !_boatt.GetPosY.HasValue) + { + return null; + } + return new ObjectParameters(_boatt.GetPosX.Value, _boatt.GetPosY.Value, _boatt.GetWidth, _boatt.GetHeight); + } + } + public int GetStep => (int)(_boatt?.EntityBoatt?.Step ?? 0); + public bool TryMoveObject(MovementDirection direction) + { + if (_boatt == null || _boatt.EntityBoatt == null) + { + return false; + } + return _boatt.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, + }; + } +} \ No newline at end of file diff --git a/ProjectBoat/ProjectBoat/MovementStrategy/MovementDirection.cs b/ProjectBoat/ProjectBoat/MovementStrategy/MovementDirection.cs new file mode 100644 index 0000000..2bb72e0 --- /dev/null +++ b/ProjectBoat/ProjectBoat/MovementStrategy/MovementDirection.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectBoat.MovementStrategy; + + +/// +/// Направление перемещения +/// +public enum MovementDirection +{ + /// + /// Вверх + /// + Up = 1, + + /// + /// Вниз + /// + Down = 2, + + /// + /// Влево + /// + Left = 3, + + /// + /// Вправо + /// + Right = 4, +} diff --git a/ProjectBoat/ProjectBoat/MovementStrategy/ObjectParameters.cs b/ProjectBoat/ProjectBoat/MovementStrategy/ObjectParameters.cs new file mode 100644 index 0000000..381dee2 --- /dev/null +++ b/ProjectBoat/ProjectBoat/MovementStrategy/ObjectParameters.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectBoat.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/ProjectBoat/ProjectBoat/MovementStrategy/StrategyStatus.cs b/ProjectBoat/ProjectBoat/MovementStrategy/StrategyStatus.cs new file mode 100644 index 0000000..2b536d3 --- /dev/null +++ b/ProjectBoat/ProjectBoat/MovementStrategy/StrategyStatus.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectBoat.MovementStrategy; + +/// +/// Статус выполнения операции перемещения +/// +public enum StrategyStatus +{ + /// + /// Всё готого к началу + /// + NotInit, + + /// + /// Выполняется + /// + InProgress, + + /// + /// Завершено + /// + Finish +} diff --git a/ProjectBoat/ProjectBoat/ProjectBoat.csproj b/ProjectBoat/ProjectBoat/ProjectBoat.csproj index 79c2ddd..af03d74 100644 --- a/ProjectBoat/ProjectBoat/ProjectBoat.csproj +++ b/ProjectBoat/ProjectBoat/ProjectBoat.csproj @@ -23,8 +23,4 @@ - - - - \ No newline at end of file