diff --git a/Sailboat/Sailboat/AbstractStrategy.cs b/Sailboat/Sailboat/AbstractStrategy.cs new file mode 100644 index 0000000..fc58dd3 --- /dev/null +++ b/Sailboat/Sailboat/AbstractStrategy.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Sailboat.DrawingObjects; +namespace Sailboat.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/Sailboat/Sailboat/DrawingBoat.cs b/Sailboat/Sailboat/DrawingBoat.cs new file mode 100644 index 0000000..3f1e6a4 --- /dev/null +++ b/Sailboat/Sailboat/DrawingBoat.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Sailboat.Entities; + +namespace Sailboat.DrawingObjects +{ + public class DrawingBoat + { + public EntityBoat? EntityBoat { get; protected set; } + private int _pictureWidth; + private int _pictureHeight; + protected int _startPosX; + protected int _startPosY; + private readonly int _boatWidth = 160; + private readonly int _boatHeight = 160; + public int GetPosX => _startPosX; + public int GetPosY => _startPosY; + public int GetWidth => _boatWidth; + public int GetHeight => _boatHeight; + + + public DrawingBoat(int speed, double weight, Color bodyColor, int width, int height) + { + if (width < _boatWidth || height < _boatHeight) + { + return; + } + _pictureWidth = width; + _pictureHeight = height; + EntityBoat = new EntityBoat(speed, weight, bodyColor); + } + + protected DrawingBoat(int speed, double weight, Color bodyColor, int width, int height, int boatWidth, int boatHeight) + { + if (width < _boatWidth || height < _boatHeight) + { + return; + } + _pictureWidth = width; + _pictureHeight = height; + _boatWidth = boatWidth; + _boatHeight = boatHeight; + EntityBoat = new EntityBoat(speed, weight, bodyColor); + } + public void SetPosition(int x, int y) + { + if (x < 0 || x + _boatWidth > _pictureWidth) + { + x = 0; + } + if (y < 0 || y + _boatHeight > _pictureHeight) + { + y = 0; + } + _startPosX = x; + _startPosY = y; + } + public bool CanMove(DirectionType direction) + { + if (EntityBoat == null) + { + return false; + } + return direction switch + { + //влево + DirectionType.Left => _startPosX - EntityBoat.Step > 0, + //вверх + DirectionType.Up => _startPosY - EntityBoat.Step > 0, + // вправо + DirectionType.Right => _startPosX + EntityBoat.Step < _pictureWidth, + //вниз + DirectionType.Down => _startPosY + EntityBoat.Step < _pictureHeight, + }; + } + public void MoveTransport(DirectionType direction) + { + if (EntityBoat == null) + { + return; + } + switch (direction) + { + case DirectionType.Left: + if (_startPosX - EntityBoat.Step > 0) + { + _startPosX -= (int)EntityBoat.Step; + } + break; + case DirectionType.Up: + if ((_startPosY - 15) - EntityBoat.Step > 0) + { + _startPosY -= (int)EntityBoat.Step; + } + break; + case DirectionType.Right: + if (_startPosX + EntityBoat.Step + _boatWidth < _pictureWidth) + { + _startPosX += (int)EntityBoat.Step; + } + break; + case DirectionType.Down: + if (_startPosY + EntityBoat.Step + _boatHeight < _pictureHeight) + { + _startPosY += (int)EntityBoat.Step; + } + break; + } + } + public virtual void DrawTransport(Graphics g) + { + if (EntityBoat == null) + { + return; + } + Pen pen = new(Color.Black); + + //Основной корпус лодки + Brush Brush = new + SolidBrush(EntityBoat.BodyColor); + + Point[] hull = new Point[] + { + new Point(_startPosX + 10, _startPosY + 90), + new Point(_startPosX + 110, _startPosY + 90), + new Point(_startPosX + 140, _startPosY + 120), + new Point(_startPosX + 110, _startPosY + 150), + new Point(_startPosX + 10, _startPosY + 150) + }; + g.FillPolygon(Brush, hull); + g.DrawPolygon(pen, hull); + + Brush addBrush = new + SolidBrush(Color.Aqua); + + //Каюта лодки + g.FillEllipse(addBrush, _startPosX + 20, _startPosY + 100, 90, 40); + g.DrawEllipse(pen, _startPosX + 20, _startPosY + 100, 90, 40); + } + } +} diff --git a/Sailboat/Sailboat/DrawingObjectBoat.cs b/Sailboat/Sailboat/DrawingObjectBoat.cs new file mode 100644 index 0000000..6c7f211 --- /dev/null +++ b/Sailboat/Sailboat/DrawingObjectBoat.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Sailboat.DrawingObjects; + +namespace Sailboat.MovementStrategy +{ + public class DrawingObjectBoat : IMoveableObject + { + private readonly DrawingBoat? _drawingBoat = null; + public DrawingObjectBoat(DrawingBoat drawingBoat) + { + _drawingBoat = drawingBoat; + } + public ObjectParameters? GetObjectPosition + { + get + { + if (_drawingBoat == null || _drawingBoat.EntityBoat == + null) + { + return null; + } + return new ObjectParameters(_drawingBoat.GetPosX, _drawingBoat.GetPosY, _drawingBoat.GetWidth, _drawingBoat.GetHeight); + } + } + public int GetStep => (int)(_drawingBoat?.EntityBoat?.Step ?? 0); + public bool CheckCanMove(DirectionType direction) => + _drawingBoat?.CanMove(direction) ?? false; + public void MoveObject(DirectionType direction) => + _drawingBoat?.MoveTransport(direction); + + } +} diff --git a/Sailboat/Sailboat/DrawingSailboat.cs b/Sailboat/Sailboat/DrawingSailboat.cs index 1a40654..9afe44e 100644 --- a/Sailboat/Sailboat/DrawingSailboat.cs +++ b/Sailboat/Sailboat/DrawingSailboat.cs @@ -2,92 +2,36 @@ using System.Collections.Generic; using System.Drawing; using System.Linq; -using System.Reflection; using System.Text; using System.Threading.Tasks; -namespace Sailboat -{ - public class DrawingSailboat - { - public EntitySailboat? EntitySailboat { get; private set; } - private int _pictureWidth; - private int _pictureHeight; - private int _startPosX; - private int _startPosY; - private readonly int _boatWidth = 160; - private readonly int _boatHeight = 160; - public bool Init(int speed, double weight, Color bodyColor, Color additionalColor, bool hull, bool sail, int width, int height) - { - if (width < _boatWidth || height < _boatHeight) - { - return false; - } - _pictureWidth = width; - _pictureHeight = height; - EntitySailboat = new EntitySailboat(); - EntitySailboat.Init(speed, weight, bodyColor, additionalColor, hull, sail); - return true; - } - public void SetPosition(int x, int y) - { - if (x < 0 || x + _boatWidth > _pictureWidth) - { - x = 0; - } - if (y < 0 || y + _boatHeight > _pictureHeight) - { - y = 0; - } - _startPosX = x; - _startPosY = y; - } - public void MoveTransport(DirectionType direction) - { - if (EntitySailboat == null) - { - return; - } - switch (direction) - { - case DirectionType.Left: - if (_startPosX - EntitySailboat.Step > 0) - { - _startPosX -= (int)EntitySailboat.Step; - } - break; - case DirectionType.Up: - if ((_startPosY - 15) - EntitySailboat.Step > 0) - { - _startPosY-= (int)EntitySailboat.Step; - } - break; - case DirectionType.Right: - if (_startPosX + EntitySailboat.Step + _boatWidth < _pictureWidth) - { - _startPosX += (int)EntitySailboat.Step; - } - break; - case DirectionType.Down: - if (_startPosY + EntitySailboat.Step + _boatHeight < _pictureHeight) - { - _startPosY += (int)EntitySailboat.Step; - } - break; - } - } - public void DrawTransport(Graphics g) - { - if (EntitySailboat == null) - { - return; - } - Pen pen = new(Color.Black, 4); - Brush additionalBrush = new - SolidBrush(EntitySailboat.AdditionalColor); +using Sailboat.Entities; - //Усиленный корпус парусной лодки - if (EntitySailboat.Hull) +namespace Sailboat.DrawingObjects +{ + public class DrawingSailboat : DrawingBoat + { + public DrawingSailboat(int speed, double weight, Color bodyColor, Color additionalColor, bool hull, bool sail, int width, int height) : + base(speed, weight, bodyColor, width, height, 160, 160) + { + if (EntityBoat != null) + { + EntityBoat = new EntitySailboat(speed, weight, bodyColor, + additionalColor, hull, sail); + } + } + public override void DrawTransport(Graphics g) + { + if (EntityBoat is not EntitySailboat sailboat) + { + return; + } + Pen pen = new(Color.Black); + Brush additionalBrush = new + SolidBrush(sailboat.AdditionalColor); + + //усиленный корпус парусной лодки + if (sailboat.Hull) { Point[] hullCooler = new Point[] { @@ -100,34 +44,13 @@ namespace Sailboat g.FillPolygon(additionalBrush, hullCooler); g.DrawPolygon(pen, hullCooler); } - - //Основной корпус парусной лодки - Brush Brush = new - SolidBrush(EntitySailboat.BodyColor); - - Point[] hull = new Point[] - { - new Point(_startPosX + 10, _startPosY + 90), - new Point(_startPosX + 110, _startPosY + 90), - new Point(_startPosX + 140, _startPosY + 120), - new Point(_startPosX + 110, _startPosY + 150), - new Point(_startPosX + 10, _startPosY + 150) - }; - g.FillPolygon(Brush, hull); - g.DrawPolygon(pen, hull); - - Brush addBrush = new - SolidBrush(Color.Aqua); - - //Каюта парусной лодки - g.FillEllipse(addBrush, _startPosX + 20, _startPosY + 100, 90, 40); - g.DrawEllipse(pen, _startPosX + 20, _startPosY + 100, 90, 40); + base.DrawTransport(g); //Парус с флагом - if (EntitySailboat.Sail) + if (sailboat.Sail) { Brush sailBrush = new - SolidBrush(EntitySailboat.AdditionalColor); + SolidBrush(sailboat.AdditionalColor); Point[] sail = new Point[] { @@ -138,11 +61,12 @@ namespace Sailboat g.FillPolygon(sailBrush, sail); g.DrawPolygon(pen, sail); //Флаг + Brush addBrush = new + SolidBrush(Color.Aqua); Brush flagBrush = new - SolidBrush(EntitySailboat.AdditionalColor); + SolidBrush(sailboat.AdditionalColor); Point[] flag = new Point[] { - //new Point(_startPosX + 65, _startPosY + 125), new Point(_startPosX + 65, _startPosY - 15), new Point(_startPosX + 65, _startPosY + 10), new Point(_startPosX + 20, _startPosY + 10), @@ -151,9 +75,7 @@ namespace Sailboat g.FillPolygon(addBrush, flag); g.DrawPolygon(pen, flag); g.DrawLine(pen, new Point(_startPosX + 65, _startPosY + 130), new Point(_startPosX + 65, _startPosY - 15)); - - } } } -} \ No newline at end of file +} diff --git a/Sailboat/Sailboat/EntityBoat.cs b/Sailboat/Sailboat/EntityBoat.cs new file mode 100644 index 0000000..6f1da8a --- /dev/null +++ b/Sailboat/Sailboat/EntityBoat.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Sailboat.Entities +{ + public class EntityBoat + { + 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 EntityBoat(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + } + } +} diff --git a/Sailboat/Sailboat/EntitySailboat.cs b/Sailboat/Sailboat/EntitySailboat.cs index 6514ebd..aff4b68 100644 --- a/Sailboat/Sailboat/EntitySailboat.cs +++ b/Sailboat/Sailboat/EntitySailboat.cs @@ -4,53 +4,16 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Sailboat +namespace Sailboat.Entities { - public class EntitySailboat + public class EntitySailboat : EntityBoat { - /// - /// Скорость - /// - 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 Hull { get; private set; } - /// - /// Признак (опция) наличия паруса с флагом - /// public bool Sail { get; private set; } - /// - /// Шаг перемещения парусной лодки - /// - public double Step => (double)Speed * 100 / Weight; - /// - /// Инициализация полей объекта-класса парусной лодки - /// - /// Скорость - /// Вес парусной лодки - /// Основной цвет - /// Дополнительный цвет - /// Признак наличия усиленного корпуса - /// Признак наличия паруса с флагом - public void Init(int speed, double weight, Color bodyColor, Color - additionalColor, bool hull, bool sail) + public EntitySailboat(int speed, double weight, Color bodyColor, Color + additionalColor, bool hull, bool sail) : base (speed, weight, bodyColor) { - Speed = speed; - Weight = weight; - BodyColor = bodyColor; AdditionalColor = additionalColor; Hull = hull; Sail = sail; diff --git a/Sailboat/Sailboat/Form1.Designer.cs b/Sailboat/Sailboat/Form1.Designer.cs deleted file mode 100644 index dede0e6..0000000 --- a/Sailboat/Sailboat/Form1.Designer.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace Sailboat -{ - partial class Form1 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); - this.Text = "Form1"; - } - - #endregion - } -} \ No newline at end of file diff --git a/Sailboat/Sailboat/Form1.cs b/Sailboat/Sailboat/Form1.cs deleted file mode 100644 index 224bdaa..0000000 --- a/Sailboat/Sailboat/Form1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Sailboat -{ - public partial class Form1 : Form - { - public Form1() - { - InitializeComponent(); - } - } -} \ No newline at end of file diff --git a/Sailboat/Sailboat/Form1.resx b/Sailboat/Sailboat/Form1.resx deleted file mode 100644 index 1af7de1..0000000 --- a/Sailboat/Sailboat/Form1.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Sailboat/Sailboat/FormSailboat.Designer.cs b/Sailboat/Sailboat/FormSailboat.Designer.cs index 8acd590..ef0450e 100644 --- a/Sailboat/Sailboat/FormSailboat.Designer.cs +++ b/Sailboat/Sailboat/FormSailboat.Designer.cs @@ -30,11 +30,14 @@ { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormSailboat)); pictureBoxSailboat = new PictureBox(); - buttonCreate = new Button(); + buttonCreateBoat = new Button(); buttonLeft = new Button(); buttonUp = new Button(); buttonRight = new Button(); buttonDown = new Button(); + buttonCreateSailboat = new Button(); + comboBoxStrategy = new ComboBox(); + buttonStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxSailboat).BeginInit(); SuspendLayout(); // @@ -44,28 +47,29 @@ pictureBoxSailboat.Location = new Point(0, 0); pictureBoxSailboat.Margin = new Padding(3, 2, 3, 2); pictureBoxSailboat.Name = "pictureBoxSailboat"; - pictureBoxSailboat.Size = new Size(884, 461); + pictureBoxSailboat.Size = new Size(834, 461); + pictureBoxSailboat.SizeMode = PictureBoxSizeMode.AutoSize; pictureBoxSailboat.TabIndex = 0; pictureBoxSailboat.TabStop = false; // - // buttonCreate + // buttonCreateBoat // - buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - buttonCreate.Location = new Point(10, 417); - buttonCreate.Margin = new Padding(3, 2, 3, 2); - buttonCreate.Name = "buttonCreate"; - buttonCreate.Size = new Size(111, 30); - buttonCreate.TabIndex = 1; - buttonCreate.Text = "Создать"; - buttonCreate.UseVisualStyleBackColor = true; - buttonCreate.Click += buttonCreate_Click; + buttonCreateBoat.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateBoat.Location = new Point(12, 408); + buttonCreateBoat.Margin = new Padding(3, 2, 3, 2); + buttonCreateBoat.Name = "buttonCreateBoat"; + buttonCreateBoat.Size = new Size(111, 42); + buttonCreateBoat.TabIndex = 1; + buttonCreateBoat.Text = "Создать лодку"; + buttonCreateBoat.UseVisualStyleBackColor = true; + buttonCreateBoat.Click += buttonCreateBoat_Click; // // buttonLeft // buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonLeft.BackgroundImage = (Image)resources.GetObject("buttonLeft.BackgroundImage"); buttonLeft.BackgroundImageLayout = ImageLayout.Zoom; - buttonLeft.Location = new Point(740, 423); + buttonLeft.Location = new Point(673, 420); buttonLeft.Margin = new Padding(3, 2, 3, 2); buttonLeft.Name = "buttonLeft"; buttonLeft.Size = new Size(30, 30); @@ -78,7 +82,7 @@ buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonUp.BackgroundImage = (Image)resources.GetObject("buttonUp.BackgroundImage"); buttonUp.BackgroundImageLayout = ImageLayout.Zoom; - buttonUp.Location = new Point(776, 389); + buttonUp.Location = new Point(716, 386); buttonUp.Margin = new Padding(3, 2, 3, 2); buttonUp.Name = "buttonUp"; buttonUp.Size = new Size(30, 30); @@ -91,7 +95,7 @@ buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonRight.BackgroundImage = (Image)resources.GetObject("buttonRight.BackgroundImage"); buttonRight.BackgroundImageLayout = ImageLayout.Zoom; - buttonRight.Location = new Point(812, 423); + buttonRight.Location = new Point(760, 420); buttonRight.Margin = new Padding(3, 2, 3, 2); buttonRight.Name = "buttonRight"; buttonRight.Size = new Size(30, 30); @@ -104,7 +108,7 @@ buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; buttonDown.BackgroundImage = (Image)resources.GetObject("buttonDown.BackgroundImage"); buttonDown.BackgroundImageLayout = ImageLayout.Zoom; - buttonDown.Location = new Point(776, 423); + buttonDown.Location = new Point(716, 420); buttonDown.Margin = new Padding(3, 2, 3, 2); buttonDown.Name = "buttonDown"; buttonDown.Size = new Size(30, 30); @@ -112,33 +116,76 @@ buttonDown.UseVisualStyleBackColor = true; buttonDown.Click += buttonMove_Click; // + // buttonCreateSailboat + // + buttonCreateSailboat.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateSailboat.Location = new Point(145, 408); + buttonCreateSailboat.Margin = new Padding(3, 2, 3, 2); + buttonCreateSailboat.Name = "buttonCreateSailboat"; + buttonCreateSailboat.Size = new Size(111, 42); + buttonCreateSailboat.TabIndex = 6; + buttonCreateSailboat.Text = "Создать парусник"; + buttonCreateSailboat.UseVisualStyleBackColor = true; + buttonCreateSailboat.Click += buttonCreateSailboat_Click; + // + // comboBoxStrategy + // + comboBoxStrategy.Anchor = AnchorStyles.Top | AnchorStyles.Right; + comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Items.AddRange(new object[] { "До центра", "До края" }); + comboBoxStrategy.Location = new Point(701, 0); + comboBoxStrategy.Margin = new Padding(3, 2, 3, 2); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(133, 23); + comboBoxStrategy.TabIndex = 7; + // + // buttonStep + // + buttonStep.Anchor = AnchorStyles.Top | AnchorStyles.Right; + buttonStep.Location = new Point(701, 27); + buttonStep.Margin = new Padding(3, 2, 3, 2); + buttonStep.Name = "buttonStep"; + buttonStep.Size = new Size(133, 23); + buttonStep.TabIndex = 8; + buttonStep.Text = "Шаг"; + buttonStep.UseVisualStyleBackColor = true; + buttonStep.Click += buttonStep_Click; + // // FormSailboat // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(884, 461); + ClientSize = new Size(834, 461); + Controls.Add(buttonStep); + Controls.Add(comboBoxStrategy); + Controls.Add(buttonCreateSailboat); Controls.Add(buttonDown); Controls.Add(buttonRight); Controls.Add(buttonUp); Controls.Add(buttonLeft); - Controls.Add(buttonCreate); + Controls.Add(buttonCreateBoat); Controls.Add(pictureBoxSailboat); Margin = new Padding(3, 2, 3, 2); Name = "FormSailboat"; - StartPosition = FormStartPosition.CenterParent; - Text = "Sailboat"; + StartPosition = FormStartPosition.CenterScreen; + Text = "Парусник"; Load += FormSailboat_Load; ((System.ComponentModel.ISupportInitialize)pictureBoxSailboat).EndInit(); ResumeLayout(false); + PerformLayout(); } #endregion private PictureBox pictureBoxSailboat; - private Button buttonCreate; + private Button buttonCreateBoat; private Button buttonLeft; private Button buttonUp; private Button buttonRight; private Button buttonDown; + private Button buttonCreateSailboat; + private ComboBox comboBoxStrategy; + private Button buttonStep; } } \ No newline at end of file diff --git a/Sailboat/Sailboat/FormSailboat.cs b/Sailboat/Sailboat/FormSailboat.cs index 50e8592..691d09b 100644 --- a/Sailboat/Sailboat/FormSailboat.cs +++ b/Sailboat/Sailboat/FormSailboat.cs @@ -1,37 +1,49 @@ +using Sailboat.Entities; +using Sailboat.DrawingObjects; +using Sailboat.MovementStrategy; + namespace Sailboat { public partial class FormSailboat : Form { - private DrawingSailboat? _drawingSailboat; + private DrawingBoat? _drawingBoat; + private AbstractStrategy? _abstractStrategy; public FormSailboat() { InitializeComponent(); } private void Draw() { - if (_drawingSailboat == null) + if (_drawingBoat == null) { return; } Bitmap bmp = new(pictureBoxSailboat.Width, pictureBoxSailboat.Height); Graphics gr = Graphics.FromImage(bmp); - _drawingSailboat.DrawTransport(gr); + _drawingBoat.DrawTransport(gr); pictureBoxSailboat.Image = bmp; } - private void buttonCreate_Click(object sender, EventArgs e) + private void buttonCreateBoat_Click(object sender, EventArgs e) { Random random = new(); - _drawingSailboat = new DrawingSailboat(); - _drawingSailboat.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)), + _drawingBoat = new DrawingBoat(random.Next(100, 300), random.Next(1000, 3000), Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), pictureBoxSailboat.Width, pictureBoxSailboat.Height); + _drawingBoat.SetPosition(random.Next(10, 100), random.Next(10, + 100)); + Draw(); + } + private void buttonCreateSailboat_Click(object sender, EventArgs e) + { + Random random = new(); + _drawingBoat = new DrawingSailboat(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)), pictureBoxSailboat.Width, pictureBoxSailboat.Height); - _drawingSailboat.SetPosition(random.Next(10, 100), random.Next(10, 100)); + _drawingBoat.SetPosition(random.Next(10, 100), random.Next(10, 100)); Draw(); } private void buttonMove_Click(object sender, EventArgs e) { - if (_drawingSailboat == null) + if (_drawingBoat == null) { return; } @@ -39,20 +51,54 @@ namespace Sailboat switch (name) { case "buttonUp": - _drawingSailboat.MoveTransport(DirectionType.Up); + _drawingBoat.MoveTransport(DirectionType.Up); break; case "buttonDown": - _drawingSailboat.MoveTransport(DirectionType.Down); + _drawingBoat.MoveTransport(DirectionType.Down); break; case "buttonLeft": - _drawingSailboat.MoveTransport(DirectionType.Left); + _drawingBoat.MoveTransport(DirectionType.Left); break; case "buttonRight": - _drawingSailboat.MoveTransport(DirectionType.Right); + _drawingBoat.MoveTransport(DirectionType.Right); break; } Draw(); - + } + private void buttonStep_Click(object sender, EventArgs e) + { + if (_drawingBoat == null) + { + return; + } + if (comboBoxStrategy.Enabled) + { + _abstractStrategy = comboBoxStrategy.SelectedIndex + switch + { + 0 => new MoveToCenter(), + 1 => new MoveToBorder(), + _ => null, + }; + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.SetData(new DrawingObjectBoat(_drawingBoat), pictureBoxSailboat.Width, + pictureBoxSailboat.Height); + comboBoxStrategy.Enabled = false; + } + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.MakeStep(); + Draw(); + if (_abstractStrategy.GetStatus() == Status.Finish) + { + comboBoxStrategy.Enabled = true; + _abstractStrategy = null; + } } private void FormSailboat_Load(object sender, EventArgs e) diff --git a/Sailboat/Sailboat/IMoveableObject.cs b/Sailboat/Sailboat/IMoveableObject.cs new file mode 100644 index 0000000..6990729 --- /dev/null +++ b/Sailboat/Sailboat/IMoveableObject.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Sailboat.DrawingObjects; + +namespace Sailboat.MovementStrategy +{ + public interface IMoveableObject + { + /// + /// Получение координаты X объекта + /// + ObjectParameters? GetObjectPosition { get; } + /// + /// Шаг объекта + /// + int GetStep { get; } + /// + /// Проверка, можно ли переместиться по нужному направлению + /// + /// + /// + bool CheckCanMove(DirectionType direction); + /// + /// Изменение направления пермещения объекта + /// + /// Направление + void MoveObject(DirectionType direction); + } +} diff --git a/Sailboat/Sailboat/MoveToBorder.cs b/Sailboat/Sailboat/MoveToBorder.cs new file mode 100644 index 0000000..9e83e4a --- /dev/null +++ b/Sailboat/Sailboat/MoveToBorder.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Sailboat.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()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + var diffY = objParams.DownBorder - FieldHeight; + if (Math.Abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } + } +} diff --git a/Sailboat/Sailboat/MoveToCenter.cs b/Sailboat/Sailboat/MoveToCenter.cs new file mode 100644 index 0000000..a3392ee --- /dev/null +++ b/Sailboat/Sailboat/MoveToCenter.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Sailboat.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/Sailboat/Sailboat/ObjectParameters.cs b/Sailboat/Sailboat/ObjectParameters.cs new file mode 100644 index 0000000..f3a5888 --- /dev/null +++ b/Sailboat/Sailboat/ObjectParameters.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Sailboat.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/Sailboat/Sailboat/Status.cs b/Sailboat/Sailboat/Status.cs new file mode 100644 index 0000000..3d1bc4d --- /dev/null +++ b/Sailboat/Sailboat/Status.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Sailboat.MovementStrategy +{ + /// + /// Статус выполнения операции перемещения + /// + public enum Status + { + NotInit, + InProgress, + Finish + } +}