Добавление стратегии

This commit is contained in:
egorvasin 2024-05-06 13:53:15 +03:00
parent 1250224e2b
commit c61b0831e7
17 changed files with 1072 additions and 311 deletions

View File

@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.9.34607.119
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectBuldozer", "ProjectBuldozer\ProjectBuldozer.csproj", "{2859AEDE-AD83-45D5-A736-F7594AFBFCD6}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProjectBuldozer", "ProjectBuldozer\ProjectBuldozer.csproj", "{2859AEDE-AD83-45D5-A736-F7594AFBFCD6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution

View File

@ -1,255 +0,0 @@
using ProjectBuldozer;
namespace ProjectBuldozer;
/// <summary>
/// Класс, отвечающий за прорисовку объекта-сущности
/// </summary>
public class DrawingBuldozer
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityBuldozer? EntityBuldozer { get; private set; }
/// <summary>
/// Ширина окна
/// </summary>
private int? _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int? _pictureHeight;
/// <summary>
/// Левая координата прорисовки бульдозера
/// </summary>
private int? _startPosX;
/// <summary>
/// Правая координата прорисовки больдозера
/// </summary>
private int? _startPosY;
/// <summary>
/// Ширина прорисовки бульдозера
/// </summary>
private readonly int _drawningBuldozerWidth = 138;
/// <summary>
/// Высота прорисовки бульдозера
/// </summary>
private readonly int _drawingBuldozerHeight = 99;
/// <summary>
/// Инициализация свойств
/// </summary>
/// <param name="speed"></param>
/// <param name="weight"></param>
/// <param name="bodyColor"></param>
/// <param name="additionalColor"></param>
/// <param name="otval"></param>
/// <param name="rihlitel"></param>
public void Init(int speed, double weight, Color bodyColor, Color
additionalColor, bool otval, bool rihlitel, bool v)
{
EntityBuldozer = new EntityBuldozer();
EntityBuldozer.Init(speed, weight, bodyColor, additionalColor, otval, rihlitel);
_pictureWidth = null;
_pictureWidth = null;
_startPosX = null;
_startPosY = null;
}
/// <summary>
/// Установка границ поля
/// </summary>
/// <param name="width"></param>
/// <param name="height"></param>
/// <returns></returns>
public bool SetPictureSize(int width, int height)
{
if (_pictureWidth > width || _pictureHeight > height)
{
return false;
}
_pictureWidth = width;
_pictureHeight = height;
if (_startPosX.HasValue || _startPosY.HasValue)
{
if (_startPosX + _drawningBuldozerWidth > _pictureWidth)
{
_startPosX = _pictureWidth.Value - _drawningBuldozerWidth;
}
else if (_startPosX < 0) _startPosX = 0;
if (_startPosY + _drawingBuldozerHeight > _pictureHeight)
{
_startPosY = _pictureHeight.Value - _drawingBuldozerHeight;
}
else if (_startPosY < 0) _startPosY = 0;
}
return true;
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public void SetPosition(int x, int y)
{
if (!_pictureHeight.HasValue || !_pictureWidth.HasValue)
{
return;
}
if (x >= 0 && x + _drawningBuldozerWidth <= _pictureWidth && y >= 0 && y + _drawingBuldozerHeight <= _pictureHeight)
{
_startPosX = x;
_startPosY = y;
}
if (x < 0)
{
_startPosX = 0;
}
if (y < 0)
{
_startPosY = 0;
}
if (x + _drawningBuldozerWidth > _pictureWidth)
{
_startPosX = _drawningBuldozerWidth - _pictureWidth;
}
if (y + _drawingBuldozerHeight > _pictureHeight)
{
_startPosY = _drawingBuldozerHeight - _pictureHeight;
}
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction"></param>
/// <returns></returns>
public bool MoveTransport(DirectionType direction)
{
if (EntityBuldozer == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return false;
}
switch (direction)
{
case DirectionType.Left:
if (_startPosX.Value - EntityBuldozer.Step > 0)
{
_startPosX -= (int)EntityBuldozer.Step;
}
return true;
case DirectionType.Up:
if (_startPosY.Value - EntityBuldozer.Step > 0)
{
_startPosY -= (int)EntityBuldozer.Step;
}
return true;
case DirectionType.Right:
if (_startPosX.Value + EntityBuldozer.Step + _drawningBuldozerWidth < _pictureWidth)
{
_startPosX += (int)EntityBuldozer.Step;
}
return true;
case DirectionType.Down:
if (_startPosY.Value + EntityBuldozer.Step + _drawingBuldozerHeight < _pictureHeight)
{
_startPosY += (int)EntityBuldozer.Step;
}
return true;
default:
return false;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public void DrawTransport(Graphics g)
{
if (EntityBuldozer == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new(Color.Black);
Brush br = new SolidBrush(EntityBuldozer.BodyColor);
Brush additionalBrush = new SolidBrush(EntityBuldozer.AdditionalColor);
//кабина
Brush brBlue = new SolidBrush(Color.LightBlue);
g.FillRectangle(brBlue, _startPosX.Value + 80, _startPosY.Value + 10, 20, 31);
g.DrawRectangle(pen, _startPosX.Value + 80, _startPosY.Value + 10, 20, 31);
//основное тело
g.FillRectangle(br, _startPosX.Value + 30, _startPosY.Value + 40, 80, 30);
g.DrawRectangle(pen, _startPosX.Value + 30, _startPosY.Value + 40, 80, 30);
//труба
g.FillRectangle(br, _startPosX.Value + 40, _startPosY.Value + 25, 10, 15);
g.DrawRectangle(pen, _startPosX.Value + 40, _startPosY.Value + 25, 10, 15);
//гусеница
Brush brWhite = new SolidBrush(Color.White);
Pen Pen = new(Color.Black, 3);
g.DrawRectangle(Pen, _startPosX.Value + 30, _startPosY.Value + 70, 79, 19);
g.FillEllipse(brWhite, _startPosX.Value + 30, _startPosY.Value + 70, 80, 20);
g.DrawEllipse(Pen, _startPosX.Value + 30, _startPosY.Value + 70, 20, 20);
g.FillEllipse(brWhite, _startPosX.Value + 30, _startPosY.Value + 70, 20, 20);
g.DrawEllipse(Pen, _startPosX.Value + 90, _startPosY.Value + 70, 20, 20);
g.FillEllipse(brWhite, _startPosX.Value + 90, _startPosY.Value + 70, 20, 20);
g.DrawEllipse(Pen, _startPosX.Value + 54, _startPosY.Value + 80, 9, 9);
g.FillEllipse(brWhite, _startPosX.Value + 54, _startPosY.Value + 80, 9, 9);
g.DrawEllipse(Pen, _startPosX.Value + 66, _startPosY.Value + 80, 9, 9);
g.FillEllipse(brWhite, _startPosX.Value + 66, _startPosY.Value + 80, 9, 9);
g.DrawEllipse(Pen, _startPosX.Value + 78, _startPosY.Value + 80, 9, 9);
g.FillEllipse(brWhite, _startPosX.Value + 78, _startPosY.Value + 80, 9, 9);
g.DrawEllipse(Pen, _startPosX.Value + 62, _startPosY.Value + 70, 6, 6);
g.FillEllipse(brWhite, _startPosX.Value + 62, _startPosY.Value + 70, 6, 6);
g.DrawEllipse(Pen, _startPosX.Value + 72, _startPosY.Value + 70, 6, 6);
g.FillEllipse(brWhite, _startPosX.Value + 72, _startPosY.Value + 70, 6, 6);
//отвал
if (EntityBuldozer.Otval)
{
g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 60, 10, 10);
g.DrawRectangle(pen, _startPosX.Value + 15, _startPosY.Value + 40, 5, 60);
g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 95, 17, 5);
g.FillRectangle(additionalBrush, _startPosX.Value + 20, _startPosY.Value + 60, 10, 10);
g.FillRectangle(additionalBrush, _startPosX.Value + 15, _startPosY.Value + 40, 5, 60);
g.FillRectangle(additionalBrush, _startPosX.Value, _startPosY.Value + 95, 17, 5);
}
//рыхлитель
if (EntityBuldozer.Rihlitel)
{
g.DrawRectangle(pen, _startPosX.Value + 130, _startPosY.Value + 40, 10, 40);
g.DrawRectangle(pen, _startPosX.Value + 110, _startPosY.Value + 50, 30, 10);
g.FillRectangle(additionalBrush, _startPosX.Value + 130, _startPosY.Value + 40, 10, 40);
g.FillRectangle(additionalBrush, _startPosX.Value + 110, _startPosY.Value + 50, 30, 10);
PointF rA = new PointF(_startPosX.Value + 130, _startPosY.Value + 80);
PointF rB = new PointF(_startPosX.Value + 140, _startPosY.Value + 80);
PointF rC = new PointF(_startPosX.Value + 130, _startPosY.Value + 100);
PointF[] Trigle = { rA, rB, rC };
g.DrawPolygon(pen, Trigle);
g.FillPolygon(additionalBrush, Trigle);
}
}
}

View File

@ -1,4 +1,4 @@
namespace ProjectBuldozer;
namespace ProjectBuldozer.Drawnings;
/// <summary>
/// Направление перемещения
@ -8,6 +8,9 @@ public enum DirectionType
/// <summary>
/// Вверх
/// </summary>
///
Unknow = -1,
Up = 1,
/// <summary>
@ -24,4 +27,5 @@ public enum DirectionType
/// Вправо
/// </summary>
Right = 4
}

View File

@ -0,0 +1,114 @@
using ProjectBuldozer.Entities;
namespace ProjectBuldozer.Drawnings;
/// <summary>
/// Класс, отвечающий за прорисовку объекта-сущности
/// </summary>
public class DrawingBuldozer : DrawingUsualBuldozer
{
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="bodyKit">Признак наличия обвеса</param>
/// <param name="otval">Признак наличия антикрыла</param>
/// <param name="rihlitel">Признак наличия гоночной полосы</param>
public DrawingBuldozer(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool otval, bool rihlitel) : base(137, 92)
{
EntityUsualBuldozer = new EntityBuldozer(speed, weight, bodyColor, additionalColor, bodyKit, otval, rihlitel);
}
public override void DrawTransport(Graphics g)
{
if (EntityUsualBuldozer == null || EntityUsualBuldozer is not EntityBuldozer buldozer || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new(Color.Black);
Brush br = new SolidBrush(EntityUsualBuldozer.BodyColor);
Brush brBlue = new SolidBrush(Color.LightBlue);
Brush brWhite = new SolidBrush(Color.White);
Brush additionalBrush = new SolidBrush(buldozer.AdditionalColor);
if (buldozer.BodyKit)
{
//кабина
g.FillRectangle(brBlue, _startPosX.Value + 80, _startPosY.Value + 5, 20, 31);
g.DrawRectangle(pen, _startPosX.Value + 80, _startPosY.Value + 5, 20, 31);
//основное тело
g.FillRectangle(br, _startPosX.Value + 30, _startPosY.Value + 35, 80, 30);
g.DrawRectangle(pen, _startPosX.Value + 30, _startPosY.Value + 35, 80, 30);
//труба
g.FillRectangle(br, _startPosX.Value + 40, _startPosY.Value + 20, 10, 15);
g.DrawRectangle(pen, _startPosX.Value + 40, _startPosY.Value + 20, 10, 15);
//гусеница
Pen Pen = new(Color.Black, 3);
g.DrawRectangle(Pen, _startPosX.Value + 30, _startPosY.Value + 65, 79, 19);
g.FillEllipse(brWhite, _startPosX.Value + 30, _startPosY.Value + 65, 80, 20);
g.DrawEllipse(Pen, _startPosX.Value + 30, _startPosY.Value + 65, 20, 20);
g.FillEllipse(brWhite, _startPosX.Value + 30, _startPosY.Value + 65, 20, 20);
g.DrawEllipse(Pen, _startPosX.Value + 90, _startPosY.Value + 65, 20, 20);
g.FillEllipse(brWhite, _startPosX.Value + 90, _startPosY.Value + 65, 20, 20);
g.DrawEllipse(Pen, _startPosX.Value + 54, _startPosY.Value + 75, 9, 9);
g.FillEllipse(brWhite, _startPosX.Value + 54, _startPosY.Value + 75, 9, 9);
g.DrawEllipse(Pen, _startPosX.Value + 66, _startPosY.Value + 75, 9, 9);
g.FillEllipse(brWhite, _startPosX.Value + 66, _startPosY.Value + 75, 9, 9);
g.DrawEllipse(Pen, _startPosX.Value + 78, _startPosY.Value + 75, 9, 9);
g.FillEllipse(brWhite, _startPosX.Value + 78, _startPosY.Value + 75, 9, 9);
g.DrawEllipse(Pen, _startPosX.Value + 62, _startPosY.Value + 65, 6, 6);
g.FillEllipse(brWhite, _startPosX.Value + 62, _startPosY.Value + 65, 6, 6);
g.DrawEllipse(Pen, _startPosX.Value + 72, _startPosY.Value + 65, 6, 6);
g.FillEllipse(brWhite, _startPosX.Value + 72, _startPosY.Value + 65, 6, 6);
}
_startPosX += 10;
_startPosY += 5;
base.DrawTransport(g);
_startPosX -= 10;
_startPosY -= 5;
//отвал
if (buldozer.Otval)
{
g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 60, 10, 10);
g.DrawRectangle(pen, _startPosX.Value + 15, _startPosY.Value + 40, 5, 60);
g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 95, 17, 5);
g.FillRectangle(additionalBrush, _startPosX.Value + 20, _startPosY.Value + 60, 10, 10);
g.FillRectangle(additionalBrush, _startPosX.Value + 15, _startPosY.Value + 40, 5, 60);
g.FillRectangle(additionalBrush, _startPosX.Value, _startPosY.Value + 95, 17, 5);
}
//рыхлитель
if (buldozer.Rihlitel)
{
g.DrawRectangle(pen, _startPosX.Value + 130, _startPosY.Value + 40, 10, 40);
g.DrawRectangle(pen, _startPosX.Value + 110, _startPosY.Value + 50, 30, 10);
g.FillRectangle(additionalBrush, _startPosX.Value + 130, _startPosY.Value + 40, 10, 40);
g.FillRectangle(additionalBrush, _startPosX.Value + 110, _startPosY.Value + 50, 30, 10);
PointF rA = new PointF(_startPosX.Value + 130, _startPosY.Value + 80);
PointF rB = new PointF(_startPosX.Value + 140, _startPosY.Value + 80);
PointF rC = new PointF(_startPosX.Value + 130, _startPosY.Value + 100);
PointF[] Trigle = { rA, rB, rC };
g.DrawPolygon(pen, Trigle);
g.FillPolygon(additionalBrush, Trigle);
}
}
}

View File

@ -0,0 +1,265 @@
using ProjectBuldozer.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectBuldozer.Drawnings;
public class DrawingUsualBuldozer
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityUsualBuldozer? EntityUsualBuldozer { get; protected set; }
/// <summary>
/// Ширина окна
/// </summary>
private int? _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int? _pictureHeight;
/// <summary>
/// Левая координата прорисовки бульдозера
/// </summary>
protected int? _startPosX;
/// <summary>
/// Правая координата прорисовки больдозера
/// </summary>
protected int? _startPosY;
/// <summary>
/// Ширина прорисовки бульдозера
/// </summary>
private readonly int _drawningUsualBuldozerWidth = 100;
/// <summary>
/// Высота прорисовки бульдозера
/// </summary>
private readonly int _drawingUsualBuldozerHeight = 80;
/// <summary>
/// Координата X объекта
/// </summary>
public int? GetPosX => _startPosX;
/// <summary>
/// Координата Y объекта
/// </summary>
public int? GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth => _drawningUsualBuldozerWidth;
/// <summary>
/// Высота объекта
/// </summary>
public int GetHeight => _drawingUsualBuldozerHeight;
//Пустой конструктор
private DrawingUsualBuldozer()
{
_pictureWidth = null;
_pictureWidth = null;
_startPosX = null;
_startPosY = null;
}
/// <summary>
/// Конструктрор
/// </summary>
/// <param name="speed"></param>
/// <param name="weight"></param>
/// <param name="bodyColor"></param>
public DrawingUsualBuldozer(int speed, double weight, Color bodyColor): this()
{
EntityUsualBuldozer = new EntityUsualBuldozer(speed, weight, bodyColor);
;
}
/// <summary>
/// Конструктрор для наследников
/// </summary>
/// <param name="drawningUsualBuldozerWidth">Ширина прорисовки бульдозера</param>
/// <param name="drawingUsualBuldozerHeight">Высота прорисовки бульдозера</param>
protected DrawingUsualBuldozer(int drawningUsualBuldozerWidth, int drawingUsualBuldozerHeight): this()
{
_drawningUsualBuldozerWidth = drawningUsualBuldozerWidth;
_drawingUsualBuldozerHeight = drawingUsualBuldozerHeight;
}
/// <summary>
/// Установка границ поля
/// </summary>
/// <param name="width"></param>
/// <param name="height"></param>
/// <returns></returns>
public bool SetPictureSize(int width, int height)
{
if (_pictureWidth > width || _pictureHeight > height)
{
return false;
}
_pictureWidth = width;
_pictureHeight = height;
if (_startPosX.HasValue || _startPosY.HasValue)
{
if (_startPosX + _drawningUsualBuldozerWidth > _pictureWidth)
{
_startPosX = _pictureWidth.Value - _drawningUsualBuldozerWidth;
}
else if (_startPosX < 0) _startPosX = 0;
if (_startPosY + _drawingUsualBuldozerHeight > _pictureHeight)
{
_startPosY = _pictureHeight.Value - _drawingUsualBuldozerHeight;
}
else if (_startPosY < 0) _startPosY = 0;
}
return true;
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public void SetPosition(int x, int y)
{
if (!_pictureHeight.HasValue || !_pictureWidth.HasValue)
{
return;
}
if (x >= 0 && x + _drawningUsualBuldozerWidth <= _pictureWidth && y >= 0 && y + _drawingUsualBuldozerHeight <= _pictureHeight)
{
_startPosX = x;
_startPosY = y;
}
if (x < 0)
{
_startPosX = 0;
}
if (y < 0)
{
_startPosY = 0;
}
if (x + _drawningUsualBuldozerWidth > _pictureWidth)
{
_startPosX = _drawningUsualBuldozerWidth - _pictureWidth;
}
if (y + _drawingUsualBuldozerHeight > _pictureHeight)
{
_startPosY = _drawingUsualBuldozerHeight - _pictureHeight;
}
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction"></param>
/// <returns></returns>
public bool MoveTransport(DirectionType direction)
{
if (EntityUsualBuldozer == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return false;
}
switch (direction)
{
case DirectionType.Left:
if (_startPosX.Value - EntityUsualBuldozer.Step > 0)
{
_startPosX -= (int)EntityUsualBuldozer.Step;
}
return true;
case DirectionType.Up:
if (_startPosY.Value - EntityUsualBuldozer.Step > 0)
{
_startPosY -= (int)EntityUsualBuldozer.Step;
}
return true;
case DirectionType.Right:
if (_startPosX.Value + EntityUsualBuldozer.Step + _drawningUsualBuldozerWidth < _pictureWidth)
{
_startPosX += (int)EntityUsualBuldozer.Step;
}
return true;
case DirectionType.Down:
if (_startPosY.Value + EntityUsualBuldozer.Step + _drawingUsualBuldozerHeight < _pictureHeight)
{
_startPosY += (int)EntityUsualBuldozer.Step;
}
return true;
default:
return false;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public virtual void DrawTransport(Graphics g)
{
if (EntityUsualBuldozer == null || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new(Color.Black);
Brush br = new SolidBrush(EntityUsualBuldozer.BodyColor);
//кабина
Brush brBlue = new SolidBrush(Color.LightBlue);
g.FillRectangle(brBlue, _startPosX.Value + 70, _startPosY.Value, 20, 31);
g.DrawRectangle(pen, _startPosX.Value + 70, _startPosY.Value, 20, 31);
//основное тело
g.FillRectangle(br, _startPosX.Value + 20, _startPosY.Value + 30, 80, 30);
g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 30, 80, 30);
//труба
g.FillRectangle(br, _startPosX.Value + 30, _startPosY.Value + 15, 10, 15);
g.DrawRectangle(pen, _startPosX.Value + 30, _startPosY.Value + 15, 10, 15);
//гусеница
Brush brWhite = new SolidBrush(Color.White);
Pen Pen = new(Color.Black, 3);
g.DrawRectangle(Pen, _startPosX.Value + 20, _startPosY.Value + 60, 79, 19);
g.FillEllipse(brWhite, _startPosX.Value + 20, _startPosY.Value + 60, 80, 20);
g.DrawEllipse(Pen, _startPosX.Value + 20, _startPosY.Value + 60, 20, 20);
g.FillEllipse(brWhite, _startPosX.Value + 20, _startPosY.Value + 60, 20, 20);
g.DrawEllipse(Pen, _startPosX.Value + 80, _startPosY.Value + 60, 20, 20);
g.FillEllipse(brWhite, _startPosX.Value + 80, _startPosY.Value + 60, 20, 20);
g.DrawEllipse(Pen, _startPosX.Value + 44, _startPosY.Value + 70, 9, 9);
g.FillEllipse(brWhite, _startPosX.Value + 44, _startPosY.Value + 70, 9, 9);
g.DrawEllipse(Pen, _startPosX.Value + 56, _startPosY.Value + 70, 9, 9);
g.FillEllipse(brWhite, _startPosX.Value + 56, _startPosY.Value + 70, 9, 9);
g.DrawEllipse(Pen, _startPosX.Value + 68, _startPosY.Value + 70, 9, 9);
g.FillEllipse(brWhite, _startPosX.Value + 68, _startPosY.Value + 70, 9, 9);
g.DrawEllipse(Pen, _startPosX.Value + 52, _startPosY.Value + 60, 6, 6);
g.FillEllipse(brWhite, _startPosX.Value + 52, _startPosY.Value + 60, 6, 6);
g.DrawEllipse(Pen, _startPosX.Value + 62, _startPosY.Value + 60, 6, 6);
g.FillEllipse(brWhite, _startPosX.Value + 62, _startPosY.Value + 60, 6, 6);
}
}

View File

@ -1,28 +1,16 @@
/// <summary>
/// Класс-сущность "Спортивный автомобиль"
namespace ProjectBuldozer.Entities;
/// <summary>
/// Класс-сущность "булдозер"
/// </summary>
public class EntityBuldozer
public class EntityBuldozer : EntityUsualBuldozer
{
/// <summary>
/// Скорость
/// </summary>
public int Speed { get; private set; }
/// <summary>
/// Вес
/// </summary>
public double Weight { get; private set; }
/// <summary>
/// Основной цвет
/// </summary>
public Color BodyColor { get; private set; }
/// <summary>
/// Дополнительный цвет (для опциональных элементов)
/// </summary>
public Color AdditionalColor { get; private set; }
public bool BodyKit { get; private set; }
/// <summary>
/// Признак (опция) наличия отвала
/// </summary>
@ -45,15 +33,14 @@ public class EntityBuldozer
/// <param name="weight"></param>
/// <param name="bodyColor"></param>
/// <param name="additionalColor"></param>
/// <param name="bodyKit">Признак наличия обвеса</param>
/// <param name="otval"></param>
/// <param name="rihlitel"></param>
public void Init(int speed, double weight, Color bodyColor, Color
additionalColor, bool otval, bool rihlitel)
public EntityBuldozer(int speed, double weight, Color bodyColor, Color
additionalColor, bool bodyKit, bool otval, bool rihlitel) : base(speed, weight, bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
AdditionalColor = additionalColor;
BodyKit = bodyKit;
Otval = otval;
Rihlitel = rihlitel;
}

View File

@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectBuldozer.Entities;
/// <summary>
/// Класс-сущность "просто булдозер"
/// </summary>
public class EntityUsualBuldozer
{
/// <summary>
/// Скорость
/// </summary>
public int Speed { get; private set; }
/// <summary>
/// Вес
/// </summary>
public double Weight { get; private set; }
/// <summary>
/// Основной цвет
/// </summary>
public Color BodyColor { get; private set; }
/// <summary>
/// Конструктрор сущности
/// </summary>
/// <param name="speed"></param>
/// <param name="weight"></param>
/// <param name="bodyColor"></param>
/// <summary>
/// Шаг перемещения автомобиля
/// </summary>
public double Step => Speed * 100 / Weight;
public EntityUsualBuldozer(int speed, double weight, Color bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
}
}

View File

@ -38,6 +38,9 @@ namespace ProjectBuldozer
buttonUp = new Button();
buttonDown = new Button();
buttonRight = new Button();
buttonCreateTyagach = new Button();
comboBoxStrategy = new ComboBox();
buttonStrategyStep = new Button();
((System.ComponentModel.ISupportInitialize)pictureBoxBuldozer).BeginInit();
SuspendLayout();
//
@ -46,18 +49,18 @@ namespace ProjectBuldozer
pictureBoxBuldozer.Dock = DockStyle.Fill;
pictureBoxBuldozer.Location = new Point(0, 0);
pictureBoxBuldozer.Name = "pictureBoxBuldozer";
pictureBoxBuldozer.Size = new Size(923, 597);
pictureBoxBuldozer.Size = new Size(923, 274);
pictureBoxBuldozer.TabIndex = 0;
pictureBoxBuldozer.TabStop = false;
//
// buttonCreateBuldozer
//
buttonCreateBuldozer.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreateBuldozer.Location = new Point(12, 562);
buttonCreateBuldozer.Location = new Point(12, 239);
buttonCreateBuldozer.Name = "buttonCreateBuldozer";
buttonCreateBuldozer.Size = new Size(75, 23);
buttonCreateBuldozer.Size = new Size(176, 23);
buttonCreateBuldozer.TabIndex = 1;
buttonCreateBuldozer.Text = "Создать";
buttonCreateBuldozer.Text = "Создать бульдузер";
buttonCreateBuldozer.UseVisualStyleBackColor = true;
buttonCreateBuldozer.Click += ButtonCreateBuldozer_Click;
//
@ -66,7 +69,7 @@ namespace ProjectBuldozer
buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonLeft.BackgroundImage = Properties.Resources.arrowLeft;
buttonLeft.BackgroundImageLayout = ImageLayout.Stretch;
buttonLeft.Location = new Point(787, 550);
buttonLeft.Location = new Point(787, 227);
buttonLeft.Name = "buttonLeft";
buttonLeft.Size = new Size(35, 35);
buttonLeft.TabIndex = 2;
@ -78,7 +81,7 @@ namespace ProjectBuldozer
buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonUp.BackgroundImage = Properties.Resources.arrowUp;
buttonUp.BackgroundImageLayout = ImageLayout.Stretch;
buttonUp.Location = new Point(828, 509);
buttonUp.Location = new Point(828, 186);
buttonUp.Name = "buttonUp";
buttonUp.Size = new Size(35, 35);
buttonUp.TabIndex = 3;
@ -90,7 +93,7 @@ namespace ProjectBuldozer
buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonDown.BackgroundImage = Properties.Resources.arrowDown;
buttonDown.BackgroundImageLayout = ImageLayout.Stretch;
buttonDown.Location = new Point(828, 550);
buttonDown.Location = new Point(828, 227);
buttonDown.Name = "buttonDown";
buttonDown.Size = new Size(35, 35);
buttonDown.TabIndex = 4;
@ -102,18 +105,52 @@ namespace ProjectBuldozer
buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonRight.BackgroundImage = Properties.Resources.arrowRight;
buttonRight.BackgroundImageLayout = ImageLayout.Stretch;
buttonRight.Location = new Point(869, 550);
buttonRight.Location = new Point(869, 227);
buttonRight.Name = "buttonRight";
buttonRight.Size = new Size(35, 35);
buttonRight.TabIndex = 5;
buttonRight.UseVisualStyleBackColor = true;
buttonRight.Click += ButtonMove_Click;
//
// buttonCreateTyagach
//
buttonCreateTyagach.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreateTyagach.Location = new Point(210, 239);
buttonCreateTyagach.Name = "buttonCreateTyagach";
buttonCreateTyagach.Size = new Size(163, 23);
buttonCreateTyagach.TabIndex = 6;
buttonCreateTyagach.Text = "Создать тягач";
buttonCreateTyagach.UseVisualStyleBackColor = true;
buttonCreateTyagach.Click += ButtonCreateUsualBuldozer_Click;
//
// comboBoxStrategy
//
comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxStrategy.FormattingEnabled = true;
comboBoxStrategy.Items.AddRange(new object[] { "К центру", "К краю" });
comboBoxStrategy.Location = new Point(713, 0);
comboBoxStrategy.Name = "comboBoxStrategy";
comboBoxStrategy.Size = new Size(121, 23);
comboBoxStrategy.TabIndex = 7;
//
// buttonStrategyStep
//
buttonStrategyStep.Location = new Point(747, 55);
buttonStrategyStep.Name = "buttonStrategyStep";
buttonStrategyStep.Size = new Size(75, 23);
buttonStrategyStep.TabIndex = 8;
buttonStrategyStep.Text = "Шаг";
buttonStrategyStep.UseVisualStyleBackColor = true;
buttonStrategyStep.Click += buttonStrategyStep_Click_1;
//
// FormBuldozer
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(923, 597);
ClientSize = new Size(923, 274);
Controls.Add(buttonStrategyStep);
Controls.Add(comboBoxStrategy);
Controls.Add(buttonCreateTyagach);
Controls.Add(buttonRight);
Controls.Add(buttonDown);
Controls.Add(buttonUp);
@ -134,5 +171,8 @@ namespace ProjectBuldozer
private Button buttonUp;
private Button buttonDown;
private Button buttonRight;
private Button buttonCreateTyagach;
private ComboBox comboBoxStrategy;
private Button buttonStrategyStep;
}
}

View File

@ -1,4 +1,7 @@
namespace ProjectBuldozer;
using ProjectBuldozer.Drawnings;
using ProjectBuldozer.MovementStrategy;
namespace ProjectBuldozer;
/// <summary>
/// Форма работы с объектом "Спортивный автомобиль"
@ -8,7 +11,12 @@ public partial class FormBuldozer : Form
/// <summary>
/// Поле-объект для прорисовки объекта
/// </summary>
private DrawingBuldozer? _drawningBuldozer;
private DrawingUsualBuldozer? _drawningUsualBuldozer;
/// <summary>
/// Стратегия перемещения
/// </summary>
private AbstractStrategy? _strategy;
/// <summary>
/// Конструктор формы
@ -16,6 +24,7 @@ public partial class FormBuldozer : Form
public FormBuldozer()
{
InitializeComponent();
_strategy = null;
}
/// <summary>
@ -23,34 +32,60 @@ public partial class FormBuldozer : Form
/// </summary>
private void Draw()
{
if (_drawningBuldozer == null)
if (_drawningUsualBuldozer == null)
{
return;
}
Bitmap bmp = new(pictureBoxBuldozer.Width, pictureBoxBuldozer.Height);
Graphics gr = Graphics.FromImage(bmp);
_drawningBuldozer.DrawTransport(gr);
_drawningUsualBuldozer.DrawTransport(gr);
pictureBoxBuldozer.Image = bmp;
}
/// <summary>
/// Обработка нажатия кнопки "Создать"
/// Создание объекта класса-перемещения
/// </summary>
/// <param name="type">Тип создаваемого объекта</param>
private void CreateObject(string type)
{
Random random = new();
switch (type)
{
case nameof(DrawingUsualBuldozer):
_drawningUsualBuldozer = new DrawingUsualBuldozer(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(DrawingBuldozer):
_drawningUsualBuldozer = new DrawingBuldozer(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)), Convert.ToBoolean(random.Next(0, 2)));
break;
default:
return;
}
_drawningUsualBuldozer.SetPictureSize(pictureBoxBuldozer.Width, pictureBoxBuldozer.Height);
_drawningUsualBuldozer.SetPosition(random.Next(10, 100), random.Next(10, 100));
_strategy = null;
comboBoxStrategy.Enabled = true;
Draw();
}
/// <summary>
/// Обработка нажатия кнопки "Создать спортивный автомобиль"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCreateBuldozer_Click(object sender, EventArgs e)
{
Random random = new();
_drawningBuldozer = new DrawingBuldozer();
_drawningBuldozer.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)), Convert.ToBoolean(random.Next(0, 2)));
_drawningBuldozer.SetPictureSize(pictureBoxBuldozer.Width, pictureBoxBuldozer.Height);
_drawningBuldozer.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw();
}
private void ButtonCreateBuldozer_Click(object sender, EventArgs e) => CreateObject(nameof(DrawingBuldozer));
/// <summary>
/// Обработка нажатия кнопки "Создать автомобиль"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCreateUsualBuldozer_Click(object sender, EventArgs e) => CreateObject(nameof(DrawingUsualBuldozer));
/// <summary>
/// Перемещение объекта по форме (нажатие кнопок навигации)
@ -59,7 +94,7 @@ public partial class FormBuldozer : Form
/// <param name="e"></param>
private void ButtonMove_Click(object sender, EventArgs e)
{
if (_drawningBuldozer == null)
if (_drawningUsualBuldozer == null)
{
return;
}
@ -69,16 +104,16 @@ public partial class FormBuldozer : Form
switch (name)
{
case "buttonUp":
result = _drawningBuldozer.MoveTransport(DirectionType.Up);
result = _drawningUsualBuldozer.MoveTransport(DirectionType.Up);
break;
case "buttonDown":
result = _drawningBuldozer.MoveTransport(DirectionType.Down);
result = _drawningUsualBuldozer.MoveTransport(DirectionType.Down);
break;
case "buttonLeft":
result = _drawningBuldozer.MoveTransport(DirectionType.Left);
result = _drawningUsualBuldozer.MoveTransport(DirectionType.Left);
break;
case "buttonRight":
result = _drawningBuldozer.MoveTransport(DirectionType.Right);
result = _drawningUsualBuldozer.MoveTransport(DirectionType.Right);
break;
}
@ -88,8 +123,84 @@ public partial class FormBuldozer : Form
}
}
private void FormBuldozer_Load(object sender, EventArgs e)
/// <summary>
/// Обработка нажатия кнопки "Шаг"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonStrategyStep_Click(object sender, EventArgs e)
{
if (_drawningUsualBuldozer == null)
{
return;
}
if (comboBoxStrategy.Enabled)
{
_strategy = comboBoxStrategy.SelectedIndex switch
{
0 => new MoveToCenter(),
1 => new MoveToBorder(),
_ => null,
};
if (_strategy == null)
{
return;
}
_strategy.SetData(new MoveableTyagach(_drawningUsualBuldozer), pictureBoxBuldozer.Width, pictureBoxBuldozer.Height);
}
if (_strategy == null)
{
return;
}
comboBoxStrategy.Enabled = false;
_strategy.MakeStep();
Draw();
if (_strategy.GetStatus() == StrategyStatus.Finish)
{
comboBoxStrategy.Enabled = true;
_strategy = null;
}
}
private void buttonStrategyStep_Click_1(object sender, EventArgs e)
{
if (_drawningUsualBuldozer == null)
{
return;
}
if (comboBoxStrategy.Enabled)
{
_strategy = comboBoxStrategy.SelectedIndex switch
{
0 => new MoveToCenter(),
1 => new MoveToBorder(),
_ => null,
};
if (_strategy == null)
{
return;
}
_strategy.SetData(new MoveableTyagach(_drawningUsualBuldozer), pictureBoxBuldozer.Width, pictureBoxBuldozer.Height);
}
if (_strategy == null)
{
return;
}
comboBoxStrategy.Enabled = false;
_strategy.MakeStep();
Draw();
if (_strategy.GetStatus() == StrategyStatus.Finish)
{
comboBoxStrategy.Enabled = true;
_strategy = null;
}
}
}

