diff --git a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/AbstractStrategy.cs b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/AbstractStrategy.cs new file mode 100644 index 0000000..94c8dc9 --- /dev/null +++ b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/AbstractStrategy.cs @@ -0,0 +1,135 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using SelfPropelledArtilleryUnit.Drawnings; +namespace SelfPropelledArtilleryUnit.MovementStrategy +{ + /// + /// Класс-стратегия перемещения объекта + /// + public abstract class AbstractStrategy + { + /// + /// Перемещаемый объект + /// + private IMoveableObject? _moveableObject; + /// + /// Статус перемещения + /// + private Status _state = Status.NotInit; + /// + /// Ширина поля + /// + protected int FieldWidth { get; private set; } + /// + /// Высота поля + /// + protected int FieldHeight { get; private set; } + /// + /// Статус перемещения + /// + public Status GetStatus() { return _state; } + /// + /// Установка данных + /// + /// Перемещаемый объект + /// Ширина поля + /// Высота поля + public void SetData(IMoveableObject moveableObject, int width, int + height) + { + if (moveableObject == null) + { + _state = Status.NotInit; + return; + } + _state = Status.InProgress; + _moveableObject = moveableObject; + FieldWidth = width; + FieldHeight = height; + } + /// + /// Шаг перемещения + /// + public void MakeStep() + { + if (_state != Status.InProgress) + { + return; + } + if (IsTargetDestinaion()) + { + _state = Status.Finish; + return; + } + MoveToTarget(); + } + /// + /// Перемещение влево + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveLeft() => MoveTo(DirectionType.Left); + /// + /// Перемещение вправо + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveRight() => MoveTo(DirectionType.Right); + /// + /// Перемещение вверх + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveUp() => MoveTo(DirectionType.Up); + /// + /// Перемещение вниз + /// + /// Результат перемещения (true - удалось переместиться, false - неудача) + protected bool MoveDown() => MoveTo(DirectionType.Down); + /// + /// Параметры объекта + /// + protected ObjectParameters? GetObjectParameters => + _moveableObject?.GetObjectPosition; + /// + /// Шаг объекта + /// + /// + protected int? GetStep() + { + if (_state != Status.InProgress) + { + return null; + } + return _moveableObject?.GetStep; + } + /// + /// Перемещение к цели + /// + protected abstract void MoveToTarget(); + /// + /// Достигнута ли цель + /// + /// + protected abstract bool IsTargetDestinaion(); + /// + /// Попытка перемещения в требуемом направлении + /// + /// Направление + /// Результат попытки (true - удалось переместиться, false - неудача) + private bool MoveTo(DirectionType directionType) + { + if (_state != Status.InProgress) + { + return false; + } + if (_moveableObject?.CheckCanMove(directionType) ?? false) + { + _moveableObject.MoveObject(directionType); + return true; + } + return false; + } + } +} diff --git a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/Direction.cs b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/DirectionType.cs similarity index 63% rename from SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/Direction.cs rename to SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/DirectionType.cs index 201fd07..ba960ef 100644 --- a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/Direction.cs +++ b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/DirectionType.cs @@ -4,8 +4,11 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace SelfPropelledArtilleryUnit +namespace SelfPropelledArtilleryUnit.Drawnings { + /// + /// Направление перемещения + /// public enum DirectionType { @@ -17,5 +20,4 @@ namespace SelfPropelledArtilleryUnit Right = 4 } - } diff --git a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/DrawningUsta.cs b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/DrawningUsta.cs index 3be0cbd..e24ad32 100644 --- a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/DrawningUsta.cs +++ b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/DrawningUsta.cs @@ -1,126 +1,195 @@ using System; using System.Collections.Generic; -using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace SelfPropelledArtilleryUnit +using SelfPropelledArtilleryUnit.Entities; +using SelfPropelledArtilleryUnit.Drawnings; +using System.Drawing.Drawing2D; + +namespace SelfPropelledArtilleryUnit.DrawningObjects { + /// + /// Класс, отвечающий за прорисовку и перемещение объекта-сущности + /// public class DrawningUsta { - private int lineWidth; + /// /// Класс-сущность - public EntityUsta? EntityUsta { get; private set; } - /// Ширина окна - private int _pictureWidth; - /// Высота окна - private int _pictureHeight; - /// Левая координата прорисовки установки - private int _startPosX; - /// Верхняя кооридната прорисовки установки - private int _startPosY; - /// Ширина прорисовки установки - private readonly int _ustaWidth = 140; - /// Высота прорисовки установки - private readonly int _ustaHeight = 90; - /// Инициализация свойств - /// Скорость - /// Вес - /// Общий цвет - /// Дополнительный цвет - /// Признак наличия батареи - /// Признак наличия пушки - /// Ширина картинки - /// Высота картинки - /// true - объект создан, false - проверка не пройдена, - public bool Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool pushka, int width, int height){ - if (width < _pictureWidth || height < _pictureHeight) - { - return false; - } - _pictureWidth = width; - _pictureHeight = height; - EntityUsta = new EntityUsta(); - EntityUsta.Init(speed, weight, bodyColor, additionalColor, - bodyKit, pushka); - return true; + /// + public EntityUsta? EntityUsta { get; protected set; } + /// + /// Ширина окна + /// + private int _pictureWidth; + /// + /// Высота окна + /// + private int _pictureHeight; + /// + /// Левая координата прорисовки установки + /// + protected int _startPosX; + /// + /// Верхняя кооридната прорисовки установки + /// + protected int _startPosY; + /// + /// Ширина прорисовки установки + /// + protected readonly int _ustaWidth = 140; + /// + /// Высота прорисовки установки + /// + protected readonly int _ustaHeight = 90; + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Ширина картинки + /// Высота картинки + public DrawningUsta(int speed, double weight, Color bodyColor, int + width, int height) + { + // TODO: Продумать проверки + _pictureWidth = width; + _pictureHeight = height; + EntityUsta = new EntityUsta(speed, weight, bodyColor); + } + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Ширина картинки + /// Высота картинки + /// Ширина прорисовки установки + /// Высота прорисовки установки + protected DrawningUsta(int speed, double weight, Color bodyColor, int + width, int height, int ustaWidth, int ustaHeight) + { + // TODO: Продумать проверки + if (width <= _pictureWidth || height <= _pictureHeight) + { + return; } + + _pictureWidth = width; + _pictureHeight = height; + _ustaWidth = ustaWidth; + _ustaHeight = ustaHeight; + EntityUsta = new EntityUsta(speed, weight, bodyColor); + } + /// /// Установка позиции + /// /// Координата X /// Координата Y public void SetPosition(int x, int y) { - // TODO: Изменение x, y - if (x <= _pictureWidth - _ustaWidth && y <= _pictureHeight - _ustaHeight) + // TODO: Изменение x, y, если при установке объект выходит за границы + if (x < 0 || y < 0 || x + _ustaWidth > _pictureWidth || y + _ustaHeight > _pictureHeight) { - _startPosX = x; - _startPosY = y; + x = 10; + y = 10; } + _startPosX = x; + _startPosY = y; + } + + protected int PictureWidth + { + get { return _pictureWidth; } + } + + protected int PictureHeight + { + get { return _pictureHeight; } + } + /// /// Изменение направления перемещения + /// /// Направление - public void MoveTransport(DirectionType direction) + + /// + /// Прорисовка объекта + /// + /// + /// + /// Координата X объекта + /// + public int GetPosX => _startPosX; + /// + /// Координата Y объекта + /// + public int GetPosY => _startPosY; + /// + /// Ширина объекта + /// + public int GetWidth => _ustaWidth; + /// + /// Высота объекта + /// + public int GetHeight => _ustaHeight; + + /// + /// Проверка, что объект может переместится по указанному направлению + /// + /// Направление + /// true - можно переместится по указанному направлению + public virtual bool CanMove(DirectionType direction) { if (EntityUsta == null) - + { + return false; + } + return direction switch + { + //влево + DirectionType.Left => _startPosX - EntityUsta.Step > 0, + //вверх + DirectionType.Up => _startPosY - EntityUsta.Step > 7, + // вправо + DirectionType.Right => _startPosX + EntityUsta.Step + _ustaWidth < _pictureWidth,// TODO: Продумать логику + //вниз + DirectionType.Down => _startPosY + EntityUsta.Step + _ustaHeight < _pictureHeight,// TODO: Продумать логику + _ => false, + }; + } + /// + /// Изменение направления перемещения + /// + /// Направление + public virtual void MoveTransport(DirectionType direction) + { + + if (!CanMove(direction) || EntityUsta == null) { return; } switch (direction) { - //влево case DirectionType.Left: - if (_startPosX - EntityUsta.Step > 0) - { - _startPosX -= (int)EntityUsta.Step; - } - if (_startPosX - EntityUsta.Step < 0) - { - _startPosX -= _startPosX; - } + _startPosX -= (int)EntityUsta.Step; break; - //вверх case DirectionType.Up: - if (_startPosY - EntityUsta.Step > 5) - { - _startPosY -= (int)EntityUsta.Step; - } - else if (_startPosY + 7 - EntityUsta.Step < 0) - { - _startPosY = _startPosY - _startPosY + 10; - } + _startPosY -= (int)EntityUsta.Step; break; - // вправо case DirectionType.Right: - if (_startPosX + EntityUsta.Step + _ustaWidth < _pictureWidth) - { - _startPosX += (int)EntityUsta.Step; - } - else if (_startPosX + EntityUsta.Step + _ustaWidth > _pictureWidth) - { - _startPosX += _pictureWidth - _startPosX - _ustaWidth; - } - + _startPosX += (int)EntityUsta.Step; break; - //вниз case DirectionType.Down: - if (_startPosY + EntityUsta.Step + _ustaHeight < _pictureHeight) - { - _startPosY += (int)EntityUsta.Step; - } - else if (_startPosY + EntityUsta.Step + _ustaHeight > _pictureHeight) - { - _startPosY += _pictureHeight - _startPosY - _ustaHeight; - } + _startPosY += (int)EntityUsta.Step; break; } } - /// - /// Прорисовка объекта - /// - /// - public void DrawTransport(Graphics g) + + public virtual void DrawTransport(Graphics g) { if (EntityUsta == null) { @@ -128,11 +197,11 @@ namespace SelfPropelledArtilleryUnit } Pen pen = new(Color.Black); - Brush additionalBrush = new SolidBrush(EntityUsta.AdditionalColor); + Brush BodyColor = new SolidBrush(EntityUsta.BodyColor); //зеленый темнее - lineWidth = 10; + int lineWidth = 10; Color color1 = Color.FromArgb(65, 72, 51); Brush pen1 = new SolidBrush(color1); @@ -148,7 +217,7 @@ namespace SelfPropelledArtilleryUnit //прорисовка арт. установки - + int cornerRadius = 16; // Радиус скругления углов int cornerRadius1 = 12; @@ -182,126 +251,7 @@ namespace SelfPropelledArtilleryUnit g.FillEllipse(pen3, _startPosX + 10, _startPosY + 52, 26, 26); g.FillEllipse(pen3, _startPosX + 105, _startPosY + 52, 26, 26); - - - - - // батарея - if (EntityUsta.BodyKit) - { - - GraphicsPath path1 = new GraphicsPath(); - path1.AddLine(_startPosX + 15, _startPosY + 40, _startPosX + 15, _startPosY + 30); - path1.AddLine(_startPosX + 15, _startPosY + 30, _startPosX + 15, _startPosY + 35); - path1.AddLine(_startPosX + 15, _startPosY + 35, _startPosX + 25, _startPosY + 35); - path1.AddLine(_startPosX + 25, _startPosY + 35, _startPosX + 30, _startPosY + 30); - path1.AddLine(_startPosX + 30, _startPosY + 30, _startPosX + 35, _startPosY + 40); - path1.CloseFigure(); - - g.DrawPath(pen, path1); - - g.FillPath(BodyColor, path1); - - - - GraphicsPath path2 = new GraphicsPath(); - path2.AddLine(_startPosX + 15, _startPosY + 30, _startPosX + 40, _startPosY + 20); - path2.AddLine(_startPosX + 40, _startPosY + 20, _startPosX + 40, _startPosY + 25); - path2.AddLine(_startPosX + 40, _startPosY + 25, _startPosX + 25, _startPosY + 35); - path2.AddLine(_startPosX + 25, _startPosY + 35, _startPosX + 15, _startPosY + 35); - - path2.CloseFigure(); - - g.DrawPath(pen, path2); - - g.FillPath(additionalBrush, path2); - - - - GraphicsPath path3 = new GraphicsPath(); - path3.AddLine(_startPosX + 10, _startPosY + 32, _startPosX, _startPosY + 10); - path3.AddLine(_startPosX, _startPosY + 10, _startPosX + 40, _startPosY - 7); - path3.AddLine(_startPosX + 40, _startPosY - 7, _startPosX + 50, _startPosY + 16); - - path3.CloseFigure(); - - g.DrawPath(pen, path3); - - g.FillPath(pen3, path3); - - - - GraphicsPath path4 = new GraphicsPath(); - path4.AddLine(_startPosX, _startPosY + 10, _startPosX + 40, _startPosY - 7); - path4.AddLine(_startPosX + 40, _startPosY - 7, _startPosX + 43, _startPosY - 5); - path4.AddLine(_startPosX + 43, _startPosY - 5, _startPosX + 41, _startPosY - 3); - path4.AddLine(_startPosX + 41, _startPosY - 3, _startPosX + 2, _startPosY + 13); - - path4.CloseFigure(); - - g.DrawPath(pen, path4); - - g.FillPath(additionalBrush, path4); - - - GraphicsPath path5 = new GraphicsPath(); - path5.AddLine(_startPosX + 3, _startPosY + 15, _startPosX + 45, _startPosY - 2); - path5.AddLine(_startPosX + 46, _startPosY - 2, _startPosX + 49, _startPosY - 1); - path5.AddLine(_startPosX + 49, _startPosY - 1, _startPosX + 46, _startPosY + 3); - path5.AddLine(_startPosX + 46, _startPosY + 3, _startPosX + 6, _startPosY + 20); - - path5.CloseFigure(); - - g.DrawPath(pen, path5); - - g.FillPath(BodyColor, path5); - - - - GraphicsPath path6 = new GraphicsPath(); - path6.AddLine(_startPosX + 5, _startPosY + 22, _startPosX + 47, _startPosY + 5); - path6.AddLine(_startPosX + 47, _startPosY + 5, _startPosX + 51, _startPosY + 5); - path6.AddLine(_startPosX + 51, _startPosY + 5, _startPosX + 53, _startPosY + 7); - path6.AddLine(_startPosX + 53, _startPosY + 7, _startPosX + 8, _startPosY + 25); - - path6.CloseFigure(); - - g.DrawPath(pen, path6); - - g.FillPath(additionalBrush, path6); - - - GraphicsPath path7 = new GraphicsPath(); - path7.AddLine(_startPosX + 7, _startPosY + 27, _startPosX + 46, _startPosY + 11); - path7.AddLine(_startPosX + 46, _startPosY + 11, _startPosX + 51, _startPosY + 9); - path7.AddLine(_startPosX + 51, _startPosY + 9, _startPosX + 56, _startPosY + 11); - path7.AddLine(_startPosX + 56, _startPosY + 11, _startPosX + 10, _startPosY + 31); - - path7.CloseFigure(); - - g.DrawPath(pen, path7); - - g.FillPath(BodyColor, path7); - - - - } - // пушка - if (EntityUsta.Pushka) - { - g.FillRectangle(pen2, _startPosX + 80, _startPosY + 25, 10, 10); - g.DrawRectangle(pen, _startPosX + 80, _startPosY + 25, 10, 10); - - g.FillRectangle(additionalBrush, _startPosX + 90, _startPosY + 28, 40, 5); - g.DrawRectangle(pen, _startPosX + 90, _startPosY + 28, 40, 5); - - g.FillRectangle(additionalBrush, _startPosX + 130, _startPosY + 27, 5, 7); - g.DrawRectangle(pen, _startPosX + 130, _startPosY + 27, 5, 7); - } - - - } } - } + diff --git a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/DrawningUstaBat.cs b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/DrawningUstaBat.cs new file mode 100644 index 0000000..4d54cea --- /dev/null +++ b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/DrawningUstaBat.cs @@ -0,0 +1,176 @@ +using System; +using System.Collections.Generic; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using SelfPropelledArtilleryUnit.Drawnings; +using SelfPropelledArtilleryUnit.Entities; +namespace SelfPropelledArtilleryUnit.DrawningObjects +{ + /// + /// Класс, отвечающий за прорисовку и перемещение объекта-сущности + /// + public class DrawningUstaBat : DrawningUsta + { + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия батареи + /// Признак наличия пушки + /// Ширина картинки + /// Высота картинки + public DrawningUstaBat(int speed, double weight, Color bodyColor, Color + additionalColor, bool bodyKit, bool pushka, int width, int height) : + base(speed, weight, bodyColor, width, height, 140, 90) + { + if (EntityUsta != null) + { + EntityUsta = new EntityUstaBat(speed, weight, bodyColor, + additionalColor, bodyKit, pushka); + } + } + + + public override void DrawTransport(Graphics g) + { + if (EntityUsta is not EntityUstaBat ustaBat) + { + return; + } + Pen pen = new(Color.Black); + + Brush additionalBrush = new SolidBrush(ustaBat.AdditionalColor); + Brush BodyColor = new SolidBrush(EntityUsta.BodyColor); + + //зеленый темнее + Color color1 = Color.FromArgb(65, 72, 51); + Brush pen1 = new SolidBrush(color1); + + //black + + Color color3 = Color.FromArgb(0, 0, 0); + Brush pen3 = new SolidBrush(color3); + + + //зеленый мох + Color color2 = Color.FromArgb(47, 69, 56); + Brush pen2 = new SolidBrush(color1); + // батарея + if (ustaBat.BodyKit) + { + GraphicsPath path1 = new GraphicsPath(); + path1.AddLine(_startPosX + 15, _startPosY + 40, _startPosX + 15, _startPosY + 30); + path1.AddLine(_startPosX + 15, _startPosY + 30, _startPosX + 15, _startPosY + 35); + path1.AddLine(_startPosX + 15, _startPosY + 35, _startPosX + 25, _startPosY + 35); + path1.AddLine(_startPosX + 25, _startPosY + 35, _startPosX + 30, _startPosY + 30); + path1.AddLine(_startPosX + 30, _startPosY + 30, _startPosX + 35, _startPosY + 40); + path1.CloseFigure(); + + g.DrawPath(pen, path1); + + g.FillPath(BodyColor, path1); + + + + GraphicsPath path2 = new GraphicsPath(); + path2.AddLine(_startPosX + 15, _startPosY + 30, _startPosX + 40, _startPosY + 20); + path2.AddLine(_startPosX + 40, _startPosY + 20, _startPosX + 40, _startPosY + 25); + path2.AddLine(_startPosX + 40, _startPosY + 25, _startPosX + 25, _startPosY + 35); + path2.AddLine(_startPosX + 25, _startPosY + 35, _startPosX + 15, _startPosY + 35); + + path2.CloseFigure(); + + g.DrawPath(pen, path2); + + g.FillPath(additionalBrush, path2); + + + + GraphicsPath path3 = new GraphicsPath(); + path3.AddLine(_startPosX + 10, _startPosY + 32, _startPosX, _startPosY + 10); + path3.AddLine(_startPosX, _startPosY + 10, _startPosX + 40, _startPosY - 7); + path3.AddLine(_startPosX + 40, _startPosY - 7, _startPosX + 50, _startPosY + 16); + + path3.CloseFigure(); + + g.DrawPath(pen, path3); + + g.FillPath(pen3, path3); + + + + GraphicsPath path4 = new GraphicsPath(); + path4.AddLine(_startPosX, _startPosY + 10, _startPosX + 40, _startPosY - 7); + path4.AddLine(_startPosX + 40, _startPosY - 7, _startPosX + 43, _startPosY - 5); + path4.AddLine(_startPosX + 43, _startPosY - 5, _startPosX + 41, _startPosY - 3); + path4.AddLine(_startPosX + 41, _startPosY - 3, _startPosX + 2, _startPosY + 13); + + path4.CloseFigure(); + + g.DrawPath(pen, path4); + + g.FillPath(additionalBrush, path4); + + + GraphicsPath path5 = new GraphicsPath(); + path5.AddLine(_startPosX + 3, _startPosY + 15, _startPosX + 45, _startPosY - 2); + path5.AddLine(_startPosX + 46, _startPosY - 2, _startPosX + 49, _startPosY - 1); + path5.AddLine(_startPosX + 49, _startPosY - 1, _startPosX + 46, _startPosY + 3); + path5.AddLine(_startPosX + 46, _startPosY + 3, _startPosX + 6, _startPosY + 20); + + path5.CloseFigure(); + + g.DrawPath(pen, path5); + + g.FillPath(BodyColor, path5); + + + + GraphicsPath path6 = new GraphicsPath(); + path6.AddLine(_startPosX + 5, _startPosY + 22, _startPosX + 47, _startPosY + 5); + path6.AddLine(_startPosX + 47, _startPosY + 5, _startPosX + 51, _startPosY + 5); + path6.AddLine(_startPosX + 51, _startPosY + 5, _startPosX + 53, _startPosY + 7); + path6.AddLine(_startPosX + 53, _startPosY + 7, _startPosX + 8, _startPosY + 25); + + path6.CloseFigure(); + + g.DrawPath(pen, path6); + + g.FillPath(additionalBrush, path6); + + + GraphicsPath path7 = new GraphicsPath(); + path7.AddLine(_startPosX + 7, _startPosY + 27, _startPosX + 46, _startPosY + 11); + path7.AddLine(_startPosX + 46, _startPosY + 11, _startPosX + 51, _startPosY + 9); + path7.AddLine(_startPosX + 51, _startPosY + 9, _startPosX + 56, _startPosY + 11); + path7.AddLine(_startPosX + 56, _startPosY + 11, _startPosX + 10, _startPosY + 31); + + path7.CloseFigure(); + + g.DrawPath(pen, path7); + + g.FillPath(BodyColor, path7); + } + base.DrawTransport(g); + // пушка + if (ustaBat.Pushka) + { + g.FillRectangle(pen2, _startPosX + 80, _startPosY + 25, 10, 10); + g.DrawRectangle(pen, _startPosX + 80, _startPosY + 25, 10, 10); + + g.FillRectangle(additionalBrush, _startPosX + 90, _startPosY + 28, 40, 5); + g.DrawRectangle(pen, _startPosX + 90, _startPosY + 28, 40, 5); + + g.FillRectangle(additionalBrush, _startPosX + 130, _startPosY + 27, 5, 7); + g.DrawRectangle(pen, _startPosX + 130, _startPosY + 27, 5, 7); + } + + } + } +} diff --git a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/EntityUsta.cs b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/EntityUsta.cs index 5806f4e..64f9da5 100644 --- a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/EntityUsta.cs +++ b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/EntityUsta.cs @@ -4,59 +4,41 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace SelfPropelledArtilleryUnit +namespace SelfPropelledArtilleryUnit.Entities { - public class EntityUsta + /// + /// Класс-сущность "Установка" + /// + public class EntityUsta { - /// - /// Скорость - /// - public int Speed { get; private set; } - /// - /// Вес - /// - public double Weight { get; private set; } - /// - /// Основной цвет - /// - public Color BodyColor { get; private set; } - /// - /// Дополнительный цвет (для опциональных элементов) - /// - public Color AdditionalColor { get; private set; } - /// - /// Признак (опция) наличия батареи - /// - public bool BodyKit { get; private set; } - /// - /// Признак (опция) наличия пушки - /// - public bool Pushka { get; private set; } - /// - /// Шаг перемещения установки - /// - public double Step => (double)Speed * 100 / Weight; - /// - /// Инициализация полей объекта-класса установки с пушкой - /// - /// Скорость - /// Вес установки - /// Основной цвет - /// Дополнительный цвет - /// Признак наличия батареи - /// Признак наличия пушки - public void Init(int speed, double weight, Color bodyColor, Color - additionalColor, bool bodyKit, bool pushka) - { - Speed = speed; - Weight = weight; - BodyColor = bodyColor; - AdditionalColor = additionalColor; - BodyKit = bodyKit; - Pushka = pushka; - } + /// + /// Скорость + /// + public int Speed { get; private set; } + /// + /// Вес + /// + public double Weight { get; private set; } + /// + /// Основной цвет + /// + public Color BodyColor { get; private set; } + /// + /// Шаг перемещения установки + /// + public double Step => (double)Speed * 100 / Weight; + /// + /// Конструктор с параметрами + /// + /// Скорость + /// Вес установки + /// Основной цвет + public EntityUsta(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; } - + } } - diff --git a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/EntityUstaBat.cs b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/EntityUstaBat.cs new file mode 100644 index 0000000..18fe7e8 --- /dev/null +++ b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/EntityUstaBat.cs @@ -0,0 +1,40 @@ +using System; + +namespace SelfPropelledArtilleryUnit.Entities +{ + /// + /// Класс-сущность "Установка с вооружением" + /// + public class EntityUstaBat : EntityUsta + { + /// + /// Дополнительный цвет (для опциональных элементов) + /// + public Color AdditionalColor { get; private set; } + /// + /// Признак (опция) наличия батареи + /// + public bool BodyKit { get; private set; } + /// + /// Признак (опция) наличия пушки + /// + public bool Pushka { get; private set; } + + /// + /// Инициализация полей объекта-класса установки с вооружением + /// + /// Скорость + /// Вес установки + /// Основной цвет + /// Дополнительный цвет + /// Признак наличия пушки + /// Признак наличия батареи + public EntityUstaBat(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, bool pushka) + : base(speed, weight, bodyColor) + { + AdditionalColor = additionalColor; + BodyKit = bodyKit; + Pushka = pushka; + } + } +} diff --git a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/FormSelfPropelledArtilleryUnit.Designer.cs b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/FormSelfPropelledArtilleryUnit.Designer.cs index a6af2a3..1fad7f0 100644 --- a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/FormSelfPropelledArtilleryUnit.Designer.cs +++ b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/FormSelfPropelledArtilleryUnit.Designer.cs @@ -29,88 +29,123 @@ private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormSelfPropelledArtilleryUnit)); - pictureBoxUsta = new PictureBox(); - buttonCreate = new Button(); - buttonRight = new Button(); - buttonLeft = new Button(); - buttonDown = new Button(); + comboBoxStrategy = new ComboBox(); + ButtonCreateUstaBat = new Button(); + ButtonCreateUsta = new Button(); + ButtonStep = new Button(); buttonUp = new Button(); + buttonDown = new Button(); + buttonLeft = new Button(); + buttonRight = new Button(); + pictureBoxUsta = new PictureBox(); ((System.ComponentModel.ISupportInitialize)pictureBoxUsta).BeginInit(); SuspendLayout(); // + // comboBoxStrategy + // + comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Items.AddRange(new object[] { "MoveToCenter", "MoveToBorder", "-" }); + comboBoxStrategy.Location = new Point(667, 12); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(121, 23); + comboBoxStrategy.TabIndex = 0; + // + // ButtonCreateUstaBat + // + ButtonCreateUstaBat.Location = new Point(19, 393); + ButtonCreateUstaBat.Name = "ButtonCreateUstaBat"; + ButtonCreateUstaBat.Size = new Size(160, 42); + ButtonCreateUstaBat.TabIndex = 1; + ButtonCreateUstaBat.Text = "Создать арт. установку с вооружением"; + ButtonCreateUstaBat.UseVisualStyleBackColor = true; + ButtonCreateUstaBat.Click += ButtonCreateUstaBat_Click; + // + // ButtonCreateUsta + // + ButtonCreateUsta.Location = new Point(185, 393); + ButtonCreateUsta.Name = "ButtonCreateUsta"; + ButtonCreateUsta.Size = new Size(157, 42); + ButtonCreateUsta.TabIndex = 2; + ButtonCreateUsta.Text = "Создать арт. установку"; + ButtonCreateUsta.UseVisualStyleBackColor = true; + ButtonCreateUsta.Click += ButtonCreateUsta_Click; + // + // ButtonStep + // + ButtonStep.Location = new Point(713, 50); + ButtonStep.Name = "ButtonStep"; + ButtonStep.Size = new Size(75, 23); + ButtonStep.TabIndex = 3; + ButtonStep.Text = "Шаг"; + ButtonStep.UseVisualStyleBackColor = true; + ButtonStep.Click += ButtonStep_Click; + // + // buttonUp + // + buttonUp.BackgroundImage = (Image)resources.GetObject("buttonUp.BackgroundImage"); + buttonUp.Location = new Point(617, 314); + buttonUp.Name = "buttonUp"; + buttonUp.Size = new Size(50, 50); + buttonUp.TabIndex = 4; + buttonUp.UseVisualStyleBackColor = true; + buttonUp.Click += ButtonMove_Click; + // + // buttonDown + // + buttonDown.BackgroundImage = (Image)resources.GetObject("buttonDown.BackgroundImage"); + buttonDown.Location = new Point(617, 370); + buttonDown.Name = "buttonDown"; + buttonDown.Size = new Size(50, 50); + buttonDown.TabIndex = 5; + buttonDown.UseVisualStyleBackColor = true; + buttonDown.Click += ButtonMove_Click; + // + // buttonLeft + // + buttonLeft.BackgroundImage = (Image)resources.GetObject("buttonLeft.BackgroundImage"); + buttonLeft.Location = new Point(561, 370); + buttonLeft.Name = "buttonLeft"; + buttonLeft.Size = new Size(50, 50); + buttonLeft.TabIndex = 6; + buttonLeft.UseVisualStyleBackColor = true; + buttonLeft.Click += ButtonMove_Click; + // + // buttonRight + // + buttonRight.BackgroundImage = (Image)resources.GetObject("buttonRight.BackgroundImage"); + buttonRight.Location = new Point(673, 370); + buttonRight.Name = "buttonRight"; + buttonRight.Size = new Size(50, 50); + buttonRight.TabIndex = 7; + buttonRight.UseVisualStyleBackColor = true; + buttonRight.Click += ButtonMove_Click; + // // pictureBoxUsta // pictureBoxUsta.Dock = DockStyle.Fill; pictureBoxUsta.Location = new Point(0, 0); pictureBoxUsta.Name = "pictureBoxUsta"; - pictureBoxUsta.Size = new Size(884, 461); + pictureBoxUsta.Size = new Size(800, 450); pictureBoxUsta.SizeMode = PictureBoxSizeMode.AutoSize; - pictureBoxUsta.TabIndex = 0; + pictureBoxUsta.TabIndex = 8; pictureBoxUsta.TabStop = false; // - // buttonCreate - // - buttonCreate.Location = new Point(22, 417); - buttonCreate.Name = "buttonCreate"; - buttonCreate.Size = new Size(109, 28); - buttonCreate.TabIndex = 8; - buttonCreate.Text = "Создать"; - buttonCreate.UseVisualStyleBackColor = true; - buttonCreate.Click += buttonCreate_Click; - // - // buttonRight - // - buttonRight.BackgroundImage = (Image)resources.GetObject("buttonRight.BackgroundImage"); - buttonRight.Location = new Point(778, 390); - buttonRight.Name = "buttonRight"; - buttonRight.Size = new Size(50, 50); - buttonRight.TabIndex = 12; - buttonRight.UseVisualStyleBackColor = true; - buttonRight.Click += buttonMove_Click; - // - // buttonLeft - // - buttonLeft.BackgroundImage = (Image)resources.GetObject("buttonLeft.BackgroundImage"); - buttonLeft.Location = new Point(666, 390); - buttonLeft.Name = "buttonLeft"; - buttonLeft.Size = new Size(50, 50); - buttonLeft.TabIndex = 11; - buttonLeft.UseVisualStyleBackColor = true; - buttonLeft.Click += buttonMove_Click; - // - // buttonDown - // - buttonDown.BackgroundImage = (Image)resources.GetObject("buttonDown.BackgroundImage"); - buttonDown.Location = new Point(722, 390); - buttonDown.Name = "buttonDown"; - buttonDown.Size = new Size(50, 50); - buttonDown.TabIndex = 10; - buttonDown.UseVisualStyleBackColor = true; - buttonDown.Click += buttonMove_Click; - // - // buttonUp - // - buttonUp.BackgroundImage = (Image)resources.GetObject("buttonUp.BackgroundImage"); - buttonUp.Location = new Point(722, 334); - buttonUp.Name = "buttonUp"; - buttonUp.Size = new Size(50, 50); - buttonUp.TabIndex = 9; - buttonUp.UseVisualStyleBackColor = true; - buttonUp.Click += buttonMove_Click; - // // FormSelfPropelledArtilleryUnit // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(884, 461); + ClientSize = new Size(800, 450); Controls.Add(buttonRight); Controls.Add(buttonLeft); Controls.Add(buttonDown); Controls.Add(buttonUp); - Controls.Add(buttonCreate); + Controls.Add(ButtonStep); + Controls.Add(ButtonCreateUsta); + Controls.Add(ButtonCreateUstaBat); + Controls.Add(comboBoxStrategy); Controls.Add(pictureBoxUsta); Name = "FormSelfPropelledArtilleryUnit"; - StartPosition = FormStartPosition.CenterScreen; Text = "SelfPropelledArtilleryUnit"; ((System.ComponentModel.ISupportInitialize)pictureBoxUsta).EndInit(); ResumeLayout(false); @@ -118,12 +153,14 @@ } #endregion - - private PictureBox pictureBoxUsta; - private Button buttonCreate; - private Button buttonRight; - private Button buttonLeft; - private Button buttonDown; + private ComboBox comboBoxStrategy; + private Button ButtonCreateUstaBat; + private Button ButtonCreateUsta; + private Button ButtonStep; private Button buttonUp; + private Button buttonDown; + private Button buttonLeft; + private Button buttonRight; + private PictureBox pictureBoxUsta; } } \ No newline at end of file diff --git a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/FormSelfPropelledArtilleryUnit.cs b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/FormSelfPropelledArtilleryUnit.cs index 2d5de9e..ea3c4e4 100644 --- a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/FormSelfPropelledArtilleryUnit.cs +++ b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/FormSelfPropelledArtilleryUnit.cs @@ -1,12 +1,31 @@ +using SelfPropelledArtilleryUnit.DrawningObjects; +using SelfPropelledArtilleryUnit.Drawnings; +using SelfPropelledArtilleryUnit.MovementStrategy; namespace SelfPropelledArtilleryUnit { + /// + /// " " + /// public partial class FormSelfPropelledArtilleryUnit : Form { + /// + /// - + /// private DrawningUsta? _drawningUsta; + /// + /// + /// + private AbstractStrategy? _abstractStrategy; + /// + /// + /// public FormSelfPropelledArtilleryUnit() { InitializeComponent(); } + /// + /// + /// private void Draw() { if (_drawningUsta == null) @@ -20,28 +39,48 @@ namespace SelfPropelledArtilleryUnit pictureBoxUsta.Image = bmp; } /// - /// "" + /// " " /// /// /// - - - private void buttonCreate_Click(object sender, EventArgs e) + private void ButtonCreateUstaBat_Click(object sender, EventArgs e) { Random random = new(); - _drawningUsta = new DrawningUsta(); - _drawningUsta.Init(random.Next(100, 300), random.Next(1000, 3000), - Color.FromArgb(30, 89, 69), - 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)), - pictureBoxUsta.Width, - pictureBoxUsta.Height); - _drawningUsta.SetPosition(random.Next(10, 100), random.Next(10, 100)); + _drawningUsta = new DrawningUstaBat(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)), + pictureBoxUsta.Width, pictureBoxUsta.Height); + _drawningUsta.SetPosition(random.Next(10, 100), random.Next(10, + 100)); Draw(); } - - private void buttonMove_Click(object sender, EventArgs e) + /// + /// " " + /// + /// + /// + private void ButtonCreateUsta_Click(object sender, EventArgs e) + { + Random random = new(); + _drawningUsta = new DrawningUsta(random.Next(100, 300), + random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), + random.Next(0, 256)), + pictureBoxUsta.Width, pictureBoxUsta.Height); + _drawningUsta.SetPosition(random.Next(10, 100), random.Next(10, + 100)); + Draw(); + } + /// + /// + /// + /// + /// + private void ButtonMove_Click(object sender, EventArgs e) { if (_drawningUsta == null) { @@ -65,6 +104,48 @@ namespace SelfPropelledArtilleryUnit } Draw(); } + /// + /// "" + /// + /// + /// + private void ButtonStep_Click(object sender, EventArgs e) + { + if (_drawningUsta == null) + { + return; + } + if (comboBoxStrategy.Enabled) + { + _abstractStrategy = comboBoxStrategy.SelectedIndex + switch + { + 0 => new MoveToCenter(), + 1 => new MoveToBorder(), + _ => null, + }; + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.SetData(new + DrawningObjectUsta(_drawningUsta), pictureBoxUsta.Width, + pictureBoxUsta.Height); + comboBoxStrategy.Enabled = false; + } + if (_abstractStrategy != null) + { + _abstractStrategy.MakeStep(); + Draw(); + if (_abstractStrategy.GetStatus() == Status.Finish) + { + comboBoxStrategy.Enabled = true; + _abstractStrategy = null; + } + } + + + } } -} \ No newline at end of file +} diff --git a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/FormSelfPropelledArtilleryUnit.resx b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/FormSelfPropelledArtilleryUnit.resx index b2e6277..4b95a26 100644 --- a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/FormSelfPropelledArtilleryUnit.resx +++ b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/FormSelfPropelledArtilleryUnit.resx @@ -118,19 +118,32 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL - DAAACwwBP0AiyAAAAhhJREFUaEPtmb2KWkEYhmUJaIKEgIUEvInU/qBhQVAQRFKk2GKbXWSbSIqQJneQ - IhdgrsFehLQBscgt5AIEf0DXZGffF84ZJus5o+se43wwDzyFxRm+h/PjGU15PB6Px8Jr+Ba+g+/hSyiO - r/AvVIZ/4A0Uwzk0A1QulzM/f4Ai+Az14PV6Xa1WK9VsNsXFfIF66E6no8h6vVatVsuM+QidJjKESIuJ - DSGSYqwhRErMzhAiIWavEJJUzCv4Df6CU7iCtwn4zxehLYTw0dxoNMyYRz2an8Gf0FzgKPZ6vWDkeJ4S - w3cgfWA2m1WDwUCNx+NEnUwmarPZBOPaOTTmGuqDSqVSsNxpOSSmC/UBlUolWOr0PPYB4GwIiTgzvIIi - cTqEPIjZwMj9jPMhZLFYqEKhEM7Jt+otRISQdrsdzvkdbiEiZDqdqnw+H84ZedM7HzKfz1W5XA5nXMMM - 3MLpkAcRd5A/YETibAhv8Gq1akZcwliuoA4pFovBMqcl4kxcQCsVqEMymYzq9/tqOBwm6mg0UsvlMhjT - ziER5AyOoI45lt1uNxg1nkMjQp5DboJ+wN9wBpcJyD2JDtm1H3lqxDHZe4fIy65Wq5kR1hv7f7NXiOsR - ZGeIhAhiDZESQWJDJEWQyBBpEeQT1CEcfjabOfuItVGGOoSm02lxESHczfHV2wziZ/4FJ44X8A0sBvK1 - yOPxeDxSSaXuAf56EEyW1ZwcAAAAAElFTkSuQmCC + DAAACwwBP0AiyAAAAcJJREFUaEPtmcFKAkEYx+0m9Sz1BguKh6wFL0FdRPRaFEUPUYfoBfTcKxT4BC7a + oc4dos5dXSGa/t8yH0TO1jjr7Iw1P/iBrM433++oVgL/iBg+w3cpvd6FK8Up/IDim/SM3lsJjmEWUa/X + RZIkYjQaZa/pmfQMes0hzCKazaaYTqeCmc1motVqfY05h16SG8GsQsyvEYzPMdoRjI8xC0cwPsUcQaMI + xoeYwhGMy5ilRTAuYpYewZQZYy2CKSPGegRjM6a0CMZGzA7MhsVxLNI0lVfZh+6iO/l+uA2NeYSi0WiU + GsHQnXQ37QAfaCFTXqHo9XpiPB7nOplMjELpDJ1VzWS73S6HvNBCpiSQB/1op9OR6+nTbreVs3KkXYy5 + gaqhc9ZqNbmePnRGNStH2sWYA6gaOmcJIfuwECfwCb7lmMKiITRDNZuku+nrs3WuYdEQmuGcEBJCLBFC + QoglQkgIsUQICSGWCCEhxBJ/JuQKiiiK5Hr60Bk6K2c4h/5uFtVqVQwGAzEcDrXs9/vZGTorZzhnD/JC + ptIM52xB1XKLuAmdswbvoGpBHW8hzfCCDXgJ7yH9fKMjffYCrsNAwE8qlU+yNBGf6frdkAAAAABJRU5E + rkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL + DAAACwwBP0AiyAAAAchJREFUaEPtmLFKM0EURqN1Kn0SMSJxSUjeQQsRUZsEku7HF9BafAF9AZukzANo + GUXtQwStVRLC32S9fneZATET3Z3NzOzKHDggiXPvPaUWPH+UVXgJn+BrTPl3L+AKzATL8AaSpteQZzhn + HaoOTOIadM4OVB2XxG3onGNIxWKRut0u9fv9WHY6negNv4X/eJBrziBVq1VKCr/ht2KGc84h1Wo1cV58 + +A2/FTOc40N8iCF8iA8xhA/xIYbwIT7EED7EhxgiFyH8341T+A7lUqUpQ37yDZ7AJajNIVQNn9FgiPQA + anMFVUNntBDCt2hzC1VDZ2w2m+K8+DQaDeWsOfIt2rxAarfbNBgM5jocDikMQ3FefKbTafRWNVPaarVk + yDMfpMs9pHK5TOPxWKy3B+/k3XwDvOODdAngB6RKpWI1hnfxTt4tbtiCqdiFUUwQBDQajcQqc0wmE6rX + 618jjuBCsBZjMkJiPMZGhMRYjM0IycJjXERIFhbjMkKSOiYLERLtmCxFSBLHZDFCEjsmyxGSX2PyECGZ + G5OnCMkejGJKpRL1er1I/pk/E9+l+mvPJvswivlmCPm7XLEJH+F/4QPcgB5PfigUPgEBKRF/8g21wAAA + AABJRU5ErkJggg== @@ -148,32 +161,19 @@ oAAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL - DAAACwwBP0AiyAAAAchJREFUaEPtmLFKM0EURqN1Kn0SMSJxSUjeQQsRUZsEku7HF9BafAF9AZukzANo - GUXtQwStVRLC32S9fneZATET3Z3NzOzKHDggiXPvPaUWPH+UVXgJn+BrTPl3L+AKzATL8AaSpteQZzhn - HaoOTOIadM4OVB2XxG3onGNIxWKRut0u9fv9WHY6negNv4X/eJBrziBVq1VKCr/ht2KGc84h1Wo1cV58 - +A2/FTOc40N8iCF8iA8xhA/xIYbwIT7EED7EhxgiFyH8341T+A7lUqUpQ37yDZ7AJajNIVQNn9FgiPQA - anMFVUNntBDCt2hzC1VDZ2w2m+K8+DQaDeWsOfIt2rxAarfbNBgM5jocDikMQ3FefKbTafRWNVPaarVk - yDMfpMs9pHK5TOPxWKy3B+/k3XwDvOODdAngB6RKpWI1hnfxTt4tbtiCqdiFUUwQBDQajcQqc0wmE6rX - 618jjuBCsBZjMkJiPMZGhMRYjM0IycJjXERIFhbjMkKSOiYLERLtmCxFSBLHZDFCEjsmyxGSX2PyECGZ - G5OnCMkejGJKpRL1er1I/pk/E9+l+mvPJvswivlmCPm7XLEJH+F/4QPcgB5PfigUPgEBKRF/8g21wAAA - AABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL - DAAACwwBP0AiyAAAAcJJREFUaEPtmcFKAkEYx+0m9Sz1BguKh6wFL0FdRPRaFEUPUYfoBfTcKxT4BC7a - oc4dos5dXSGa/t8yH0TO1jjr7Iw1P/iBrM433++oVgL/iBg+w3cpvd6FK8Up/IDim/SM3lsJjmEWUa/X - RZIkYjQaZa/pmfQMes0hzCKazaaYTqeCmc1motVqfY05h16SG8GsQsyvEYzPMdoRjI8xC0cwPsUcQaMI - xoeYwhGMy5ilRTAuYpYewZQZYy2CKSPGegRjM6a0CMZGzA7MhsVxLNI0lVfZh+6iO/l+uA2NeYSi0WiU - GsHQnXQ37QAfaCFTXqHo9XpiPB7nOplMjELpDJ1VzWS73S6HvNBCpiSQB/1op9OR6+nTbreVs3KkXYy5 - gaqhc9ZqNbmePnRGNStH2sWYA6gaOmcJIfuwECfwCb7lmMKiITRDNZuku+nrs3WuYdEQmuGcEBJCLBFC - QoglQkgIsUQICSGWCCEhxBJ/JuQKiiiK5Hr60Bk6K2c4h/5uFtVqVQwGAzEcDrXs9/vZGTorZzhnD/JC - ptIM52xB1XKLuAmdswbvoGpBHW8hzfCCDXgJ7yH9fKMjffYCrsNAwE8qlU+yNBGf6frdkAAAAABJRU5E - rkJggg== + DAAACwwBP0AiyAAAAhhJREFUaEPtmb2KWkEYhmUJaIKEgIUEvInU/qBhQVAQRFKk2GKbXWSbSIqQJneQ + IhdgrsFehLQBscgt5AIEf0DXZGffF84ZJus5o+se43wwDzyFxRm+h/PjGU15PB6Px8Jr+Ba+g+/hSyiO + r/AvVIZ/4A0Uwzk0A1QulzM/f4Ai+Az14PV6Xa1WK9VsNsXFfIF66E6no8h6vVatVsuM+QidJjKESIuJ + DSGSYqwhRErMzhAiIWavEJJUzCv4Df6CU7iCtwn4zxehLYTw0dxoNMyYRz2an8Gf0FzgKPZ6vWDkeJ4S + w3cgfWA2m1WDwUCNx+NEnUwmarPZBOPaOTTmGuqDSqVSsNxpOSSmC/UBlUolWOr0PPYB4GwIiTgzvIIi + cTqEPIjZwMj9jPMhZLFYqEKhEM7Jt+otRISQdrsdzvkdbiEiZDqdqnw+H84ZedM7HzKfz1W5XA5nXMMM + 3MLpkAcRd5A/YETibAhv8Gq1akZcwliuoA4pFovBMqcl4kxcQCsVqEMymYzq9/tqOBwm6mg0UsvlMhjT + ziER5AyOoI45lt1uNxg1nkMjQp5DboJ+wN9wBpcJyD2JDtm1H3lqxDHZe4fIy65Wq5kR1hv7f7NXiOsR + ZGeIhAhiDZESQWJDJEWQyBBpEeQT1CEcfjabOfuItVGGOoSm02lxESHczfHV2wziZ/4FJ44X8A0sBvK1 + yOPxeDxSSaXuAf56EEyW1ZwcAAAAAElFTkSuQmCC \ No newline at end of file diff --git a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/IMoveableObject.cs b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/IMoveableObject.cs new file mode 100644 index 0000000..58eaa68 --- /dev/null +++ b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/IMoveableObject.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using SelfPropelledArtilleryUnit.Drawnings; +namespace SelfPropelledArtilleryUnit.MovementStrategy +{ + /// + /// Интерфейс для работы с перемещаемым объектом + /// + public interface IMoveableObject + { + /// + /// Получение координаты X объекта + /// + ObjectParameters? GetObjectPosition { get; } + /// + /// Шаг объекта + /// + int GetStep { get; } + /// + /// Проверка, можно ли переместиться по нужному направлению + /// + /// + /// + bool CheckCanMove(DirectionType direction); + /// + /// Изменение направления пермещения объекта + /// + /// Направление + void MoveObject(DirectionType direction); + } +} + diff --git a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/IMoveableObject_Realise.cs b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/IMoveableObject_Realise.cs new file mode 100644 index 0000000..469934f --- /dev/null +++ b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/IMoveableObject_Realise.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using SelfPropelledArtilleryUnit.DrawningObjects; +using SelfPropelledArtilleryUnit.Drawnings; + +namespace SelfPropelledArtilleryUnit.MovementStrategy +{ + /// + /// Реализация интерфейса IDrawningObject для работы с объектом DrawningUsta (паттерн Adapter) +/// + public class DrawningObjectUsta : IMoveableObject + { + private readonly DrawningUsta? _drawningUsta = null; + public DrawningObjectUsta(DrawningUsta drawningUsta) + { + _drawningUsta = drawningUsta; + } + public ObjectParameters? GetObjectPosition + { + get + { + if (_drawningUsta == null || _drawningUsta.EntityUsta == + null) + { + return null; + } + return new ObjectParameters(_drawningUsta.GetPosX, + _drawningUsta.GetPosY, _drawningUsta.GetWidth, _drawningUsta.GetHeight); + } + } + public int GetStep => (int)(_drawningUsta?.EntityUsta?.Step ?? 0); + public bool CheckCanMove(DirectionType direction) => + _drawningUsta?.CanMove(direction) ?? false; + public void MoveObject(DirectionType direction) => + _drawningUsta?.MoveTransport(direction); + } +} diff --git a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/MoveToBorder.cs b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/MoveToBorder.cs new file mode 100644 index 0000000..eb3ebb4 --- /dev/null +++ b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/MoveToBorder.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SelfPropelledArtilleryUnit.MovementStrategy +{ + /// + /// Стратегия перемещения объекта к границе экрана + /// + public class MoveToBorder : AbstractStrategy + { + protected override bool IsTargetDestinaion() + { + var objParams = GetObjectParameters; + if (objParams == null) + { + return false; + } + return objParams.RightBorder <= FieldWidth && + objParams.RightBorder + GetStep() >= FieldWidth && + objParams.DownBorder <= FieldHeight && + objParams.DownBorder + GetStep() >= FieldHeight; + } + + + + + protected override void MoveToTarget() + { + var objParams = GetObjectParameters; + if (objParams == null) + { + return; + } + var diffX = objParams.RightBorder - FieldWidth; + if (Math.Abs(diffX) > GetStep()) + { + MoveRight(); + } + var diffY = objParams.DownBorder - FieldHeight; + if (Math.Abs(diffY) > GetStep()) + { + MoveDown(); + } + } + + + + } +} + diff --git a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/MoveToCenter.cs b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/MoveToCenter.cs new file mode 100644 index 0000000..edc073f --- /dev/null +++ b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/MoveToCenter.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SelfPropelledArtilleryUnit.MovementStrategy +{ + /// + /// Стратегия перемещения объекта в центр экрана + /// + public class MoveToCenter : AbstractStrategy + { + protected override bool IsTargetDestinaion() + { + var objParams = GetObjectParameters; + if (objParams == null) + { + return false; + } + return objParams.ObjectMiddleHorizontal <= FieldWidth / 2 && + objParams.ObjectMiddleHorizontal + GetStep() >= FieldWidth / 2 && + objParams.ObjectMiddleVertical <= FieldHeight / 2 && + objParams.ObjectMiddleVertical + GetStep() >= FieldHeight / 2; + } + protected override void MoveToTarget() + { + var objParams = GetObjectParameters; + if (objParams == null) + { + return; + } + + var diffX = objParams.ObjectMiddleHorizontal - FieldWidth / 2; + var diffY = objParams.ObjectMiddleVertical - FieldHeight / 2; + + // Проверка, чтобы объект не двигался слишком далеко + if (Math.Abs(diffX) > GetStep() || Math.Abs(diffY) > GetStep()) + { + if (Math.Abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + + if (Math.Abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } + } + + } +} + diff --git a/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/ObjectParameters.cs b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/ObjectParameters.cs new file mode 100644 index 0000000..c02860a --- /dev/null +++ b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/ObjectParameters.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SelfPropelledArtilleryUnit.MovementStrategy +{ + /// + /// Параметры-координаты объекта + /// + public class ObjectParameters + { + private readonly int _x; + 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/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/Status.cs b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/Status.cs new file mode 100644 index 0000000..7b57382 --- /dev/null +++ b/SelfPropelledArtilleryUnit/SelfPropelledArtilleryUnit/Status.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SelfPropelledArtilleryUnit.MovementStrategy +{ + /// + /// Статус выполнения операции перемещения + /// + public enum Status + { + NotInit, + InProgress, + Finish + } +}