diff --git a/ProjectWarmlyShip/ProjectWarmlyShip/AbstractStrategy.cs b/ProjectWarmlyShip/ProjectWarmlyShip/AbstractStrategy.cs new file mode 100644 index 0000000..577bca1 --- /dev/null +++ b/ProjectWarmlyShip/ProjectWarmlyShip/AbstractStrategy.cs @@ -0,0 +1,135 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static ProjectWarmlyShip.DirectionType; + +namespace ProjectWarmlyShip.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; + } + } +} \ No newline at end of file diff --git a/ProjectWarmlyShip/ProjectWarmlyShip/Direction.cs b/ProjectWarmlyShip/ProjectWarmlyShip/Direction.cs index f10eac7..6cb4628 100644 --- a/ProjectWarmlyShip/ProjectWarmlyShip/Direction.cs +++ b/ProjectWarmlyShip/ProjectWarmlyShip/Direction.cs @@ -6,8 +6,6 @@ using System.Threading.Tasks; namespace ProjectWarmlyShip { - internal class Direction - { /// /// Направление перемещения /// @@ -30,5 +28,4 @@ namespace ProjectWarmlyShip /// Right = 4 } - } } diff --git a/ProjectWarmlyShip/ProjectWarmlyShip/DrawingWarmlyShip.cs b/ProjectWarmlyShip/ProjectWarmlyShip/DrawingWarmlyShip.cs index cca0b62..3c80d29 100644 --- a/ProjectWarmlyShip/ProjectWarmlyShip/DrawingWarmlyShip.cs +++ b/ProjectWarmlyShip/ProjectWarmlyShip/DrawingWarmlyShip.cs @@ -3,41 +3,14 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -using static ProjectWarmlyShip.Direction; +using static ProjectWarmlyShip.DirectionType; +using ProjectWarmlyShip.Entities; -namespace ProjectWarmlyShip +namespace ProjectWarmlyShip.DrawningObjects { // Класс, отвечающий за прорисовку и перемещение объекта-сущности - internal class DrawingWarmlyShip + public class DrawningWarmlyShip : DrawningShip { - /// - /// Класс-сущность - /// - public EntityWarmlyShip? EntityWarmlyShip { get; private set; } - /// - ///Ширина окна - /// - private int _pictureWidth; - /// - ///Высота окна - /// - private int _pictureHeight; - /// - /// Левая координата прорисовки теплохода - /// - private int _startPosX; - /// - /// Верхняя кооридната прорисовки теплохода - /// - private int _startPosY; - /// - /// Ширина прорисовки теплохода - /// - private int _shipWidth = 200; - /// - /// Высота прорисовки теплохода - /// - private int _shipHeight = 30; /// /// Инициализация свойств /// @@ -49,123 +22,38 @@ namespace ProjectWarmlyShip /// Ширина картинки /// Высота картинки /// true - объект создан, false - проверка не пройдена, нельзя создать объект в этих размерах - public bool Init(int speed, double weight, Color bodyColor, Color additionalColor, bool shipPipes, bool shipFuel, int width, int height) + public DrawningWarmlyShip(int speed, double weight, Color bodyColor, Color additionalColor, bool shipPipes, bool shipFuel, int width, int height) : + base(speed, weight, bodyColor, width, height, 200, 30) { - if (width < _shipWidth || height < _shipHeight) + if (EntityShip != null) { - return false; + EntityShip = new EntityWarmlyShip(speed, weight, bodyColor, additionalColor, shipPipes, shipFuel); } - _pictureWidth = width; - _pictureHeight = height; - EntityWarmlyShip = new EntityWarmlyShip(); - EntityWarmlyShip.Init(speed, weight, bodyColor, additionalColor, shipPipes, shipFuel); - return true; } - /// - /// Установка позиции - /// - /// Координата X - /// Координата Y - public void SetPosition(int x, int y) + public override void DrawTransport(Graphics g) { - if ((x > 0) && (x < _pictureWidth)) _startPosX = x; - else _startPosX = 0; - if ((y > 0) && (y < _pictureHeight)) _startPosY = y; - else _startPosY = 0; - } - /// - /// Изменение направления перемещения - /// - /// Направление - public void MoveTransport(DirectionType direction) - { - if (EntityWarmlyShip == null) + if (EntityShip is not EntityWarmlyShip warmlyShip) { return; } - switch (direction) - { - //влево - case DirectionType.Left: - if (_startPosX - EntityWarmlyShip.Step > 0) - { - _startPosX -= (int)EntityWarmlyShip.Step; - } - else - { - _startPosX = 0; - } - break; - //вверх - case DirectionType.Up: - if (_startPosY - EntityWarmlyShip.Step > 0) - { - _startPosY -= (int)EntityWarmlyShip.Step; - } - else - { - _startPosY = 0; - } - break; - // вправо - case DirectionType.Right: - if (_startPosX + _shipWidth + EntityWarmlyShip.Step < _pictureWidth) - { - _startPosX += (int)EntityWarmlyShip.Step; - } - else - { - _startPosX = _pictureWidth - _shipWidth; - } - break; - //вниз - case DirectionType.Down: - if (_startPosY + _shipHeight + EntityWarmlyShip.Step < _pictureHeight) - { - _startPosY += (int)EntityWarmlyShip.Step; - } - else - { - _startPosY = _pictureHeight - _shipHeight; - } - break; - } - } - /// - /// Прорисовка объекта - /// - /// - public void DrawTransport(Graphics g) - { - if (EntityWarmlyShip == null) - { - return; - } - Pen pen = new(Color.Black); - Brush additionalBrush = new SolidBrush(EntityWarmlyShip.AdditionalColor); - Brush bodyBrush = new SolidBrush(EntityWarmlyShip.BodyColor); - //трубы - if (EntityWarmlyShip.ShipPipes) - { - g.FillRectangle(additionalBrush, _startPosX + 180, _startPosY + 2, 3, 12); - g.FillRectangle(additionalBrush, _startPosX + 185, _startPosY + 4, 5, 10); - } - //границы корабля - Point point1 = new Point(_startPosX, _startPosY + 12); - Point point2 = new Point(_startPosX + 25, _startPosY + 35); - Point point3 = new Point(_startPosX + 175, _startPosY + 35); - Point point4 = new Point(_startPosX + 200, _startPosY + 12); + Brush additionalBrush = new SolidBrush(warmlyShip.AdditionalColor); - Point[] curvePoints1 = { point1, point2, point3, point4 }; - g.FillPolygon(bodyBrush, curvePoints1); - //граница палубы - Brush brAqua = new SolidBrush(Color.Aquamarine); - g.FillRectangle(brAqua, _startPosX + 50, _startPosY + 0, 125, 12); - //топливо - if (EntityWarmlyShip.ShipFuel) + //трубы + if (warmlyShip.ShipPipes) { - g.FillRectangle(additionalBrush, _startPosX + 12, _startPosY + 5, 27, 7); + Brush brBl = new SolidBrush(Color.Black); + g.FillRectangle(brBl, _startPosX + 180, _startPosY + 2, 3, 12); + g.FillRectangle(brBl, _startPosX + 185, _startPosY + 4, 5, 10); } + + //топливо + if (warmlyShip.ShipFuel) + { + Brush bryell = new SolidBrush(Color.Yellow); + g.FillRectangle(bryell, _startPosX + 12, _startPosY + 5, 27, 7); + } + base.DrawTransport(g); } } } + diff --git a/ProjectWarmlyShip/ProjectWarmlyShip/DrawningObjectShip.cs b/ProjectWarmlyShip/ProjectWarmlyShip/DrawningObjectShip.cs new file mode 100644 index 0000000..2d431c2 --- /dev/null +++ b/ProjectWarmlyShip/ProjectWarmlyShip/DrawningObjectShip.cs @@ -0,0 +1,36 @@ +using ProjectWarmlyShip.DrawningObjects; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static ProjectWarmlyShip.DirectionType; + +namespace ProjectWarmlyShip.MovementStrategy +{ + /// + /// Реализация интерфейса IDrawningObject для работы с объектом DrawningShip (паттерн Adapter) + /// + public class DrawningObjectShip : IMoveableObject + { + private readonly DrawningShip? _drawningShip = null; + public DrawningObjectShip(DrawningShip drawningShip) + { + _drawningShip = drawningShip; + } + public ObjectParameters? GetObjectPosition + { + get + { + if (_drawningShip == null || _drawningShip.EntityShip == null) + { + return null; + } + return new ObjectParameters(_drawningShip.GetPosX, _drawningShip.GetPosY, _drawningShip.GetWidth, _drawningShip.GetHeight); + } + } + public int GetStep => (int)(_drawningShip?.EntityShip?.Step ?? 0); + public bool CheckCanMove(DirectionType direction) => _drawningShip?.CanMove(direction) ?? false; + public void MoveObject(DirectionType direction) => _drawningShip?.MoveTransport(direction); + } +} diff --git a/ProjectWarmlyShip/ProjectWarmlyShip/DrawningShip.cs b/ProjectWarmlyShip/ProjectWarmlyShip/DrawningShip.cs new file mode 100644 index 0000000..5dc9241 --- /dev/null +++ b/ProjectWarmlyShip/ProjectWarmlyShip/DrawningShip.cs @@ -0,0 +1,196 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static ProjectWarmlyShip.DirectionType; +using ProjectWarmlyShip.Entities; + +namespace ProjectWarmlyShip.DrawningObjects +{ + /// + /// Класс, отвечающий за прорисовку и перемещение объекта-сущности + /// + public class DrawningShip + { + /// + /// Класс-сущность + /// + public EntityShip? EntityShip { get; protected set; } + /// + /// Ширина окна + /// + private int _pictureWidth; + /// + /// Высота окна + /// + private int _pictureHeight; + /// + /// Левая координата прорисовки автомобиля + /// + protected int _startPosX; + /// + /// Верхняя кооридната прорисовки автомобиля + /// + protected int _startPosY; + /// + /// Ширина прорисовки автомобиля + /// + protected readonly int _shipWidth = 200; + /// + /// Высота прорисовки автомобиля + /// + protected readonly int _shipHeight = 30; + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Ширина картинки + /// Высота картинки + public DrawningShip(int speed, double weight, Color bodyColor, int width, int height) + { + // TODO: Продумать проверки + if (width > _shipWidth && height > _shipHeight) + { + _pictureWidth = width; + _pictureHeight = height; + EntityShip = new EntityShip(speed, weight, bodyColor); + } + } + /// + /// Конструктор + /// + /// Скорость + /// Вес + /// Основной цвет + /// Ширина картинки + /// Высота картинки + /// Ширина прорисовки автомобиля + /// Высота прорисовки автомобиля + protected DrawningShip(int speed, double weight, Color bodyColor, int width, int height, int shipWidth, int shipHeight) + { + // TODO: Продумать проверки + if (width > _shipWidth && height > _shipHeight) + { + _pictureWidth = width; + _pictureHeight = height; + _shipWidth = shipWidth; + _shipHeight = shipHeight; + EntityShip = new EntityShip(speed, weight, bodyColor); + } + } + /// + /// Установка позиции + /// + /// Координата X + /// Координата Y + public void SetPosition(int x, int y) + { + if ((x > 0) && (x < _pictureWidth)) + _startPosX = x; + else _startPosX = 0; + if ((y > 0) && (y < _pictureHeight)) + _startPosY = y; + else _startPosY = 0; + _startPosX = x; + _startPosY = y; + } + /// + /// Координата X объекта + /// + public int GetPosX => _startPosX; + /// + /// Координата Y объекта + /// + public int GetPosY => _startPosY; + /// + /// Ширина объекта + /// + public int GetWidth => _shipWidth; + /// + /// Высота объекта + /// + public int GetHeight => _shipHeight; + /// + /// Проверка, что объект может переместится по указанному направлению + /// + /// Направление + /// true - можно переместится по указанному направлению + public bool CanMove(DirectionType direction) + { + if (EntityShip == null) + { + return false; + } + return direction switch + { + //влево + DirectionType.Left => _startPosX - EntityShip.Step > 0, + //вверх + DirectionType.Up => _startPosY - EntityShip.Step > 0, + // вправо + DirectionType.Right => _startPosX + _shipWidth + EntityShip.Step < _pictureWidth, + //вниз + DirectionType.Down => _startPosY + _shipHeight + EntityShip.Step < _pictureHeight, + }; + } + /// + /// Изменение направления перемещения + /// + /// Направление + public void MoveTransport(DirectionType direction) + { + if (!CanMove(direction) || EntityShip == null) + { + return; + } + switch (direction) + { + //влево + case DirectionType.Left: + _startPosX -= (int)EntityShip.Step; + break; + //вверх + case DirectionType.Up: + _startPosY -= (int)EntityShip.Step; + break; + // вправо + case DirectionType.Right: + _startPosX += (int)EntityShip.Step; + break; + //вниз + case DirectionType.Down: + _startPosY += (int)EntityShip.Step; + break; + } + } + /// + /// Прорисовка объекта + /// + /// + public virtual void DrawTransport(Graphics g) + { + if (EntityShip == null) + { + return; + } + Brush BodyBrush = new SolidBrush(EntityShip.BodyColor); + + //границы корабля + + Point point1 = new Point(_startPosX, _startPosY + 12); + Point point2 = new Point(_startPosX + 25, _startPosY + 35); + Point point3 = new Point(_startPosX + 175, _startPosY + 35); + Point point4 = new Point(_startPosX + 200, _startPosY + 12); + + Point[] curvePoints1 = { point1, point2, point3, point4 }; + g.FillPolygon(BodyBrush, curvePoints1); + + //граница палубы + Brush brBl = new SolidBrush(Color.LightBlue); + g.FillRectangle(brBl, _startPosX + 50, _startPosY + 0, 125, 12); + } + } +} diff --git a/ProjectWarmlyShip/ProjectWarmlyShip/EntityShip.cs b/ProjectWarmlyShip/ProjectWarmlyShip/EntityShip.cs new file mode 100644 index 0000000..a1f5448 --- /dev/null +++ b/ProjectWarmlyShip/ProjectWarmlyShip/EntityShip.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectWarmlyShip.Entities +{ + /// + /// Класс-сущность "Корабль" + /// + public class EntityShip + { + /// + /// Скорость + /// + 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 EntityShip(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + } + } +} diff --git a/ProjectWarmlyShip/ProjectWarmlyShip/EntityWarmlyShip.cs b/ProjectWarmlyShip/ProjectWarmlyShip/EntityWarmlyShip.cs index 61d9294..eab65cc 100644 --- a/ProjectWarmlyShip/ProjectWarmlyShip/EntityWarmlyShip.cs +++ b/ProjectWarmlyShip/ProjectWarmlyShip/EntityWarmlyShip.cs @@ -4,22 +4,10 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace ProjectWarmlyShip +namespace ProjectWarmlyShip.Entities { - internal class EntityWarmlyShip + internal class EntityWarmlyShip : EntityShip { - /// - /// Скорость - /// - public int Speed { get; private set; } - /// - /// Вес - /// - public double Weight { get; private set; } - /// - /// Основной цвет - /// - public Color BodyColor { get; private set; } /// /// Дополнительный цвет (для опциональных элементов) /// @@ -33,10 +21,6 @@ namespace ProjectWarmlyShip /// public bool ShipFuel { get; private set; } /// - /// Шаг перемещения теплохода - /// - public double Step => (double)Speed * 100 / Weight; - /// /// Инициализация полей объекта-класса теплохода /// /// Скорость @@ -45,12 +29,8 @@ namespace ProjectWarmlyShip /// Дополнительный цвет /// Признак наличия труб /// Признак наличия топлива - public void Init(int speed, double weight, Color bodyColor, Color - additionalColor, bool shipPipes, bool shipFuel) + public EntityWarmlyShip(int speed, double weight, Color bodyColor, Color additionalColor, bool shipPipes, bool shipFuel) : base(speed, weight, bodyColor) { - Speed = speed; - Weight = weight; - BodyColor = bodyColor; AdditionalColor = additionalColor; ShipPipes = shipPipes; ShipFuel = shipFuel; diff --git a/ProjectWarmlyShip/ProjectWarmlyShip/FormWarmlyShip.Designer.cs b/ProjectWarmlyShip/ProjectWarmlyShip/FormWarmlyShip.Designer.cs index 3e2dc69..2ca9c89 100644 --- a/ProjectWarmlyShip/ProjectWarmlyShip/FormWarmlyShip.Designer.cs +++ b/ProjectWarmlyShip/ProjectWarmlyShip/FormWarmlyShip.Designer.cs @@ -35,6 +35,9 @@ buttonUp = new Button(); buttonRight = new Button(); buttonDown = new Button(); + buttonCreateDeckShip = new Button(); + comboBoxStrategy = new ComboBox(); + buttonStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxWarmlyShip).BeginInit(); SuspendLayout(); // @@ -51,7 +54,7 @@ // // buttonCreate // - buttonCreate.Location = new Point(12, 415); + buttonCreate.Location = new Point(195, 415); buttonCreate.Name = "buttonCreate"; buttonCreate.Size = new Size(75, 23); buttonCreate.TabIndex = 1; @@ -68,7 +71,7 @@ buttonLeft.Size = new Size(30, 30); buttonLeft.TabIndex = 2; buttonLeft.UseVisualStyleBackColor = true; - buttonLeft.Click += buttonMove_Click; + buttonLeft.Click += ButtonMove_Click; // // buttonUp // @@ -79,7 +82,7 @@ buttonUp.Size = new Size(30, 30); buttonUp.TabIndex = 3; buttonUp.UseVisualStyleBackColor = true; - buttonUp.Click += buttonMove_Click; + buttonUp.Click += ButtonMove_Click; // // buttonRight // @@ -90,7 +93,7 @@ buttonRight.Size = new Size(30, 30); buttonRight.TabIndex = 4; buttonRight.UseVisualStyleBackColor = true; - buttonRight.Click += buttonMove_Click; + buttonRight.Click += ButtonMove_Click; // // buttonDown // @@ -101,13 +104,44 @@ buttonDown.Size = new Size(30, 30); buttonDown.TabIndex = 5; buttonDown.UseVisualStyleBackColor = true; - buttonDown.Click += buttonMove_Click; + buttonDown.Click += ButtonMove_Click; + // + // buttonCreateDeckShip + // + buttonCreateDeckShip.Location = new Point(12, 415); + buttonCreateDeckShip.Name = "buttonCreateDeckShip"; + buttonCreateDeckShip.Size = new Size(177, 23); + buttonCreateDeckShip.TabIndex = 6; + buttonCreateDeckShip.Text = "Создать корабль с обвесами"; + buttonCreateDeckShip.UseVisualStyleBackColor = true; + buttonCreateDeckShip.Click += buttonCreateDeckShip_Click; + // + // comboBoxStrategy + // + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Location = new Point(637, 12); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(151, 23); + comboBoxStrategy.TabIndex = 7; + // + // buttonStep + // + buttonStep.Location = new Point(686, 41); + buttonStep.Name = "buttonStep"; + buttonStep.Size = new Size(75, 23); + buttonStep.TabIndex = 8; + buttonStep.Text = "Шаг"; + buttonStep.UseVisualStyleBackColor = true; + buttonStep.Click += ButtonStep_Click; // // FormWarmlyShip // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(800, 450); + Controls.Add(buttonStep); + Controls.Add(comboBoxStrategy); + Controls.Add(buttonCreateDeckShip); Controls.Add(buttonDown); Controls.Add(buttonRight); Controls.Add(buttonUp); @@ -129,5 +163,8 @@ private Button buttonUp; private Button buttonRight; private Button buttonDown; + private Button buttonCreateDeckShip; + private ComboBox comboBoxStrategy; + private Button buttonStep; } } \ No newline at end of file diff --git a/ProjectWarmlyShip/ProjectWarmlyShip/FormWarmlyShip.cs b/ProjectWarmlyShip/ProjectWarmlyShip/FormWarmlyShip.cs index 3f31547..1035655 100644 --- a/ProjectWarmlyShip/ProjectWarmlyShip/FormWarmlyShip.cs +++ b/ProjectWarmlyShip/ProjectWarmlyShip/FormWarmlyShip.cs @@ -1,4 +1,6 @@ -using static ProjectWarmlyShip.Direction; +using ProjectWarmlyShip.DrawningObjects; +using ProjectWarmlyShip.MovementStrategy; +using static ProjectWarmlyShip.DirectionType; namespace ProjectWarmlyShip { @@ -10,13 +12,19 @@ namespace ProjectWarmlyShip /// /// - /// - private DrawingWarmlyShip? _drawingWarmlyShip; + private DrawningShip? _drawingWarmlyShip; + /// + /// + /// + private AbstractStrategy? _abstractStrategy; /// /// /// public FormWarmlyShip() { InitializeComponent(); + comboBoxStrategy.Items.Add(" "); + comboBoxStrategy.Items.Add(" "); } /// /// @@ -40,8 +48,21 @@ namespace ProjectWarmlyShip private void buttonCreate_Click(object sender, EventArgs e) { Random random = new(); - _drawingWarmlyShip = new DrawingWarmlyShip(); - _drawingWarmlyShip.Init(random.Next(100, 300), random.Next(1000, 3000), + _drawingWarmlyShip = new DrawningShip(random.Next(100, 300), random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), pictureBoxWarmlyShip.Width, pictureBoxWarmlyShip.Height); + + _drawingWarmlyShip.SetPosition(random.Next(10, 100), random.Next(10, 100)); + Draw(); + } + /// + /// " " + /// + /// + /// + private void buttonCreateDeckShip_Click(object sender, EventArgs e) + { + Random random = new(); + _drawingWarmlyShip = new DrawningWarmlyShip(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)), @@ -50,11 +71,11 @@ namespace ProjectWarmlyShip Draw(); } /// - /// + /// /// /// /// - private void buttonMove_Click(object sender, EventArgs e) + private void ButtonMove_Click(object sender, EventArgs e) { if (_drawingWarmlyShip == null) { @@ -78,5 +99,44 @@ namespace ProjectWarmlyShip } Draw(); } + /// + /// "" + /// + /// + /// + private void ButtonStep_Click(object sender, EventArgs e) + { + if (_drawingWarmlyShip == null) + { + return; + } + if (comboBoxStrategy.Enabled) + { + _abstractStrategy = comboBoxStrategy.SelectedIndex + switch + { + 0 => new MoveToCenter(), + 1 => new MoveToBorder(), + + }; + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.SetData(new DrawningObjectShip(_drawingWarmlyShip), pictureBoxWarmlyShip.Width, pictureBoxWarmlyShip.Height); + comboBoxStrategy.Enabled = false; + } + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.MakeStep(); + Draw(); + if (_abstractStrategy.GetStatus() == Status.Finish) + { + comboBoxStrategy.Enabled = true; + _abstractStrategy = null; + } + } } } \ No newline at end of file diff --git a/ProjectWarmlyShip/ProjectWarmlyShip/FormWarmlyShip.resx b/ProjectWarmlyShip/ProjectWarmlyShip/FormWarmlyShip.resx index 6788234..9d790b8 100644 --- a/ProjectWarmlyShip/ProjectWarmlyShip/FormWarmlyShip.resx +++ b/ProjectWarmlyShip/ProjectWarmlyShip/FormWarmlyShip.resx @@ -123,7 +123,7 @@ iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAABGdBTUEAALGPC/xhBQAAAG9QTFRF//// AAAAWVlZ8fHx9PT0REREtLS0Ojo6+Pj4a2trp6enj4+P3t7eXl5efX1919fXh4eHw8PD6+vrdXV10dHR 5ubmDAwMy8vLTU1NlZWVvLy8iIiINjY2nJycFhYWYWFhJycnUVFRHR0dr6+vKioqoesKnwAAAAlwSFlz - AAAOwAAADsABataJCQAAAkFJREFUeF7t3GtT2zAQhWErF5JAnIQQSrmFW///b+wCR6LY/Vg3nqP3+cJE + AAAOvQAADr0BR/uQrQAAAkFJREFUeF7t3GtT2zAQhWErF5JAnIQQSrmFW///b+wCR6LY/Vg3nqP3+cJE O5Nhh1kjrSQ3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMyVQ/Tc02P1J6WuuToUP6dKfPds6VYErXGjFz pfTCRkNWpgtl926uQSeHeMR8WWjUyFcJfpho2MdGmWVuD9PpTyWWPSngYvuqxLKVAi7OlFfxqICLnfIq bhQwseyW4MJsOrP+pcSy1VIRE3fKq7hVwMW98iouFTCxbJVX9mC2Llw/KLFsYlaCl8qruFfAxa3yKsxm @@ -141,7 +141,7 @@ iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAABGdBTUEAALGPC/xhBQAAAG9QTFRF//// AAAAWVlZ8fHx9PT0REREtLS0Ojo6+Pj4a2trp6enj4+P3t7eXl5efX1919fXh4eHw8PD6+vrdXV10dHR 5ubmDAwMy8vLTU1NlZWVvLy8iIiINjY2nJycFhYWYWFhJycnUVFRHR0dr6+vKioqoesKnwAAAAlwSFlz - AAAOwAAADsABataJCQAAA01JREFUeF7t3dluo0AURVHwEGdO7DjznPT/f2PHcAgULsD90FKd0l5P7jKR + AAAOvQAADr0BR/uQrQAAA01JREFUeF7t3dluo0AURVHwEGdO7DjznPT/f2PHcAgULsD90FKd0l5P7jKR 2FF0jYuWXQAAAAAAAAAAAAAAAADA/7JZP643epyls3LnTP/K0GUVWJaX+nd2vhVYlt9aycyV8nautJaV xZvqdt4WWs3JUnG1pVYz0kyZRnbTpp0yjcymzVZZXVs9l4W5okJzPZuDcMo0Mpo2/SnTyGbanCpo36mO MHevnJh7HWMtPmUaOUyblVriVjrK2I1ShtzoOFuvChn2qiNNjU2ZhvW02ShinPHGzfGLGirXF3pQlhfX @@ -163,7 +163,7 @@ iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAABGdBTUEAALGPC/xhBQAAAG9QTFRF//// AAAAWVlZ8fHx9PT0REREtLS0Ojo6+Pj4a2trp6enj4+P3t7eXl5efX1919fXh4eHw8PD6+vrdXV10dHR 5ubmDAwMy8vLTU1NlZWVvLy8iIiINjY2nJycFhYWYWFhJycnUVFRHR0dr6+vKioqoesKnwAAAAlwSFlz - AAAOwAAADsABataJCQAAAipJREFUeF7t3NlS20AQRmEJGzAgL+ybIQTy/s8YOfyawtJtZIWT891QVleB + AAAOvQAADr0BR/uQrQAAAipJREFUeF7t3NlS20AQRmEJGzAgL+ybIQTy/s8YOfyawtJtZIWT891QVleB u6iWZnpmVEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmS9F3N8hOqWdb13WqeT0BP9aebfMa5TYJ1fZ4rNKvk 17rOJZjjpLdzirzjnCa7P+6IxXiU5AJYjN2ttLPKdZAfSa3zwCvGs6TWeV8nwPGS1IqTBDjuk1mxSYDj du+Z0XrADVMX/WJ8axLheExqxVMCHJfJrHhOgKPZJrXOcpEIxqKdCu/Z8orxOakVlwlw9Eep9WMCHM1b @@ -180,7 +180,7 @@ iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAABGdBTUEAALGPC/xhBQAAAG9QTFRF//// AAAAWVlZ8fHx9PT0REREtLS0Ojo6+Pj4a2trp6enj4+P3t7eXl5efX1919fXh4eHw8PD6+vrdXV10dHR 5ubmDAwMy8vLTU1NlZWVvLy8iIiINjY2nJycFhYWYWFhJycnUVFRHR0dr6+vKioqoesKnwAAAAlwSFlz - AAAOwAAADsABataJCQAAA2JJREFUeF7t3dtyolAQheHgIZqTicacMznO+z/jBFgoLRtwLqame9f/XUnj + AAAOvQAADr0BR/uQrQAAA2JJREFUeF7t3dtyolAQheHgIZqTicacMznO+z/jBFgoLRtwLqame9f/XUnj xV6W1UBTBScAAAAAAAAAAAAAAAAA8K/MtqfbqT5n6fytKIq3c21l6OInX+lC29m5VMCiuFYlNzfKVxQr VXIzUb6imKiSGxLGR8L4SBgfCeMjYXwkjI+E8ZEwPhLGR8L4SBgfCeMjYXwkjI+E8ZEwPhLGR8L4SBgf CeMjYXwkjI+E8ZEwPhLGR8L4SBgfCeMjYXwkjI+E8ZEwPhLGR8L4SBgfCeMjYXwkjI+E8ZEwPhK6d7ea diff --git a/ProjectWarmlyShip/ProjectWarmlyShip/IMoveableobject.cs b/ProjectWarmlyShip/ProjectWarmlyShip/IMoveableobject.cs new file mode 100644 index 0000000..af0246d --- /dev/null +++ b/ProjectWarmlyShip/ProjectWarmlyShip/IMoveableobject.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static ProjectWarmlyShip.DirectionType; + +namespace ProjectWarmlyShip.MovementStrategy +{ + /// + /// Интерфейс для работы с перемещаемым объектом + /// + public interface IMoveableObject + { + /// + /// Получение координаты X объекта + /// + ObjectParameters? GetObjectPosition { get; } + /// + /// Шаг объекта + /// + int GetStep { get; } + /// + /// Проверка, можно ли переместиться по нужному направлению + /// + /// + /// + bool CheckCanMove(DirectionType direction); + /// + /// Изменение направления пермещения объекта + /// + /// Направление + void MoveObject(DirectionType direction); + } +} diff --git a/ProjectWarmlyShip/ProjectWarmlyShip/MoveToBorder.cs b/ProjectWarmlyShip/ProjectWarmlyShip/MoveToBorder.cs new file mode 100644 index 0000000..cf1afe9 --- /dev/null +++ b/ProjectWarmlyShip/ProjectWarmlyShip/MoveToBorder.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectWarmlyShip.MovementStrategy +{ + /// + /// Стратегия перемещения объекта в центр экрана + /// + public class MoveToBorder : AbstractStrategy + { + protected override bool IsTargetDestinaion() + { + var objParams = GetObjectParameters; + if (objParams == null) + { + return false; + } + return objParams.ObjectRightBorder <= FieldWidth && + objParams.ObjectRightBorder + GetStep() >= FieldWidth && + objParams.ObjectDownBorder <= FieldHeight && + objParams.ObjectDownBorder + GetStep() >= FieldHeight; + } + protected override void MoveToTarget() + { + var objParams = GetObjectParameters; + if (objParams == null) + { + return; + } + var diffX = objParams.ObjectRightBorder - FieldWidth; + if (Math.Abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + var diffY = objParams.ObjectDownBorder - FieldHeight; + if (Math.Abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } + } +} diff --git a/ProjectWarmlyShip/ProjectWarmlyShip/MoveToCenter.cs b/ProjectWarmlyShip/ProjectWarmlyShip/MoveToCenter.cs new file mode 100644 index 0000000..ebbb669 --- /dev/null +++ b/ProjectWarmlyShip/ProjectWarmlyShip/MoveToCenter.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectWarmlyShip.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; + if (Math.Abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + var diffY = objParams.ObjectMiddleVertical - FieldHeight / 2; + if (Math.Abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } + } +} diff --git a/ProjectWarmlyShip/ProjectWarmlyShip/Objectparametrs.cs b/ProjectWarmlyShip/ProjectWarmlyShip/Objectparametrs.cs new file mode 100644 index 0000000..ce03e19 --- /dev/null +++ b/ProjectWarmlyShip/ProjectWarmlyShip/Objectparametrs.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectWarmlyShip.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; + /// + /// Правая граница + /// + public int ObjectRightBorder => _x + _width; + /// + /// Нижняя граница + /// + public int ObjectDownBorder => _y + _height; + /// + /// Конструктор + /// + /// Координата X + /// Координата Y + /// Ширина + /// Высота + public ObjectParameters(int x, int y, int width, int height) + { + _x = x; + _y = y; + _width = width; + _height = height; + } + } +} diff --git a/ProjectWarmlyShip/ProjectWarmlyShip/Status.cs b/ProjectWarmlyShip/ProjectWarmlyShip/Status.cs new file mode 100644 index 0000000..4f50869 --- /dev/null +++ b/ProjectWarmlyShip/ProjectWarmlyShip/Status.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectWarmlyShip.MovementStrategy +{ + public enum Status + { + NotInit, InProgress, Finish + } +}