View File

@ -0,0 +1,140 @@
namespace ProjectBuldozer.MovementStrategy;
/// <summary>
/// Класс-стратегия перемещения объекта
/// </summary>
public abstract class AbstractStrategy
{
/// <summary>
/// Перемещаемый объект
/// </summary>
private IMoveableObjectcs? _moveableObject;
/// <summary>
/// Статус перемещения
/// </summary>
private StrategyStatus _state = StrategyStatus.NotInit;
/// <summary>
/// Ширина поля
/// </summary>
protected int FieldWidth { get; private set; }
/// <summary>
/// Высота поля
/// </summary>
protected int FieldHeight { get; private set; }
/// <summary>
/// Статус перемещения
/// </summary>
public StrategyStatus GetStatus() { return _state; }
/// <summary>
/// Установка данных
/// </summary>
/// <param name="moveableObject">Перемещаемый объект</param>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
public void SetData(IMoveableObjectcs moveableObject, int width, int height)
{
if (moveableObject == null)
{
_state = StrategyStatus.NotInit;
return;
}
_state = StrategyStatus.InProgress;
_moveableObject = moveableObject;
FieldWidth = width;
FieldHeight = height;
}
/// <summary>
/// Шаг перемещения
/// </summary>
public void MakeStep()
{
if (_state != StrategyStatus.InProgress)
{
return;
}
if (IsTargetDestinaion())
{
_state = StrategyStatus.Finish;
return;
}
MoveToTarget();
}
/// <summary>
/// Перемещение влево
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveLeft() => MoveTo(MovementDirection.Left);
/// <summary>
/// Перемещение вправо
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveRight() => MoveTo(MovementDirection.Right);
/// <summary>
/// Перемещение вверх
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveUp() => MoveTo(MovementDirection.Up);
/// <summary>
/// Перемещение вниз
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveDown() => MoveTo(MovementDirection.Down);
/// <summary>
/// Параметры объекта
/// </summary>
protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition;
/// <summary>
/// Шаг объекта
/// </summary>
/// <returns></returns>
protected int? GetStep()
{
if (_state != StrategyStatus.InProgress)
{
return null;
}
return _moveableObject?.GetStep;
}
/// <summary>
/// Перемещение к цели
/// </summary>
protected abstract void MoveToTarget();
/// <summary>
/// Достигнута ли цель
/// </summary>
/// <returns></returns>
protected abstract bool IsTargetDestinaion();
/// <summary>
/// Попытка перемещения в требуемом направлении
/// </summary>
/// <param name="movementDirection">Направление</param>
/// <returns>Результат попытки (true - удалось переместиться, false - неудача)</returns>
private bool MoveTo(MovementDirection movementDirection)
{
if (_state != StrategyStatus.InProgress)
{
return false;
}
return _moveableObject?.TryMoveObject(movementDirection) ?? false;
}
}

