From 7a98888c0e66c4b1d8159845dca0e82f3f61fb65 Mon Sep 17 00:00:00 2001 From: tyxz0 Date: Mon, 18 Mar 2024 12:42:44 +0400 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20+=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D1=8B=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=80=D1=8B=20=D0=BE=D0=B1=D1=8A?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Drawnings/DirectionType.cs | 8 +- .../DoubleDeckerBus/Drawnings/DrawingBus.cs | 84 ++++++++++++++++--- .../Drawnings/DrawingDoubleDeckerBus.cs | 11 ++- .../DoubleDeckerBus/Entities/EntityBus.cs | 12 ++- .../Entities/EntityDoubleDeckerBus.cs | 15 ++-- .../MovementStrategy/AbstractStrategy.cs | 68 ++++++++++++++- .../MovementStrategy/IMoveableObject..cs | 14 ++++ .../MovementStrategy/MoveToCenter.cs | 3 + .../MovementStrategy/MoveableBus.cs | 18 +++- .../MovementStrategy/MovementDirection.cs | 3 + .../MovementStrategy/MovetoBorder.cs | 6 +- .../MovementStrategy/ObjectParametrs.cs | 39 ++++++++- .../MovementStrategy/StrategyStatus.cs | 5 ++ 13 files changed, 254 insertions(+), 32 deletions(-) diff --git a/DoubleDeckerBus/DoubleDeckerBus/Drawnings/DirectionType.cs b/DoubleDeckerBus/DoubleDeckerBus/Drawnings/DirectionType.cs index e569314..347c4b9 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/Drawnings/DirectionType.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/Drawnings/DirectionType.cs @@ -1,8 +1,14 @@ namespace DoubleDeckerBus.Drawnings; - +/// +/// Направление перемещения +/// public enum DirectionType { + /// + /// Неизвестное направление + /// Unknown = -1, + /// /// вверх /// diff --git a/DoubleDeckerBus/DoubleDeckerBus/Drawnings/DrawingBus.cs b/DoubleDeckerBus/DoubleDeckerBus/Drawnings/DrawingBus.cs index 1035a15..92599a0 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/Drawnings/DrawingBus.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/Drawnings/DrawingBus.cs @@ -7,30 +7,69 @@ using System.Threading.Tasks; namespace DoubleDeckerBus.Drawnings; +/// +/// Класс, отвечающий за прорисовку и перемещение базового объекта-сущности +/// public class DrawingBus { + /// + /// Класс-сущность + /// public EntityBus? EntityBus { get; protected set; } + /// + /// Ширина окна + /// private int? _pictureWidth; + /// + /// Высота окна + /// private int? _pictureHeight; + /// + /// Левая координата прорисовки автобуса + /// protected int? _startPosX; + /// + /// Верхняя кооридната прорисовки автобуса + /// protected int? _startPosY; - private readonly int _drawingBusWidth = 105; + /// + /// Ширина прорисовки автобуса + /// + private readonly int _drawingBusWidth = 100; - private readonly int _drawingBusHeight = 50; + /// + /// Высота прорисовки автобуса + /// + private readonly int _drawingBusHeight = 40; + /// + /// Координата X объекта + /// public int? GetPosX => _startPosX; + /// + /// Координата Y объекта + /// public int? GetPosY => _startPosY; + /// + /// Ширина объекта + /// public int GetWidth => _drawingBusWidth; + /// + /// Высота объекта + /// public int GetHeight => _drawingBusHeight; + /// + /// Пустой конструктор + /// private DrawingBus() { _pictureWidth = null; @@ -39,32 +78,44 @@ public class DrawingBus _startPosY = null; } + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет public DrawingBus(int speed, int weight, Color bodyColor) : this() { EntityBus = new EntityBus(speed, weight, bodyColor); } + /// + /// Конструктор для наследников + /// + /// Ширина прорисовки автобуса + /// Высота прорисовки автобуса protected DrawingBus(int drawingBusWidth, int drawingBusHeight) : this() { _drawingBusWidth = drawingBusWidth; _drawingBusHeight = drawingBusHeight; } + /// - /// размер окна + /// Установка границ поля /// - /// - /// - /// - public bool SetPictureSize(int width, int hight) + /// Ширина поля + /// Высота поля + /// true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах + public bool SetPictureSize(int width, int height) { - if (_drawingBusWidth > width || _drawingBusHeight > hight) + if (_drawingBusWidth > width || _drawingBusHeight > height) { return false; } _pictureWidth = width; - _pictureHeight = hight; + _pictureHeight = height; if (_startPosX.HasValue && _startPosX.Value + _drawingBusWidth > _pictureWidth) { @@ -80,10 +131,10 @@ public class DrawingBus } /// - /// установить начальную позицию + /// Установка позиции /// - /// - /// + /// Координата X + /// Координа Y public void SetPosition(int x, int y) { if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) @@ -119,6 +170,11 @@ public class DrawingBus } } + /// + /// Изменение направления перемещения + /// + /// Направление + /// true - перемещене выполнено, false - перемещение невозможно public bool MoveTransport(DirectionType direction) { if (EntityBus == null || !_startPosX.HasValue || !_startPosY.HasValue) @@ -159,6 +215,10 @@ public class DrawingBus } } + /// + /// Прорисовка объекта + /// + /// public virtual void DrawTrasnport(Graphics g) { if (EntityBus == null || !_startPosX.HasValue || !_startPosY.HasValue) diff --git a/DoubleDeckerBus/DoubleDeckerBus/Drawnings/DrawingDoubleDeckerBus.cs b/DoubleDeckerBus/DoubleDeckerBus/Drawnings/DrawingDoubleDeckerBus.cs index 6e24d22..f3f2f04 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/Drawnings/DrawingDoubleDeckerBus.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/Drawnings/DrawingDoubleDeckerBus.cs @@ -2,10 +2,19 @@ namespace DoubleDeckerBus.Drawnings; /// -/// +/// Класс, отвечающий за прорисовку и перемещение продвинутого объекта сущности /// public class DrawingDoubleDeckerBus : DrawingBus { + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Доп цвет + /// Признак наличия второго этажа + /// Признак наличия полос на кузове public DrawingDoubleDeckerBus(int speed, double weight, Color bodyColor, Color additionalColor, bool secondFloor, bool stripes) : base (115,55) { EntityBus = new EntityDoubleDeckerBus(speed, weight, bodyColor, additionalColor, secondFloor, stripes); diff --git a/DoubleDeckerBus/DoubleDeckerBus/Entities/EntityBus.cs b/DoubleDeckerBus/DoubleDeckerBus/Entities/EntityBus.cs index 3ab2f79..e1ae78c 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/Entities/EntityBus.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/Entities/EntityBus.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace DoubleDeckerBus.Entities; /// -/// Класс сущность автобус +/// Класс сущность "Автобус" /// public class EntityBus { @@ -14,24 +14,28 @@ public class EntityBus /// Скорость /// 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 EntityBus(int speed, double weight, Color bodyColor) { Speed = speed; diff --git a/DoubleDeckerBus/DoubleDeckerBus/Entities/EntityDoubleDeckerBus.cs b/DoubleDeckerBus/DoubleDeckerBus/Entities/EntityDoubleDeckerBus.cs index 5585664..d955e88 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/Entities/EntityDoubleDeckerBus.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/Entities/EntityDoubleDeckerBus.cs @@ -5,23 +5,26 @@ public class EntityDoubleDeckerBus : EntityBus /// Дополнительный цвет /// public Color AdditionalColor { get; private set; } + /// /// Признак (опция) наличия второго этажа /// public bool SecondFloor { get; private set; } + /// /// Признак (опция) наличия полосок на автобусе /// public bool Stripes { get; private set; } /// - /// Конструктор наследуемого класса + /// Конструктор продвинутой сущности /// - /// - /// - /// - /// - /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия второго этажа + /// Призна наличия полос на кузове public EntityDoubleDeckerBus(int speed, double weight, Color bodyColor, Color additionalColor, bool secondFloor, bool stripes) : base(speed, weight, bodyColor) { AdditionalColor = additionalColor; diff --git a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/AbstractStrategy.cs b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/AbstractStrategy.cs index 2fef05a..fd85537 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/AbstractStrategy.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/AbstractStrategy.cs @@ -6,18 +6,42 @@ using System.Threading.Tasks; namespace DoubleDeckerBus.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 movableObject, int width, int height) { if (movableObject == null) @@ -31,7 +55,10 @@ public abstract class AbstractStrategy FieldWidth = width; FieldHeight = height; } - + + /// + /// Шаг перемещения + /// public void MakeStep() { if (_state != StrategyStatus.InProgress) @@ -48,16 +75,39 @@ public abstract class AbstractStrategy 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 ObjectParametrs? GetObjectParaments => _moveableObject?.GetObjectPosition; + /// + /// Шаг объекта + /// + /// protected int? GetStep() { if (_state != StrategyStatus.InProgress) @@ -68,10 +118,22 @@ public abstract class AbstractStrategy return _moveableObject?.GetStep; } + /// + /// Перемещение к цели + /// protected abstract void MoveToTarget(); + /// + /// Достигнута ли цель + /// + /// protected abstract bool IsTargetDestination(); + /// + /// Попытка перемещения в требуемом направлении + /// + /// Направление + /// Результат попытки (true - удалось переместиться, false - неудача) private bool MoveTo(MovementDirection movementDirection) { if (_state != StrategyStatus.InProgress) @@ -81,4 +143,4 @@ public abstract class AbstractStrategy return _moveableObject?.TryMoveObject(movementDirection) ?? false; } -} +} \ No newline at end of file diff --git a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/IMoveableObject..cs b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/IMoveableObject..cs index 5805ce2..b27cf22 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/IMoveableObject..cs +++ b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/IMoveableObject..cs @@ -6,11 +6,25 @@ using System.Threading.Tasks; namespace DoubleDeckerBus.MovementStrategy; +/// +/// Интерфейс для работы с перемещаемым объектом +/// public interface IMoveableObject { + /// + /// Получение координаты объекта + /// ObjectParametrs? GetObjectPosition { get; } + /// + /// Шаг объекта + /// int GetStep { get; } + /// + /// Попытка переместить объект в указанном направлении + /// + /// Направление + /// true - объект перемещен, false - перемещение невозможно bool TryMoveObject(MovementDirection direction); } diff --git a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MoveToCenter.cs b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MoveToCenter.cs index 86cf34f..17f1a2d 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MoveToCenter.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MoveToCenter.cs @@ -6,6 +6,9 @@ using System.Threading.Tasks; namespace DoubleDeckerBus.MovementStrategy; +/// +/// Стратегия перемещения объекта в центр экрана +/// public class MoveToCenter : AbstractStrategy { protected override bool IsTargetDestination() diff --git a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MoveableBus.cs b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MoveableBus.cs index 36006fd..3dc16bb 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MoveableBus.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MoveableBus.cs @@ -7,16 +7,25 @@ using System.Threading.Tasks; namespace DoubleDeckerBus.MovementStrategy; - +/// +/// Класс-реализация IMoveableObject с использованием DrawningBus +/// public class MoveableBus : IMoveableObject { + /// + /// Поле-объект класса DrawningBus или его наследника + /// private DrawingBus? _bus = null; - + /// + /// Конструктор + /// + /// Объект класса DrawningBus public MoveableBus(DrawingBus bus) { _bus = bus; } + public ObjectParametrs? GetObjectPosition { get @@ -41,6 +50,11 @@ public class MoveableBus : IMoveableObject return _bus.MoveTransport(GetDirectionType(direction)); } + /// + /// Конвертация из MovementDirection в DirectionType + /// + /// MovementDirection + /// DirectionType private static DirectionType GetDirectionType(MovementDirection direction) { return direction switch diff --git a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MovementDirection.cs b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MovementDirection.cs index 1ce4c9c..898f4c5 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MovementDirection.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MovementDirection.cs @@ -6,6 +6,9 @@ using System.Threading.Tasks; namespace DoubleDeckerBus.MovementStrategy; +/// +/// Направление перемещения +/// public enum MovementDirection { /// diff --git a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MovetoBorder.cs b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MovetoBorder.cs index f2edf42..e1eb81d 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MovetoBorder.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/MovetoBorder.cs @@ -5,7 +5,9 @@ using System.Text; using System.Threading.Tasks; namespace DoubleDeckerBus.MovementStrategy; - +/// +/// Стратегия перемещения объекта в правый нижний угол +/// internal class MovetoBorder : AbstractStrategy { protected override bool IsTargetDestination() @@ -15,7 +17,7 @@ internal class MovetoBorder : AbstractStrategy { return false; } - return objParams.DownBorder + GetStep() > FieldHeight - 5 && objParams.RightBorder + GetStep() > FieldWidth - 5; + return objParams.DownBorder + GetStep() >= FieldHeight && objParams.RightBorder + GetStep() >= FieldWidth; } protected override void MoveToTarget() diff --git a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/ObjectParametrs.cs b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/ObjectParametrs.cs index 60610ba..0eb7c60 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/ObjectParametrs.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/ObjectParametrs.cs @@ -8,26 +8,63 @@ namespace DoubleDeckerBus.MovementStrategy; public class ObjectParametrs { + /// + /// Координата 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 ObjectParametrs(int x, int y, int width, int height) { _x = x; diff --git a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/StrategyStatus.cs b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/StrategyStatus.cs index 54d76ed..85556b7 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/StrategyStatus.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/MovementStrategy/StrategyStatus.cs @@ -6,16 +6,21 @@ using System.Threading.Tasks; namespace DoubleDeckerBus.MovementStrategy; +/// +/// Статус выполнения операции перемещения +/// public enum StrategyStatus { /// /// Все готово к началу /// NotInit, + /// /// Выполняется /// InProgress, + /// /// Завершено ///