From f4d9f4ae93b2fb6f7d9445e60f8d028ada484504 Mon Sep 17 00:00:00 2001 From: DanilaSm08 Date: Sat, 9 Mar 2024 16:35:44 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=20=E2=84=962?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectCleaningCar/DrawningCleaningCar.cs | 211 ----------------- .../{ => Drawnings}/DirectionType.cs | 6 +- .../Drawnings/DrawningCar.cs | 219 ++++++++++++++++++ .../Drawnings/DrawningCleaningCar.cs | 62 +++++ .../ProjectCleaningCar/Entites/EntityCar.cs | 43 ++++ .../{ => Entites}/EntityCleaningCar.cs | 33 +-- .../FormCleaningCar.Designer.cs | 66 ++++-- .../ProjectCleaningCar/FormCleaningCar.cs | 128 +++++++--- .../MovementStrategy/AbstractStrategy.cs | 126 ++++++++++ .../MovementStrategy/IMoveableObject.cs | 27 +++ .../MovementStrategy/MoveToBorder.cs | 34 +++ .../MovementStrategy/MoveToCenter.cs | 57 +++++ .../MovementStrategy/MoveableCar.cs | 64 +++++ .../MovementStrategy/MovementDirection.cs | 26 +++ .../MovementStrategy/ObjectParameters.cs | 67 ++++++ .../MovementStrategy/StrategyStatus.cs | 27 +++ 16 files changed, 919 insertions(+), 277 deletions(-) delete mode 100644 ProjectCleaningCar/ProjectCleaningCar/DrawningCleaningCar.cs rename ProjectCleaningCar/ProjectCleaningCar/{ => Drawnings}/DirectionType.cs (77%) create mode 100644 ProjectCleaningCar/ProjectCleaningCar/Drawnings/DrawningCar.cs create mode 100644 ProjectCleaningCar/ProjectCleaningCar/Drawnings/DrawningCleaningCar.cs create mode 100644 ProjectCleaningCar/ProjectCleaningCar/Entites/EntityCar.cs rename ProjectCleaningCar/ProjectCleaningCar/{ => Entites}/EntityCleaningCar.cs (58%) create mode 100644 ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/AbstractStrategy.cs create mode 100644 ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/IMoveableObject.cs create mode 100644 ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/MoveToBorder.cs create mode 100644 ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/MoveToCenter.cs create mode 100644 ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/MoveableCar.cs create mode 100644 ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/MovementDirection.cs create mode 100644 ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/ObjectParameters.cs create mode 100644 ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/StrategyStatus.cs diff --git a/ProjectCleaningCar/ProjectCleaningCar/DrawningCleaningCar.cs b/ProjectCleaningCar/ProjectCleaningCar/DrawningCleaningCar.cs deleted file mode 100644 index 8f96e69..0000000 --- a/ProjectCleaningCar/ProjectCleaningCar/DrawningCleaningCar.cs +++ /dev/null @@ -1,211 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProjectCleaningCar; -/// -/// Класс, отвечающий за прорисовку и перемещение объекта-сущности -/// -public class DrawningCleaningCar -{ - /// - /// Класс-сущность - /// - public EntityCleaningCar? EntityCleaningCar { get; private set; } - /// - /// Ширина окна - /// - private int? _pictureWidth = null; - /// - /// Высота окна - /// - private int? _pictureHeight = null; - /// - /// Левая координата прорисовки автомобиля - /// - private int? _startPosX; - /// - /// Верхняя координата прорисовки автомобиля - /// - private int? _startPosY; - /// - /// Ширина прорисовки автомобиля - /// - private readonly int _drawningCleaningCarWidth = 150; - /// - /// Высота прорисовки автомобиля - /// - private readonly int _drawningCleaningCarHeight = 80; - /// - /// Инициализация свойств - /// - /// Скорость - /// Вес - /// Основной цвет - /// Дополнительный цвет - /// Признак наличия бака под воду - /// Признак наличия - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, - bool waterTank, bool sweepingBrush) - { - EntityCleaningCar = new EntityCleaningCar(); - EntityCleaningCar.Init(speed, weight, bodyColor, additionalColor, waterTank, sweepingBrush); - //_pictureWidth = null; - //_pictureHeight = null; - //_startPosX = null; - //_startPosY = null; - } - /// - /// Установка границ поля - /// - /// Ширина поля - /// Высота поля - /// true - границы заданы, false - проверка не найдена, нельзя разместить - /// объект в этих размерах - public Boolean SetPictureSize(int width, int height) - { - if (width <= _drawningCleaningCarWidth || height <= _drawningCleaningCarHeight) return false; - _pictureWidth = width; - _pictureHeight = height; - if (_startPosX.HasValue && _startPosY.HasValue) - { - if (_startPosX + _drawningCleaningCarWidth > _pictureWidth) - { - _startPosX = _pictureWidth.Value - _drawningCleaningCarWidth; - } - if (_startPosY + _drawningCleaningCarHeight > _pictureHeight) - { - _startPosY = _pictureHeight.Value - _drawningCleaningCarHeight; - } - } - - return true; - } - /// - /// Установка позиция - /// - /// Координата Х - /// Координата Y - public void SetPosition(int x, int y) - { - if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) - { - return; - } - - _startPosX = x; - _startPosY = y; - - if (_drawningCleaningCarHeight + y > _pictureHeight || y < 0) - { - _startPosY = 0; - } - if (_drawningCleaningCarWidth + x > _pictureWidth || x < 0) - { - _startPosX = 0; - } - return; - } - /// - /// Изменение направления перемещения - /// - /// Направление - /// true - перемещение выполнено, false - перемещение невозможно - public bool MoveTransport(DirectionType direction) - { - if (EntityCleaningCar == null || !_startPosX.HasValue || !_startPosY.HasValue) - { - return false; - } - switch (direction) - { - // Влево - case DirectionType.Left: - if (_startPosX.Value - EntityCleaningCar.Step > 0) - { - _startPosX -= (int)EntityCleaningCar.Step; - } - return true; - // Вверх - case DirectionType.Up: - if (_startPosY.Value - EntityCleaningCar.Step > 0) - { - _startPosY -= (int)EntityCleaningCar.Step; - } - return true; - // Вправо - case DirectionType.Right: - if (_startPosX.Value + _drawningCleaningCarWidth + EntityCleaningCar.Step < _pictureWidth) - { - _startPosX += (int)EntityCleaningCar.Step; - } - return true; - // Вниз - case DirectionType.Down: - if (_startPosY.Value + _drawningCleaningCarHeight + EntityCleaningCar.Step < _pictureHeight) - { - _startPosY += (int)EntityCleaningCar.Step; - } - return true; - default: - return false; - } - } - /// - /// Прорисовка объекта - /// - /// - public void DrawTransport(Graphics g) - { - if (EntityCleaningCar == null || !_startPosX.HasValue || !_startPosY.HasValue) - { - return; - } - if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) return; - Pen pen = new Pen(Color.Black); - Brush additionalBrush = new SolidBrush(EntityCleaningCar.AdditionalColor); - - // Границы подметально-уборочной машины - Brush br = new SolidBrush(EntityCleaningCar.BodyColor); - // Платформа - g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 40, 100, 20); - g.FillRectangle(br, _startPosX.Value, _startPosY.Value + 40, 100, 20); - // Кабина - g.DrawRectangle(pen, _startPosX.Value + 80, _startPosY.Value, 20, 40); - g.FillRectangle(br, _startPosX.Value + 80, _startPosY.Value, 20, 40); - // Колёса - Brush brBlack = new SolidBrush(Color.Black); - g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 60, 20, 20); - g.DrawEllipse(pen, _startPosX.Value + 25, _startPosY.Value + 60, 20, 20); - g.DrawEllipse(pen, _startPosX.Value + 80, _startPosY.Value + 60, 20, 20); - g.FillEllipse(brBlack, _startPosX.Value, _startPosY.Value + 60, 20, 20); - g.FillEllipse(brBlack, _startPosX.Value + 25, _startPosY.Value + 60, 20, 20); - g.FillEllipse(brBlack, _startPosX.Value + 80, _startPosY.Value + 60, 20, 20); - // Окно - Brush brBlue = new SolidBrush(Color.LightBlue); - g.DrawRectangle(pen, _startPosX.Value + 85, _startPosY.Value + 5, 10, 15); - g.FillRectangle(brBlue, _startPosX.Value + 85, _startPosY.Value + 5, 10, 15); - //Бак под воду - if (EntityCleaningCar.WaterTank) - { - g.FillEllipse(additionalBrush, _startPosX.Value, _startPosY.Value, 80, 40); - g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value, 80, 40); - } - // Щётка - if (EntityCleaningCar.SweepingBrush) - { - g.DrawRectangle(pen, _startPosX.Value + 100, _startPosY.Value + 50, 30, 5); - g.FillRectangle(additionalBrush, _startPosX.Value + 100, _startPosY.Value + 50, 30, 5); - Point[] sweepingBrush = - { - new Point(_startPosX.Value + 130, _startPosY.Value + 50), - new Point(_startPosX.Value + 150, _startPosY.Value + 80), - new Point(_startPosX.Value + 110, _startPosY.Value + 80), - }; - g.FillPolygon(additionalBrush, sweepingBrush); - g.DrawPolygon(pen, sweepingBrush); - } - } -} diff --git a/ProjectCleaningCar/ProjectCleaningCar/DirectionType.cs b/ProjectCleaningCar/ProjectCleaningCar/Drawnings/DirectionType.cs similarity index 77% rename from ProjectCleaningCar/ProjectCleaningCar/DirectionType.cs rename to ProjectCleaningCar/ProjectCleaningCar/Drawnings/DirectionType.cs index 6fb07e7..fd774f7 100644 --- a/ProjectCleaningCar/ProjectCleaningCar/DirectionType.cs +++ b/ProjectCleaningCar/ProjectCleaningCar/Drawnings/DirectionType.cs @@ -4,12 +4,16 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace ProjectCleaningCar; +namespace ProjectCleaningCar.Drawnings; /// /// Направление перемещения /// public enum DirectionType { + /// + /// Неизвестное направление + /// + Unknow = -1, /// /// Вверх /// diff --git a/ProjectCleaningCar/ProjectCleaningCar/Drawnings/DrawningCar.cs b/ProjectCleaningCar/ProjectCleaningCar/Drawnings/DrawningCar.cs new file mode 100644 index 0000000..8fba228 --- /dev/null +++ b/ProjectCleaningCar/ProjectCleaningCar/Drawnings/DrawningCar.cs @@ -0,0 +1,219 @@ +using ProjectCleaningCar.Entites; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectCleaningCar.Drawnings; + +public class DrawningCar +{ + /// + /// Класс-сущность + /// + public EntityCar? EntityCar { get; protected set; } + /// + /// Ширина окна + /// + private int? _pictureWidth = null; + /// + /// Высота окна + /// + private int? _pictureHeight = null; + /// + /// Левая координата прорисовки автомобиля + /// + protected int? _startPosX; + /// + /// Верхняя координата прорисовки автомобиля + /// + protected int? _startPosY; + /// + /// Ширина прорисовки автомобиля + /// + private readonly int _drawningCarWidth = 100; + /// + /// Высота прорисовки автомобиля + /// + private readonly int _drawningCarHeight = 80; + + /// + /// Координата X объекта + /// + public int? GetPosX => _startPosX; + /// + /// Координата Y объекта + /// + public int? GetPosY => _startPosY; + /// + /// Ширина объекта + /// + public int GetWidth => _drawningCarWidth; + /// + /// Высота объекта + /// + public int GetHeight => _drawningCarHeight; + + /// + /// Пустой конструктор + /// + private DrawningCar() + { + _pictureWidth = null; + _pictureHeight = null; + _startPosX = null; + _startPosY = null; + } + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + public DrawningCar(int speed, double weight, Color bodyColor) : this() + { + EntityCar = new EntityCar(speed, weight, bodyColor); + } + /// + /// Конструктор для наследников + /// + /// Ширина прорисовки автомобиля + /// Высота прорисовки автомобиля + protected DrawningCar(int drawningCarWidth, int drawningCarHeight) : this() + { + _drawningCarWidth = drawningCarWidth; + _pictureHeight = drawningCarHeight; + } + /// + /// Установка границ поля + /// + /// Ширина поля + /// Высота поля + /// true - границы заданы, false - проверка не найдена, нельзя разместить + /// объект в этих размерах + public Boolean SetPictureSize(int width, int height) + { + if (width <= _drawningCarWidth || height <= _drawningCarHeight) return false; + _pictureWidth = width; + _pictureHeight = height; + if (_startPosX.HasValue && _startPosY.HasValue) + { + if (_startPosX + _drawningCarWidth > _pictureWidth) + { + _startPosX = _pictureWidth.Value - _drawningCarWidth; + } + if (_startPosY + _drawningCarHeight > _pictureHeight) + { + _startPosY = _pictureHeight.Value - _drawningCarHeight; + } + } + + return true; + } + /// + /// Установка позиция + /// + /// Координата Х + /// Координата Y + public void SetPosition(int x, int y) + { + if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) + { + return; + } + + _startPosX = x; + _startPosY = y; + + if (_drawningCarHeight + y > _pictureHeight || y < 0) + { + _startPosY = 0; + } + if (_drawningCarWidth + x > _pictureWidth || x < 0) + { + _startPosX = 0; + } + return; + } + /// + /// Изменение направления перемещения + /// + /// Направление + /// true - перемещение выполнено, false - перемещение невозможно + public bool MoveTransport(DirectionType direction) + { + if (EntityCar == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return false; + } + switch (direction) + { + // Влево + case DirectionType.Left: + if (_startPosX.Value - EntityCar.Step > 0) + { + _startPosX -= (int)EntityCar.Step; + } + return true; + // Вверх + case DirectionType.Up: + if (_startPosY.Value - EntityCar.Step > 0) + { + _startPosY -= (int)EntityCar.Step; + } + return true; + // Вправо + case DirectionType.Right: + if (_startPosX.Value + _drawningCarWidth + EntityCar.Step < _pictureWidth) + { + _startPosX += (int)EntityCar.Step; + } + return true; + // Вниз + case DirectionType.Down: + if (_startPosY.Value + _drawningCarHeight + EntityCar.Step < _pictureHeight) + { + _startPosY += (int)EntityCar.Step; + } + return true; + default: + return false; + } + } + /// + /// Прорисовка объекта + /// + /// + public virtual void DrawTransport(Graphics g) + { + if (EntityCar == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) return; + Pen pen = new Pen(Color.Black); + + // Границы подметально-уборочной машины + Brush br = new SolidBrush(EntityCar.BodyColor); + // Платформа + g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 40, 100, 20); + g.FillRectangle(br, _startPosX.Value, _startPosY.Value + 40, 100, 20); + // Кабина + g.DrawRectangle(pen, _startPosX.Value + 80, _startPosY.Value, 20, 40); + g.FillRectangle(br, _startPosX.Value + 80, _startPosY.Value, 20, 40); + // Колёса + Brush brBlack = new SolidBrush(Color.Black); + g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value + 60, 20, 20); + g.DrawEllipse(pen, _startPosX.Value + 25, _startPosY.Value + 60, 20, 20); + g.DrawEllipse(pen, _startPosX.Value + 80, _startPosY.Value + 60, 20, 20); + g.FillEllipse(brBlack, _startPosX.Value, _startPosY.Value + 60, 20, 20); + g.FillEllipse(brBlack, _startPosX.Value + 25, _startPosY.Value + 60, 20, 20); + g.FillEllipse(brBlack, _startPosX.Value + 80, _startPosY.Value + 60, 20, 20); + // Окно + Brush brBlue = new SolidBrush(Color.LightBlue); + g.DrawRectangle(pen, _startPosX.Value + 85, _startPosY.Value + 5, 10, 15); + g.FillRectangle(brBlue, _startPosX.Value + 85, _startPosY.Value + 5, 10, 15); + } +} + diff --git a/ProjectCleaningCar/ProjectCleaningCar/Drawnings/DrawningCleaningCar.cs b/ProjectCleaningCar/ProjectCleaningCar/Drawnings/DrawningCleaningCar.cs new file mode 100644 index 0000000..483644e --- /dev/null +++ b/ProjectCleaningCar/ProjectCleaningCar/Drawnings/DrawningCleaningCar.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ProjectCleaningCar.Entites; + +namespace ProjectCleaningCar.Drawnings; +/// +/// Класс, отвечающий за прорисовку и перемещение объекта-сущности +/// +public class DrawningCleaningCar : DrawningCar +{ + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия бака под воду + /// Признак наличия + public DrawningCleaningCar(int speed, double weight, Color bodyColor, + Color additionalColor, bool waterTank, bool sweepingBrush) : base(150, 80) + { + EntityCar = new EntityCleaningCar(speed, weight, bodyColor, additionalColor, waterTank, sweepingBrush); + } + + public override void DrawTransport(Graphics g) + { + if (EntityCar == null || EntityCar is not EntityCleaningCar cleaningCar || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + + base.DrawTransport(g); + + Pen pen = new Pen(Color.Black); + Brush additionalBrush = new SolidBrush(cleaningCar.AdditionalColor); + //Бак под воду + if (cleaningCar.WaterTank) + { + g.FillEllipse(additionalBrush, _startPosX.Value, _startPosY.Value, 80, 40); + g.DrawEllipse(pen, _startPosX.Value, _startPosY.Value, 80, 40); + } + // Щётка + if (cleaningCar.SweepingBrush) + { + g.DrawRectangle(pen, _startPosX.Value + 100, _startPosY.Value + 50, 30, 5); + g.FillRectangle(additionalBrush, _startPosX.Value + 100, _startPosY.Value + 50, 30, 5); + Point[] sweepingBrush = + { + new Point(_startPosX.Value + 130, _startPosY.Value + 50), + new Point(_startPosX.Value + 150, _startPosY.Value + 80), + new Point(_startPosX.Value + 110, _startPosY.Value + 80), + }; + g.FillPolygon(additionalBrush, sweepingBrush); + g.DrawPolygon(pen, sweepingBrush); + } + } +} diff --git a/ProjectCleaningCar/ProjectCleaningCar/Entites/EntityCar.cs b/ProjectCleaningCar/ProjectCleaningCar/Entites/EntityCar.cs new file mode 100644 index 0000000..129e1cf --- /dev/null +++ b/ProjectCleaningCar/ProjectCleaningCar/Entites/EntityCar.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectCleaningCar.Entites; +/// +/// Класс-сущность "Машина" +/// +public class EntityCar +{ + /// + /// Скорость + /// + public int Speed { get; set; } + /// + /// Вес + /// + public double Weight { get; set; } + /// + /// Основной цвет + /// + public Color BodyColor { get; private set; } + /// + /// Шаг перемещения подметательно-уборочной машины + /// + public double Step => Speed * 100 / Weight; + /// + /// Конструктор сущности + /// + /// Скорость + /// Вес автомобиля + /// Основной цвет + public EntityCar(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + } + +} + diff --git a/ProjectCleaningCar/ProjectCleaningCar/EntityCleaningCar.cs b/ProjectCleaningCar/ProjectCleaningCar/Entites/EntityCleaningCar.cs similarity index 58% rename from ProjectCleaningCar/ProjectCleaningCar/EntityCleaningCar.cs rename to ProjectCleaningCar/ProjectCleaningCar/Entites/EntityCleaningCar.cs index 1fd918b..cf1fe23 100644 --- a/ProjectCleaningCar/ProjectCleaningCar/EntityCleaningCar.cs +++ b/ProjectCleaningCar/ProjectCleaningCar/Entites/EntityCleaningCar.cs @@ -4,55 +4,36 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace ProjectCleaningCar; +namespace ProjectCleaningCar.Entites; /// /// Класс-сущность "Подметально-уборочная машина" /// -public class EntityCleaningCar +public class EntityCleaningCar : EntityCar { - /// - /// Скорость - /// - public int Speed { get; set; } - /// - /// Вес - /// - public double Weight { get; set; } - /// - /// Основной цвет - /// - public Color BodyColor { get; private set; } /// /// Дополнительный цвет (для опциональных элементов) /// public Color AdditionalColor { get; private set; } + /// /// Признак (опция) наличия бака под воду /// public bool WaterTank { get; private set; } + /// /// Признак (опция) наличия подметательной щётки /// public bool SweepingBrush { get; private set; } - /// - /// Шаг перемещения подметательно-уборочной машины - /// - public double Step => Speed * 200 / Weight; + /// /// Инициализация полей объекта-класса подметально-уборочной машины /// - /// Скорость - /// Вес автомобиля - /// Основной цвет /// Дополнительный цвет /// Признак наличия бака под воду /// Признак наличия подметательной щётки - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, - bool waterTank, bool sweepingBrush) + public EntityCleaningCar(int speed, double weight, Color bodyColor, + Color additionalColor, bool waterTank, bool sweepingBrush) : base(speed, weight, bodyColor) { - Speed = speed; - Weight = weight; - BodyColor = bodyColor; AdditionalColor = additionalColor; WaterTank = waterTank; SweepingBrush = sweepingBrush; diff --git a/ProjectCleaningCar/ProjectCleaningCar/FormCleaningCar.Designer.cs b/ProjectCleaningCar/ProjectCleaningCar/FormCleaningCar.Designer.cs index a6292c9..36aedca 100644 --- a/ProjectCleaningCar/ProjectCleaningCar/FormCleaningCar.Designer.cs +++ b/ProjectCleaningCar/ProjectCleaningCar/FormCleaningCar.Designer.cs @@ -29,11 +29,14 @@ private void InitializeComponent() { pictureBoxCleaningCar = new PictureBox(); - buttonCreate = new Button(); + buttonCreateCleaningCar = new Button(); ButtonUp = new Button(); ButtonRight = new Button(); ButtonLeft = new Button(); ButtonDown = new Button(); + buttonCreateCar = new Button(); + comboBoxStrategy = new ComboBox(); + buttonStrategyStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxCleaningCar).BeginInit(); SuspendLayout(); // @@ -47,18 +50,18 @@ pictureBoxCleaningCar.TabIndex = 1; pictureBoxCleaningCar.TabStop = false; pictureBoxCleaningCar.Click += buttonMove_Click; - pictureBoxCleaningCar.Resize += new System.EventHandler(this.PictureBox_Resize); + pictureBoxCleaningCar.Resize += PictureBox_Resize; // - // buttonCreate + // buttonCreateCleaningCar // - buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - buttonCreate.Location = new Point(23, 382); - buttonCreate.Name = "buttonCreate"; - buttonCreate.Size = new Size(124, 42); - buttonCreate.TabIndex = 2; - buttonCreate.Text = "Создать"; - buttonCreate.UseVisualStyleBackColor = true; - buttonCreate.Click += ButtonCreateCleaningCar; + buttonCreateCleaningCar.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateCleaningCar.Location = new Point(22, 409); + buttonCreateCleaningCar.Name = "buttonCreateCleaningCar"; + buttonCreateCleaningCar.Size = new Size(198, 30); + buttonCreateCleaningCar.TabIndex = 2; + buttonCreateCleaningCar.Text = "Создать уборочную машину"; + buttonCreateCleaningCar.UseVisualStyleBackColor = true; + buttonCreateCleaningCar.Click += buttonCreateCleaningCar_Click; // // ButtonUp // @@ -108,16 +111,50 @@ ButtonDown.UseVisualStyleBackColor = true; ButtonDown.Click += buttonMove_Click; // + // buttonCreateCar + // + buttonCreateCar.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateCar.Location = new Point(238, 409); + buttonCreateCar.Name = "buttonCreateCar"; + buttonCreateCar.Size = new Size(198, 30); + buttonCreateCar.TabIndex = 7; + buttonCreateCar.Text = "Создать машину"; + buttonCreateCar.UseVisualStyleBackColor = true; + buttonCreateCar.Click += buttonCreateCar_Click; + // + // comboBoxStrategy + // + comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Items.AddRange(new object[] { "К центру ", "К краю" }); + comboBoxStrategy.Location = new Point(761, 12); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(121, 23); + comboBoxStrategy.TabIndex = 8; + // + // buttonStrategyStep + // + buttonStrategyStep.Location = new Point(797, 41); + buttonStrategyStep.Name = "buttonStrategyStep"; + buttonStrategyStep.Size = new Size(75, 23); + buttonStrategyStep.TabIndex = 9; + buttonStrategyStep.Text = "Шаг"; + buttonStrategyStep.UseVisualStyleBackColor = true; + buttonStrategyStep.Click += buttonStrategyStep_Click; + // // FormCleaningCar // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(884, 461); + Controls.Add(buttonStrategyStep); + Controls.Add(comboBoxStrategy); + Controls.Add(buttonCreateCar); Controls.Add(ButtonDown); Controls.Add(ButtonLeft); Controls.Add(ButtonRight); Controls.Add(ButtonUp); - Controls.Add(buttonCreate); + Controls.Add(buttonCreateCleaningCar); Controls.Add(pictureBoxCleaningCar); Name = "FormCleaningCar"; StartPosition = FormStartPosition.CenterScreen; @@ -130,10 +167,13 @@ #endregion private PictureBox pictureBoxCleaningCar; - private Button buttonCreate; + private Button buttonCreateCleaningCar; private Button ButtonUp; private Button ButtonRight; private Button ButtonLeft; private Button ButtonDown; + private Button buttonCreateCar; + private ComboBox comboBoxStrategy; + private Button buttonStrategyStep; } } \ No newline at end of file diff --git a/ProjectCleaningCar/ProjectCleaningCar/FormCleaningCar.cs b/ProjectCleaningCar/ProjectCleaningCar/FormCleaningCar.cs index 2e55cc9..c389bac 100644 --- a/ProjectCleaningCar/ProjectCleaningCar/FormCleaningCar.cs +++ b/ProjectCleaningCar/ProjectCleaningCar/FormCleaningCar.cs @@ -1,4 +1,6 @@ -using System; +using ProjectCleaningCar.Drawnings; +using ProjectCleaningCar.MovementStrategy; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; @@ -18,17 +20,24 @@ namespace ProjectCleaningCar /// /// Поле-объект для прорисовки объекта /// - private DrawningCleaningCar? _drawningCleaningCar; + private DrawningCar? _drawningCar; + + /// + /// Стратегия перемещения + /// + private AbstractStrategy? _strategy; + /// /// Конструктор формы /// public FormCleaningCar() { InitializeComponent(); + _strategy = null; } private void Draw() { - if (_drawningCleaningCar == null) + if (_drawningCar == null) { return; } @@ -38,27 +47,53 @@ namespace ProjectCleaningCar } Bitmap bmp = new(pictureBoxCleaningCar.Width, pictureBoxCleaningCar.Height); Graphics gr = Graphics.FromImage(bmp); - _drawningCleaningCar.DrawTransport(gr); + _drawningCar.DrawTransport(gr); pictureBoxCleaningCar.Image = bmp; } + /// - /// Обработка нажатия кнопки "Создать" + /// Создание объекта класса-перемещения + /// + /// Тип создаваемоего объекта + private void CreateObject(string type) + { + Random random = new(); + switch (type) + { + case nameof(DrawningCar): + _drawningCar = new DrawningCar(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(DrawningCleaningCar): + _drawningCar = new DrawningCleaningCar(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; + } + _drawningCar.SetPictureSize(pictureBoxCleaningCar.Width, pictureBoxCleaningCar.Height); + _drawningCar.SetPosition(random.Next(10, 100), random.Next(10, 100)); + _strategy = null; + comboBoxStrategy.Enabled = true; + Draw(); + } + + /// + /// Обработка нажатия кнопки "Создать подметально-уборочную машину" /// /// /// - private void ButtonCreateCleaningCar(object sender, EventArgs e) - { - Random random = new(); - _drawningCleaningCar = new DrawningCleaningCar(); - _drawningCleaningCar.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))); - _drawningCleaningCar.SetPictureSize(pictureBoxCleaningCar.Width, pictureBoxCleaningCar.Height); - _drawningCleaningCar.SetPosition(random.Next(10, 100), random.Next(10, 100)); - Draw(); - } + private void buttonCreateCleaningCar_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningCleaningCar)); + + /// + /// Обработка нажатия кнопки "Создать машину" + /// + /// + /// + private void buttonCreateCar_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningCar)); + /// /// Перемещение объекта по форме (нажатие кнопок навигации) /// @@ -66,26 +101,26 @@ namespace ProjectCleaningCar /// private void buttonMove_Click(object sender, EventArgs e) { - if (_drawningCleaningCar == null) + if (_drawningCar == null) { return; } - if (pictureBoxCleaningCar.Width == 0 || pictureBoxCleaningCar.Height == 0) return; - string name = ((Button)sender)?.Name ?? string.Empty; + + string name = (sender as Control)?.Name ?? string.Empty; bool result = false; switch (name) { case "ButtonUp": - result = _drawningCleaningCar.MoveTransport(DirectionType.Up); + result = _drawningCar.MoveTransport(DirectionType.Up); break; case "ButtonDown": - result = _drawningCleaningCar.MoveTransport(DirectionType.Down); + result = _drawningCar.MoveTransport(DirectionType.Down); break; case "ButtonLeft": - result = _drawningCleaningCar.MoveTransport(DirectionType.Left); + result = _drawningCar.MoveTransport(DirectionType.Left); break; case "ButtonRight": - result = _drawningCleaningCar.MoveTransport(DirectionType.Right); + result = _drawningCar.MoveTransport(DirectionType.Right); break; } if (result) @@ -93,10 +128,51 @@ namespace ProjectCleaningCar Draw(); } } + private void PictureBox_Resize(object sender, EventArgs e) { - _drawningCleaningCar?.SetPictureSize(pictureBoxCleaningCar.Width, pictureBoxCleaningCar.Height); + _drawningCar?.SetPictureSize(pictureBoxCleaningCar.Width, pictureBoxCleaningCar.Height); Draw(); } + /// + /// + /// + /// + /// + private void buttonStrategyStep_Click(object sender, EventArgs e) + { + if (_drawningCar == null) + { + return; + } + if (comboBoxStrategy.Enabled) + { + _strategy = comboBoxStrategy.SelectedIndex switch + { + 0 => new MoveToCenter(), + 1 => new MoveToBorder(), + _ => null, + }; + if (_strategy == null) + { + return; + } + _strategy.SetData(new MoveableCar(_drawningCar), + pictureBoxCleaningCar.Width, pictureBoxCleaningCar.Height); + } + if (_strategy == null) + { + return; + } + comboBoxStrategy.Enabled = false; + _strategy.MakeStep(); + Draw(); + if (_strategy.GetStatus() == StrategyStatus.Finish) + { + comboBoxStrategy.Enabled = true; + _strategy = null; + } + + } } } diff --git a/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/AbstractStrategy.cs b/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/AbstractStrategy.cs new file mode 100644 index 0000000..ca73f90 --- /dev/null +++ b/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/AbstractStrategy.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectCleaningCar.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/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/IMoveableObject.cs b/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/IMoveableObject.cs new file mode 100644 index 0000000..d2d7842 --- /dev/null +++ b/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/IMoveableObject.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectCleaningCar.MovementStrategy; +/// +/// Интерфейс для работы с перемещаемым объектом +/// +public interface IMoveableObject +{ + /// + /// Получение координаты объекта + /// + ObjectParameters? GetObjectPosition { get; } + /// + /// Шаг объекта + /// + int GetStep { get; } + /// + /// Попытка переместить объект в указанном направлении + /// + /// Направление + /// true - объект перемещен, false - перемещение невозможно + bool TryMoveObject(MovementDirection direction); +} diff --git a/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/MoveToBorder.cs b/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/MoveToBorder.cs new file mode 100644 index 0000000..f8efd95 --- /dev/null +++ b/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/MoveToBorder.cs @@ -0,0 +1,34 @@ +namespace ProjectCleaningCar.MovementStrategy; + +public 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()) + { + if (diffX > 0) MoveLeft(); + else MoveRight(); + } + int diffY = objParams.DownBorder - FieldHeight; + if (Math.Abs(diffY) > GetStep()) + { + if (diffY > 0) MoveUp(); + else MoveDown(); + } + } +} diff --git a/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/MoveToCenter.cs b/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/MoveToCenter.cs new file mode 100644 index 0000000..8373098 --- /dev/null +++ b/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/MoveToCenter.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectCleaningCar.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/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/MoveableCar.cs b/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/MoveableCar.cs new file mode 100644 index 0000000..0638d67 --- /dev/null +++ b/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/MoveableCar.cs @@ -0,0 +1,64 @@ +using ProjectCleaningCar.Drawnings; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectCleaningCar.MovementStrategy; +/// +/// Класс-реализация IMoveableObject с использованием DrawningCar +/// +public class MoveableCar : IMoveableObject +{ + /// + /// Поле-объект класса DrawningCar или его наследника + /// + private readonly DrawningCar? _car = null; + /// + /// Конструктор + /// + /// Объект класса DrawningCar + public MoveableCar(DrawningCar car) + { + _car = car; + } + public ObjectParameters? GetObjectPosition + { + get + { + if (_car == null || _car.EntityCar == null || + !_car.GetPosX.HasValue || !_car.GetPosY.HasValue) + { + return null; + } + return new ObjectParameters(_car.GetPosX.Value, + _car.GetPosY.Value, _car.GetWidth, _car.GetHeight); + } + } + public int GetStep => (int)(_car?.EntityCar?.Step ?? 0); + public bool TryMoveObject(MovementDirection direction) + { + if (_car == null || _car.EntityCar == null) + { + return false; + } + return _car.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/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/MovementDirection.cs b/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/MovementDirection.cs new file mode 100644 index 0000000..a5cf31b --- /dev/null +++ b/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/MovementDirection.cs @@ -0,0 +1,26 @@ +namespace ProjectCleaningCar.MovementStrategy; +/// +/// Направление перемещения +/// +public enum MovementDirection +{ + /// + /// Вверх + /// + Up = 1, + + /// + /// Вниз + /// + Down = 2, + + /// + /// Влево + /// + Left = 3, + + /// + /// Вправо + /// + Right = 4, +} diff --git a/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/ObjectParameters.cs b/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/ObjectParameters.cs new file mode 100644 index 0000000..91557f7 --- /dev/null +++ b/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/ObjectParameters.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectCleaningCar.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/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/StrategyStatus.cs b/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/StrategyStatus.cs new file mode 100644 index 0000000..04d4dd2 --- /dev/null +++ b/ProjectCleaningCar/ProjectCleaningCar/MovementStrategy/StrategyStatus.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectCleaningCar.MovementStrategy; +/// +/// Статус выполнения операции перемещения +/// +public enum StrategyStatus +{ + /// + /// Все готово к началу + /// + NotInit, + + /// + /// Выполняется + /// + InProgress, + + /// + /// Завершено + /// + Finish +} -- 2.25.1