View File

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

View File

@ -0,0 +1,52 @@

namespace ProjectBuldozer.MovementStrategy
{
internal class MoveToBorder : 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;
if (Math.Abs(diffX) > GetStep())
{
if (diffX > 0)
{
MoveLeft();
}
else
{
MoveRight();
}
}
int diffY = objParams.ObjectMiddleVertical - FieldHeight;
if (Math.Abs(diffY) > GetStep())
{
if (diffY > 0)
{
MoveUp();
}
else
{
MoveDown();
}
}
}
}
}

View File

@ -0,0 +1,48 @@
namespace ProjectBuldozer.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();
}
}
}
}

View File

@ -0,0 +1,67 @@
using ProjectBuldozer.Drawnings;
namespace ProjectBuldozer.MovementStrategy;
/// <summary>
/// Класс-реализация IMoveableObject с использованием DrawningExcavator
/// </summary>
public class MoveableTyagach : IMoveableObjectcs
{
/// <summary>
/// Поле-объект класса DrawningCar или его наследника
/// </summary>
private readonly DrawingUsualBuldozer? _excavator = null;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="car">Объект класса DrawningCar</param>
public MoveableTyagach(DrawingUsualBuldozer excavator)
{
_excavator = excavator;
}
public ObjectParameters? GetObjectPosition
{
get
{
if (_excavator == null || _excavator.EntityUsualBuldozer == null || !_excavator.GetPosX.HasValue || !_excavator.GetPosY.HasValue)
{
return null;
}
return new ObjectParameters(_excavator.GetPosX.Value, _excavator.GetPosY.Value, _excavator.GetWidth, _excavator.GetHeight);
}
}
public int GetStep => (int)(_excavator?.EntityUsualBuldozer?.Step ?? 0);
public bool TryMoveObject(MovementDirection direction)
{
if (_excavator == null || _excavator.EntityUsualBuldozer == null)
{
return false;
}
return _excavator.MoveTransport(GetDirectionType(direction));
}
/// <summary>
/// Конвертация из MovementDirection в DirectionType
/// </summary>
/// <param name="direction">MovementDirection</param>
/// <returns>DirectionType</returns>
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,
};
}
}

