добавлены описания + изменены размеры объектов

This commit is contained in:
tyxz0 2024-03-18 12:42:44 +04:00
parent f10745536b
commit 7a98888c0e
13 changed files with 254 additions and 32 deletions

View File

@ -1,8 +1,14 @@
namespace DoubleDeckerBus.Drawnings; namespace DoubleDeckerBus.Drawnings;
/// <summary>
/// Направление перемещения
/// </summary>
public enum DirectionType public enum DirectionType
{ {
/// <summary>
/// Неизвестное направление
/// </summary>
Unknown = -1, Unknown = -1,
/// <summary> /// <summary>
/// вверх /// вверх
/// </summary> /// </summary>

View File

@ -7,30 +7,69 @@ using System.Threading.Tasks;
namespace DoubleDeckerBus.Drawnings; namespace DoubleDeckerBus.Drawnings;
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение базового объекта-сущности
/// </summary>
public class DrawingBus public class DrawingBus
{ {
/// <summary>
/// Класс-сущность
/// </summary>
public EntityBus? EntityBus { get; protected set; } public EntityBus? EntityBus { get; protected set; }
/// <summary>
/// Ширина окна
/// </summary>
private int? _pictureWidth; private int? _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int? _pictureHeight; private int? _pictureHeight;
/// <summary>
/// Левая координата прорисовки автобуса
/// </summary>
protected int? _startPosX; protected int? _startPosX;
/// <summary>
/// Верхняя кооридната прорисовки автобуса
/// </summary>
protected int? _startPosY; protected int? _startPosY;
private readonly int _drawingBusWidth = 105; /// <summary>
/// Ширина прорисовки автобуса
/// </summary>
private readonly int _drawingBusWidth = 100;
private readonly int _drawingBusHeight = 50; /// <summary>
/// Высота прорисовки автобуса
/// </summary>
private readonly int _drawingBusHeight = 40;
/// <summary>
/// Координата X объекта
/// </summary>
public int? GetPosX => _startPosX; public int? GetPosX => _startPosX;
/// <summary>
/// Координата Y объекта
/// </summary>
public int? GetPosY => _startPosY; public int? GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth => _drawingBusWidth; public int GetWidth => _drawingBusWidth;
/// <summary>
/// Высота объекта
/// </summary>
public int GetHeight => _drawingBusHeight; public int GetHeight => _drawingBusHeight;
/// <summary>
/// Пустой конструктор
/// </summary>
private DrawingBus() private DrawingBus()
{ {
_pictureWidth = null; _pictureWidth = null;
@ -39,32 +78,44 @@ public class DrawingBus
_startPosY = null; _startPosY = null;
} }
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
public DrawingBus(int speed, int weight, Color bodyColor) : this() public DrawingBus(int speed, int weight, Color bodyColor) : this()
{ {
EntityBus = new EntityBus(speed, weight, bodyColor); EntityBus = new EntityBus(speed, weight, bodyColor);
} }
/// <summary>
/// Конструктор для наследников
/// </summary>
/// <param name="drawingBusWidth">Ширина прорисовки автобуса</param>
/// <param name="drawingBusHeight">Высота прорисовки автобуса</param>
protected DrawingBus(int drawingBusWidth, int drawingBusHeight) : this() protected DrawingBus(int drawingBusWidth, int drawingBusHeight) : this()
{ {
_drawingBusWidth = drawingBusWidth; _drawingBusWidth = drawingBusWidth;
_drawingBusHeight = drawingBusHeight; _drawingBusHeight = drawingBusHeight;
} }
/// <summary> /// <summary>
/// размер окна /// Установка границ поля
/// </summary> /// </summary>
/// <param name="width"></param> /// <param name="width">Ширина поля</param>
/// <param name="hight"></param> /// <param name="height">Высота поля</param>
/// <returns></returns> /// <returns>true - границы заданы, false - проверка не пройдена, нельзя разместить объект в этих размерах</returns>
public bool SetPictureSize(int width, int hight) public bool SetPictureSize(int width, int height)
{ {
if (_drawingBusWidth > width || _drawingBusHeight > hight) if (_drawingBusWidth > width || _drawingBusHeight > height)
{ {
return false; return false;
} }
_pictureWidth = width; _pictureWidth = width;
_pictureHeight = hight; _pictureHeight = height;
if (_startPosX.HasValue && _startPosX.Value + _drawingBusWidth > _pictureWidth) if (_startPosX.HasValue && _startPosX.Value + _drawingBusWidth > _pictureWidth)
{ {
@ -80,10 +131,10 @@ public class DrawingBus
} }
/// <summary> /// <summary>
/// установить начальную позицию /// Установка позиции
/// </summary> /// </summary>
/// <param name="x"></param> /// <param name="x">Координата X</param>
/// <param name="y"></param> /// <param name="y">Координа Y</param>
public void SetPosition(int x, int y) public void SetPosition(int x, int y)
{ {
if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) if (!_pictureHeight.HasValue || !_pictureWidth.HasValue)
@ -119,6 +170,11 @@ public class DrawingBus
} }
} }
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - перемещене выполнено, false - перемещение невозможно</returns>
public bool MoveTransport(DirectionType direction) public bool MoveTransport(DirectionType direction)
{ {
if (EntityBus == null || !_startPosX.HasValue || !_startPosY.HasValue) if (EntityBus == null || !_startPosX.HasValue || !_startPosY.HasValue)
@ -159,6 +215,10 @@ public class DrawingBus
} }
} }
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public virtual void DrawTrasnport(Graphics g) public virtual void DrawTrasnport(Graphics g)
{ {
if (EntityBus == null || !_startPosX.HasValue || !_startPosY.HasValue) if (EntityBus == null || !_startPosX.HasValue || !_startPosY.HasValue)

View File

@ -2,10 +2,19 @@
namespace DoubleDeckerBus.Drawnings; namespace DoubleDeckerBus.Drawnings;
/// <summary> /// <summary>
/// /// Класс, отвечающий за прорисовку и перемещение продвинутого объекта сущности
/// </summary> /// </summary>
public class DrawingDoubleDeckerBus : DrawingBus public class DrawingDoubleDeckerBus : DrawingBus
{ {
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Доп цвет</param>
/// <param name="secondFloor">Признак наличия второго этажа</param>
/// <param name="stripes">Признак наличия полос на кузове</param>
public DrawingDoubleDeckerBus(int speed, double weight, Color bodyColor, Color additionalColor, bool secondFloor, bool stripes) : base (115,55) 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); EntityBus = new EntityDoubleDeckerBus(speed, weight, bodyColor, additionalColor, secondFloor, stripes);

View File

@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace DoubleDeckerBus.Entities; namespace DoubleDeckerBus.Entities;
/// <summary> /// <summary>
/// Класс сущность автобус /// Класс сущность "Автобус"
/// </summary> /// </summary>
public class EntityBus public class EntityBus
{ {
@ -14,24 +14,28 @@ public class EntityBus
/// Скорость /// Скорость
/// </summary> /// </summary>
public int Speed { get; private set; } public int Speed { get; private set; }
/// <summary> /// <summary>
/// Вес /// Вес
/// </summary> /// </summary>
public double Weight { get; private set; } public double Weight { get; private set; }
/// <summary> /// <summary>
/// Основной цвет /// Основной цвет
/// </summary> /// </summary>
public Color BodyColor { get; private set; } public Color BodyColor { get; private set; }
/// <summary> /// <summary>
/// Расстояние перемещения за раз /// Расстояние перемещения за раз
/// </summary> /// </summary>
public double Step => Speed * 100 / Weight; public double Step => Speed * 100 / Weight;
/// <summary> /// <summary>
/// Конструктор базовой сущности /// Конструктор базовой сущности
/// </summary> /// </summary>
/// <param name="speed"></param> /// <param name="speed">Скорость</param>
/// <param name="weight"></param> /// <param name="weight">Вес автобуса</param>
/// <param name="bodyColor"></param> /// <param name="bodyColor">Основной цвет</param>
public EntityBus(int speed, double weight, Color bodyColor) public EntityBus(int speed, double weight, Color bodyColor)
{ {
Speed = speed; Speed = speed;

View File

@ -5,23 +5,26 @@ public class EntityDoubleDeckerBus : EntityBus
/// Дополнительный цвет /// Дополнительный цвет
/// </summary> /// </summary>
public Color AdditionalColor { get; private set; } public Color AdditionalColor { get; private set; }
/// <summary> /// <summary>
/// Признак (опция) наличия второго этажа /// Признак (опция) наличия второго этажа
/// </summary> /// </summary>
public bool SecondFloor { get; private set; } public bool SecondFloor { get; private set; }
/// <summary> /// <summary>
/// Признак (опция) наличия полосок на автобусе /// Признак (опция) наличия полосок на автобусе
/// </summary> /// </summary>
public bool Stripes { get; private set; } public bool Stripes { get; private set; }
/// <summary> /// <summary>
/// Конструктор наследуемого класса /// Конструктор продвинутой сущности
/// </summary> /// </summary>
/// <param name="speed"></param> /// <param name="speed">Скорость</param>
/// <param name="weight"></param> /// <param name="weight">Вес</param>
/// <param name="bodyColor"></param> /// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor"></param> /// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="stripes"></param> /// <param name="secondFloor">Признак наличия второго этажа</param>
/// <param name="stripes">Призна наличия полос на кузове</param>
public EntityDoubleDeckerBus(int speed, double weight, Color bodyColor, Color additionalColor, bool secondFloor, bool stripes) : base(speed, weight, bodyColor) public EntityDoubleDeckerBus(int speed, double weight, Color bodyColor, Color additionalColor, bool secondFloor, bool stripes) : base(speed, weight, bodyColor)
{ {
AdditionalColor = additionalColor; AdditionalColor = additionalColor;

View File

@ -6,18 +6,42 @@ using System.Threading.Tasks;
namespace DoubleDeckerBus.MovementStrategy; namespace DoubleDeckerBus.MovementStrategy;
/// <summary>
/// Класс-стратегия перемещения объекта
/// </summary>
public abstract class AbstractStrategy public abstract class AbstractStrategy
{ {
/// <summary>
/// Перемещаемый объект
/// </summary>
private IMoveableObject? _moveableObject; private IMoveableObject? _moveableObject;
/// <summary>
/// Статус перемещения
/// </summary>
private StrategyStatus _state = StrategyStatus.NotInit; private StrategyStatus _state = StrategyStatus.NotInit;
/// <summary>
/// Ширина поля
/// </summary>
protected int FieldWidth { get; private set; } protected int FieldWidth { get; private set; }
/// <summary>
/// Высота поля
/// </summary>
protected int FieldHeight { get; private set; } protected int FieldHeight { get; private set; }
/// <summary>
/// Статус перемещения
/// </summary>
public StrategyStatus GetStatus() { return _state; } public StrategyStatus GetStatus() { return _state; }
/// <summary>
/// Установка данных
/// </summary>
/// <param name="movableObject">Перемещаемый объект</param>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
public void SetData(IMoveableObject movableObject, int width, int height) public void SetData(IMoveableObject movableObject, int width, int height)
{ {
if (movableObject == null) if (movableObject == null)
@ -31,7 +55,10 @@ public abstract class AbstractStrategy
FieldWidth = width; FieldWidth = width;
FieldHeight = height; FieldHeight = height;
} }
/// <summary>
/// Шаг перемещения
/// </summary>
public void MakeStep() public void MakeStep()
{ {
if (_state != StrategyStatus.InProgress) if (_state != StrategyStatus.InProgress)
@ -48,16 +75,39 @@ public abstract class AbstractStrategy
MoveToTarget(); MoveToTarget();
} }
/// <summary>
/// Перемещение влево
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveLeft() => MoveTo(MovementDirection.Left); protected bool MoveLeft() => MoveTo(MovementDirection.Left);
/// <summary>
/// Перемещение вправо
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveRight() => MoveTo(MovementDirection.Right); protected bool MoveRight() => MoveTo(MovementDirection.Right);
/// <summary>
/// Перемещение вверх
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveUp() => MoveTo(MovementDirection.Up); protected bool MoveUp() => MoveTo(MovementDirection.Up);
/// <summary>
/// Перемещение вниз
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveDown() => MoveTo(MovementDirection.Down); protected bool MoveDown() => MoveTo(MovementDirection.Down);
/// <summary>
/// Параметры объекта
/// </summary>
protected ObjectParametrs? GetObjectParaments => _moveableObject?.GetObjectPosition; protected ObjectParametrs? GetObjectParaments => _moveableObject?.GetObjectPosition;
/// <summary>
/// Шаг объекта
/// </summary>
/// <returns></returns>
protected int? GetStep() protected int? GetStep()
{ {
if (_state != StrategyStatus.InProgress) if (_state != StrategyStatus.InProgress)
@ -68,10 +118,22 @@ public abstract class AbstractStrategy
return _moveableObject?.GetStep; return _moveableObject?.GetStep;
} }
/// <summary>
/// Перемещение к цели
/// </summary>
protected abstract void MoveToTarget(); protected abstract void MoveToTarget();
/// <summary>
/// Достигнута ли цель
/// </summary>
/// <returns></returns>
protected abstract bool IsTargetDestination(); protected abstract bool IsTargetDestination();
/// <summary>
/// Попытка перемещения в требуемом направлении
/// </summary>
/// <param name="movementDirection">Направление</param>
/// <returns>Результат попытки (true - удалось переместиться, false - неудача)</returns>
private bool MoveTo(MovementDirection movementDirection) private bool MoveTo(MovementDirection movementDirection)
{ {
if (_state != StrategyStatus.InProgress) if (_state != StrategyStatus.InProgress)
@ -81,4 +143,4 @@ public abstract class AbstractStrategy
return _moveableObject?.TryMoveObject(movementDirection) ?? false; return _moveableObject?.TryMoveObject(movementDirection) ?? false;
} }
} }

View File

@ -6,11 +6,25 @@ using System.Threading.Tasks;
namespace DoubleDeckerBus.MovementStrategy; namespace DoubleDeckerBus.MovementStrategy;
/// <summary>
/// Интерфейс для работы с перемещаемым объектом
/// </summary>
public interface IMoveableObject public interface IMoveableObject
{ {
/// <summary>
/// Получение координаты объекта
/// </summary>
ObjectParametrs? GetObjectPosition { get; } ObjectParametrs? GetObjectPosition { get; }
/// <summary>
/// Шаг объекта
/// </summary>
int GetStep { get; } int GetStep { get; }
/// <summary>
/// Попытка переместить объект в указанном направлении
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - объект перемещен, false - перемещение невозможно</returns>
bool TryMoveObject(MovementDirection direction); bool TryMoveObject(MovementDirection direction);
} }

View File

@ -6,6 +6,9 @@ using System.Threading.Tasks;
namespace DoubleDeckerBus.MovementStrategy; namespace DoubleDeckerBus.MovementStrategy;
/// <summary>
/// Стратегия перемещения объекта в центр экрана
/// </summary>
public class MoveToCenter : AbstractStrategy public class MoveToCenter : AbstractStrategy
{ {
protected override bool IsTargetDestination() protected override bool IsTargetDestination()

View File

@ -7,16 +7,25 @@ using System.Threading.Tasks;
namespace DoubleDeckerBus.MovementStrategy; namespace DoubleDeckerBus.MovementStrategy;
/// <summary>
/// Класс-реализация IMoveableObject с использованием DrawningBus
/// </summary>
public class MoveableBus : IMoveableObject public class MoveableBus : IMoveableObject
{ {
/// <summary>
/// Поле-объект класса DrawningBus или его наследника
/// </summary>
private DrawingBus? _bus = null; private DrawingBus? _bus = null;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="bus">Объект класса DrawningBus</param>
public MoveableBus(DrawingBus bus) public MoveableBus(DrawingBus bus)
{ {
_bus = bus; _bus = bus;
} }
public ObjectParametrs? GetObjectPosition public ObjectParametrs? GetObjectPosition
{ {
get get
@ -41,6 +50,11 @@ public class MoveableBus : IMoveableObject
return _bus.MoveTransport(GetDirectionType(direction)); return _bus.MoveTransport(GetDirectionType(direction));
} }
/// <summary>
/// Конвертация из MovementDirection в DirectionType
/// </summary>
/// <param name="direction">MovementDirection</param>
/// <returns>DirectionType</returns>
private static DirectionType GetDirectionType(MovementDirection direction) private static DirectionType GetDirectionType(MovementDirection direction)
{ {
return direction switch return direction switch

View File

@ -6,6 +6,9 @@ using System.Threading.Tasks;
namespace DoubleDeckerBus.MovementStrategy; namespace DoubleDeckerBus.MovementStrategy;
/// <summary>
/// Направление перемещения
/// </summary>
public enum MovementDirection public enum MovementDirection
{ {
/// <summary> /// <summary>

View File

@ -5,7 +5,9 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace DoubleDeckerBus.MovementStrategy; namespace DoubleDeckerBus.MovementStrategy;
/// <summary>
/// Стратегия перемещения объекта в правый нижний угол
/// </summary>
internal class MovetoBorder : AbstractStrategy internal class MovetoBorder : AbstractStrategy
{ {
protected override bool IsTargetDestination() protected override bool IsTargetDestination()
@ -15,7 +17,7 @@ internal class MovetoBorder : AbstractStrategy
{ {
return false; 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() protected override void MoveToTarget()

View File

@ -8,26 +8,63 @@ namespace DoubleDeckerBus.MovementStrategy;
public class ObjectParametrs public class ObjectParametrs
{ {
/// <summary>
/// Координата X
/// </summary>
private readonly int _x; private readonly int _x;
/// <summary>
/// Координата Y
/// </summary>
private readonly int _y; private readonly int _y;
/// <summary>
/// Ширина объекта
/// </summary>
private readonly int _width; private readonly int _width;
/// <summary>
/// Высота объекта
/// </summary>
private readonly int _height; private readonly int _height;
/// <summary>
/// Левая граница
/// </summary>
public int LeftBorder => _x; public int LeftBorder => _x;
/// <summary>
/// Верхняя граница
/// </summary>
public int TopBorder => _y; public int TopBorder => _y;
/// <summary>
/// Правая граница
/// </summary>
public int RightBorder => _x + _width; public int RightBorder => _x + _width;
/// <summary>
/// Нижняя граница
/// </summary>
public int DownBorder => _y + _height; public int DownBorder => _y + _height;
/// <summary>
/// Середина обхекта по горизонтали
/// </summary>
public int ObjectMiddleHorizontal => _x + _width / 2; public int ObjectMiddleHorizontal => _x + _width / 2;
/// <summary>
/// Середина объекта по вертикали
/// </summary>
public int ObjectMiddleVertical => _y + _height / 2; public int ObjectMiddleVertical => _y + _height / 2;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
/// <param name="width">Ширина объекта</param>
/// <param name="height">Высота объекта</param>
public ObjectParametrs(int x, int y, int width, int height) public ObjectParametrs(int x, int y, int width, int height)
{ {
_x = x; _x = x;

View File

@ -6,16 +6,21 @@ using System.Threading.Tasks;
namespace DoubleDeckerBus.MovementStrategy; namespace DoubleDeckerBus.MovementStrategy;
/// <summary>
/// Статус выполнения операции перемещения
/// </summary>
public enum StrategyStatus public enum StrategyStatus
{ {
/// <summary> /// <summary>
/// Все готово к началу /// Все готово к началу
/// </summary> /// </summary>
NotInit, NotInit,
/// <summary> /// <summary>
/// Выполняется /// Выполняется
/// </summary> /// </summary>
InProgress, InProgress,
/// <summary> /// <summary>
/// Завершено /// Завершено
/// </summary> /// </summary>