View File

@ -0,0 +1,24 @@
namespace ProjectBuldozer.MovementStrategy;
/// <summary>
/// направление перемещения
/// </summary>
public enum MovementDirection
{
/// <summary>
/// Вверх
/// </summary>
Up = 1,
/// <summary>
/// Вниз
/// </summary>
Down = 2,
/// <summary>
/// Влево
/// </summary>
Left = 3,
/// <summary>
/// Вправо
/// </summary>
Right = 4
}

View File

@ -0,0 +1,73 @@
namespace ProjectBuldozer.MovementStrategy;
/// <summary>
/// Параметры-координаты объекта
/// </summary>
public class ObjectParameters
{
/// <summary>
/// Координата X
/// </summary>
private readonly int _x;
/// <summary>
/// Координата Y
/// </summary>
private readonly int _y;
/// <summary>
/// Ширина объекта
/// </summary>
private readonly int _width;
/// <summary>
/// Высота объекта
/// </summary>
private readonly int _height;
/// <summary>
/// Левая граница
/// </summary>
public int LeftBorder => _x;
/// <summary>
/// Верхняя граница
/// </summary>
public int TopBorder => _y;
/// <summary>
/// Правая граница
/// </summary>
public int RightBorder => _x + _width;
/// <summary>
/// Нижняя граница
/// </summary>
public int DownBorder => _y + _height;
/// <summary>
/// Середина объекта
/// </summary>
public int ObjectMiddleHorizontal => _x + _width / 2;
/// <summary>
/// Середина объекта
/// </summary>
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 ObjectParameters(int x, int y, int width, int height)
{
_x = x;
_y = y;
_width = width;
_height = height;
}
}

View File

@ -0,0 +1,21 @@
namespace ProjectBuldozer.MovementStrategy;
/// <summary>
///статус выполнения операции перемещения
/// </summary>
public enum StrategyStatus
{
/// <summary>
/// все готово к началу
/// </summary>
NotInit,
/// <summary>
/// выполняется
/// </summary>
InProgress,
/// <summary>
/// завершено
/// </summary>
Finish
}