diff --git a/Cruiser/Cruiser/DrawingCruiser.cs b/Cruiser/Cruiser/DrawingCruiser.cs deleted file mode 100644 index 393ef09..0000000 --- a/Cruiser/Cruiser/DrawingCruiser.cs +++ /dev/null @@ -1,227 +0,0 @@ -using System.Drawing; - -namespace Cruiser; - -public class DrawingCruiser -{ - /// - /// Класс-сущность - /// - public EntityCruiser? EntityCruiser { get; private set; } - - /// - /// Ширина окна - /// - private int? _pictureWidth; - - /// - /// Высота окна - /// - private int? _pictureHeight; - - /// - /// Левая координата корабля - /// - private int? _startPosX; - - /// - /// Верхняя координата корабля - /// - private int? _startPosY; - - /// - /// Ширина прорисовки корабля - /// - private readonly int _drawingCruiserWidth = 150; - - /// - /// Высота прорисовки корабля - /// - private readonly int _drawingCruiserHeight = 50; - - /// - /// Инициализация - /// - /// <скорость/param> - /// <вес/param> - /// <основной_цвет/param> - /// <дополнительный_цвет/param> - /// <наличие_надстроек/param> - /// <наличие_вооружения/param> - /// <наличие_якоря/param> - public void Init(int speed, double weight, Color bodycolor, Color additionalcolor, bool bodykit, bool arms, bool anchor) - { - EntityCruiser = new EntityCruiser(); - EntityCruiser.Init(speed, weight, bodycolor, additionalcolor, bodykit, arms, anchor); - _pictureWidth = null; - _pictureHeight = null; - _startPosX = null; - _startPosY = null; - } - - /// - /// Установка размеров окна - /// - /// <Ширина/param> - /// <Высота/param> - /// - public bool SetPictureSize(int width, int height) - { - if (_pictureWidth < _drawingCruiserWidth || _pictureHeight < _drawingCruiserHeight) - { - if (_startPosX != null && _startPosY != null) - { - if (width < 0) width = 0; - else if (_startPosX + _drawingCruiserWidth > width) _startPosX = width - _drawingCruiserWidth; - if (height < 0) height = 0; - else if (_startPosY + _drawingCruiserHeight > height) _startPosY = height - _drawingCruiserHeight; - } - } - - // TODO проверка, что объект "влезает" в размеры поля - // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена - _pictureHeight = height; - _pictureWidth = width; - return true; - } - - /// - /// Установка позиции - /// - /// - /// - public void SetPosition(int x, int y) - { - _startPosX = x; - _startPosY = y; - if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) - { - return; - } - if (_startPosX + _drawingCruiserWidth > _pictureWidth) - { - _startPosX = _pictureWidth - _drawingCruiserWidth; - } - else if (_startPosX < 0) - { - _startPosX = 0; - } - if (_startPosY + _drawingCruiserHeight > _pictureHeight) - { - _startPosY = _pictureHeight - _drawingCruiserHeight; - } - - else if (_startPosY < 0) - { - _startPosY = 0; - } - //TODO если при установке объекта в эти координаты, он будет выходить за границы поля, - //то нужно изменить координаты, чтобы он остался в нужных размерах - } - - /// - /// Движение объекта - /// - /// - /// - public bool MoveTransport(DirectionType direction) - { - if (EntityCruiser == null || !_startPosX.HasValue || !_startPosY.HasValue) - { - return false; - } - - switch (direction) - { - case DirectionType.Left: - if (_startPosX.Value - EntityCruiser.Step > 0) - { - _startPosX -= (int)EntityCruiser.Step; - } - return true; - case DirectionType.Up: - if (_startPosY.Value - EntityCruiser.Step > 0) - { - _startPosY -= (int)EntityCruiser.Step; - } - return true; - case DirectionType.Right: - if (_startPosX.Value + EntityCruiser.Step + _drawingCruiserWidth < _pictureWidth) - { - _startPosX += (int)EntityCruiser.Step; - } - return true; - case DirectionType.Down: - if (_startPosY.Value + EntityCruiser.Step + _drawingCruiserHeight < _pictureHeight) - { - _startPosY += (int)EntityCruiser.Step; - } - return true; - default: return false; - } - } - - /// - /// Прорисовка объекта - /// - /// - public void DrawTransport(Graphics g) - { - if (EntityCruiser == null || !_startPosX.HasValue || !_startPosY.HasValue) - { - return; - } - - Brush bodybrush = new SolidBrush(EntityCruiser.BodyColor); - - //Массив точек - Pen pen = new(Color.Black); - Point p1 = new Point(_startPosX.Value + 5, _startPosY.Value); - Point p2 = new Point(_startPosX.Value + 100, _startPosY.Value); - Point p3 = new Point(_startPosX.Value + 150, _startPosY.Value + 25); - Point p4 = new Point(_startPosX.Value + 100, _startPosY.Value + 50); - Point p5 = new Point(_startPosX.Value + 5, _startPosY.Value + 50); - Point p6 = new Point(_startPosX.Value + 5, _startPosY.Value); - Point[] bodypoints = {p1, p2, p3, p4, p5, p6}; - g.FillPolygon(bodybrush, bodypoints); - g.DrawPolygon(pen, bodypoints); - g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 10, 5, 10); - g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 30, 5, 10); - - Brush additionalbrush = new SolidBrush(EntityCruiser.AdditionalColor); - - if (EntityCruiser.Arms == true){ - g.FillEllipse(additionalbrush, _startPosX.Value + 100, _startPosY.Value + 15, 20, 20); - g.DrawEllipse(pen, _startPosX.Value + 100, _startPosY.Value + 15, 20, 20); - } - - if (EntityCruiser.Helicopter == true) - { - g.FillEllipse(additionalbrush, _startPosX.Value + 10, _startPosY.Value + 5, 40, 40); - g.DrawEllipse(pen, _startPosX.Value + 10, _startPosY.Value + 5, 40, 40); - Point ap1 = new Point(_startPosX.Value + 20, _startPosY.Value + 15); - Point ap2 = new Point(_startPosX.Value + 25, _startPosY.Value + 15); - Point ap3 = new Point(_startPosX.Value + 25, _startPosY.Value + 23); - Point ap4 = new Point(_startPosX.Value + 35, _startPosY.Value + 23); - Point ap5 = new Point(_startPosX.Value + 35, _startPosY.Value + 15); - Point ap6 = new Point(_startPosX.Value + 40, _startPosY.Value + 15); - Point ap7 = new Point(_startPosX.Value + 40, _startPosY.Value + 35); - Point ap8 = new Point(_startPosX.Value + 35, _startPosY.Value + 35); - Point ap9 = new Point(_startPosX.Value + 35, _startPosY.Value + 28); - Point ap10 = new Point(_startPosX.Value + 25, _startPosY.Value + 28); - Point ap11 = new Point(_startPosX.Value + 25, _startPosY.Value + 35); - Point ap12 = new Point(_startPosX.Value + 20, _startPosY.Value + 35); - Point[] abodypoints = { ap1, ap2, ap3, ap4, ap5, ap6, ap7, ap8, ap9, ap10, ap11, ap12}; - g.FillPolygon(new SolidBrush(Color.White), abodypoints ); - g.DrawPolygon(pen, abodypoints); - } - - if (EntityCruiser.BodyKit == true) - { - g.FillRectangle(additionalbrush, _startPosX.Value + 70, _startPosY.Value + 15, 20, 20); - g.DrawRectangle(pen, _startPosX.Value + 70, _startPosY.Value + 15, 20, 20); - g.FillRectangle(additionalbrush, _startPosX.Value + 60, _startPosY.Value + 20, 10, 10); - g.DrawRectangle(pen, _startPosX.Value + 60, _startPosY.Value + 20, 10, 10); - } - } -} diff --git a/Cruiser/Cruiser/DirectionType.cs b/Cruiser/Cruiser/Drawings/DirectionType.cs similarity index 74% rename from Cruiser/Cruiser/DirectionType.cs rename to Cruiser/Cruiser/Drawings/DirectionType.cs index 787e046..6e3d1f0 100644 --- a/Cruiser/Cruiser/DirectionType.cs +++ b/Cruiser/Cruiser/Drawings/DirectionType.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Cruiser; +namespace Cruiser.Drawings; /// /// Перечисление направлений @@ -30,4 +24,9 @@ public enum DirectionType /// Вправо /// Right = 4, + + /// + /// Неизвестное напрвление + /// + Unknow = -1, } diff --git a/Cruiser/Cruiser/Drawings/DrawingCruiser.cs b/Cruiser/Cruiser/Drawings/DrawingCruiser.cs new file mode 100644 index 0000000..948f9d9 --- /dev/null +++ b/Cruiser/Cruiser/Drawings/DrawingCruiser.cs @@ -0,0 +1,67 @@ +using Cruiser.Entities; + +namespace Cruiser.Drawings; + +public class DrawingCruiser : DrawingShip +{ + /// + /// Конструктор + /// + /// <скорость/param> + /// <вес/param> + /// <основной_цвет/param> + ///<Надстройки/param> + /// <Вооружение/param> + /// <Вертолетная_площадка/param> + public DrawingCruiser(int speed, double weight, Color bodycolor, Color additionalColor, bool bodykit, bool arms, bool helicopter) : base(150, 50) + { + EntityShip = new EntityCruiser(speed, weight, bodycolor, additionalColor, bodykit, arms, helicopter); + + } + + + public override void DrawTransport(Graphics g) + { + if (EntityShip == null || EntityShip is not EntityCruiser cruiser || !_startPosX.HasValue || !_startPosX.HasValue) return; + + base.DrawTransport(g); + + Brush additionalbrush = new SolidBrush(cruiser.AdditionalColor); + Pen pen = new(Color.Black); + + if (cruiser.Arms == true) + { + g.FillEllipse(additionalbrush, _startPosX.Value + 100, _startPosY.Value + 15, 20, 20); + g.DrawEllipse(pen, _startPosX.Value + 100, _startPosY.Value + 15, 20, 20); + } + + if (cruiser.Helicopter == true) + { + g.FillEllipse(additionalbrush, _startPosX.Value + 10, _startPosY.Value + 5, 40, 40); + g.DrawEllipse(pen, _startPosX.Value + 10, _startPosY.Value + 5, 40, 40); + Point ap1 = new Point(_startPosX.Value + 20, _startPosY.Value + 15); + Point ap2 = new Point(_startPosX.Value + 25, _startPosY.Value + 15); + Point ap3 = new Point(_startPosX.Value + 25, _startPosY.Value + 23); + Point ap4 = new Point(_startPosX.Value + 35, _startPosY.Value + 23); + Point ap5 = new Point(_startPosX.Value + 35, _startPosY.Value + 15); + Point ap6 = new Point(_startPosX.Value + 40, _startPosY.Value + 15); + Point ap7 = new Point(_startPosX.Value + 40, _startPosY.Value + 35); + Point ap8 = new Point(_startPosX.Value + 35, _startPosY.Value + 35); + Point ap9 = new Point(_startPosX.Value + 35, _startPosY.Value + 28); + Point ap10 = new Point(_startPosX.Value + 25, _startPosY.Value + 28); + Point ap11 = new Point(_startPosX.Value + 25, _startPosY.Value + 35); + Point ap12 = new Point(_startPosX.Value + 20, _startPosY.Value + 35); + Point[] abodypoints = { ap1, ap2, ap3, ap4, ap5, ap6, ap7, ap8, ap9, ap10, ap11, ap12 }; + g.FillPolygon(new SolidBrush(Color.White), abodypoints); + g.DrawPolygon(pen, abodypoints); + } + + if (cruiser.BodyKit == true) + { + g.FillRectangle(additionalbrush, _startPosX.Value + 70, _startPosY.Value + 15, 20, 20); + g.DrawRectangle(pen, _startPosX.Value + 70, _startPosY.Value + 15, 20, 20); + g.FillRectangle(additionalbrush, _startPosX.Value + 60, _startPosY.Value + 20, 10, 10); + g.DrawRectangle(pen, _startPosX.Value + 60, _startPosY.Value + 20, 10, 10); + } + } +} diff --git a/Cruiser/Cruiser/Drawings/DrawingShip.cs b/Cruiser/Cruiser/Drawings/DrawingShip.cs new file mode 100644 index 0000000..fc3d65e --- /dev/null +++ b/Cruiser/Cruiser/Drawings/DrawingShip.cs @@ -0,0 +1,203 @@ +using Cruiser.Entities; + +namespace Cruiser.Drawings; + +public class DrawingShip +{ + /// + /// Класс-сущность + /// + public EntityShip? EntityShip { get; protected set; } + + /// + /// Ширина окна + /// + private int? _pictureWidth; + + /// + /// Высота окна + /// + private int? _pictureHeight; + + /// + /// Левая координата корабля + /// + protected int? _startPosX; + + /// + /// Верхняя координата корабля + /// + protected int? _startPosY; + + /// + /// Ширина прорисовки корабля + /// + private readonly int _drawingShipWidth = 150; + + /// + /// Высота прорисовки корабля + /// + private readonly int _drawingShipHeight = 50; + + public int? GetPosX => _startPosX; + + public int ? GetPosY => _startPosY; + + public int GetWidth => _drawingShipWidth; + + public int GetHeight => _drawingShipHeight; + + /// + /// Пустой конструктор + /// + private DrawingShip() + { + _pictureWidth = null; + _pictureHeight = null; + _startPosX = null; + _startPosY = null; + } + + /// + /// Конструктор + /// + /// <скорость/param> + /// <вес/param> + /// <основной_цвет/param> + public DrawingShip(int speed, double weight, Color bodycolor) : this() + { + EntityShip = new EntityShip(speed, weight, bodycolor); + } + + /// + /// Конструктор для наследников + /// + /// Ширина прорисовки корабля + /// Высота прорисовки корабля<вес/param> + protected DrawingShip(int drawingShipWidth, int drawingShipHeight) : this() + { + _drawingShipHeight = drawingShipHeight; + _drawingShipWidth = drawingShipWidth; + } + + /// + /// Установка размеров окна + /// + /// <Ширина/param> + /// <Высота/param> + /// + public bool SetPictureSize(int width, int height) + { + if (width > _drawingShipWidth && height > _drawingShipHeight) + { + _pictureWidth = width; + _pictureHeight = height; + return true; + } + return false; + } + + /// + /// Установка позиции + /// + /// + /// + public void SetPosition(int x, int y) + { + if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) + { + return; + } + _startPosX = x; + _startPosY = y; + if (_startPosX + _drawingShipWidth > _pictureWidth) + { + _startPosX = _pictureWidth - _drawingShipWidth; + } + else if (_startPosX < 0) + { + _startPosX = 0; + } + if (_startPosY + _drawingShipHeight > _pictureHeight) + { + _startPosY = _pictureHeight - _drawingShipHeight; + } + + else if (_startPosY < 0) + { + _startPosY = 0; + } + } + + /// + /// Движение объекта + /// + /// + /// + public bool MoveTransport(DirectionType direction) + { + if (EntityShip == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return false; + } + + switch (direction) + { + case DirectionType.Left: + if (_startPosX.Value - EntityShip.Step > 0) + { + _startPosX -= (int)EntityShip.Step; + } + return true; + case DirectionType.Up: + if (_startPosY.Value - EntityShip.Step > 0) + { + _startPosY -= (int)EntityShip.Step; + } + return true; + case DirectionType.Right: + if (_startPosX.Value + EntityShip.Step + _drawingShipWidth < _pictureWidth) + { + _startPosX += (int)EntityShip.Step; + } + return true; + case DirectionType.Down: + if (_startPosY.Value + EntityShip.Step + _drawingShipHeight < _pictureHeight) + { + _startPosY += (int)EntityShip.Step; + } + return true; + default: return false; + } + } + + + + /// + /// Прорисовка объекта + /// + /// + public virtual void DrawTransport(Graphics g) + { + if (EntityShip == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + + Brush bodybrush = new SolidBrush(EntityShip.BodyColor); + + //Массив точек + Pen pen = new(Color.Black); + Point p1 = new Point(_startPosX.Value + 5, _startPosY.Value); + Point p2 = new Point(_startPosX.Value + 100, _startPosY.Value); + Point p3 = new Point(_startPosX.Value + 150, _startPosY.Value + 25); + Point p4 = new Point(_startPosX.Value + 100, _startPosY.Value + 50); + Point p5 = new Point(_startPosX.Value + 5, _startPosY.Value + 50); + Point p6 = new Point(_startPosX.Value + 5, _startPosY.Value); + Point[] bodypoints = { p1, p2, p3, p4, p5, p6 }; + g.FillPolygon(bodybrush, bodypoints); + g.DrawPolygon(pen, bodypoints); + g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 10, 5, 10); + g.DrawRectangle(pen, _startPosX.Value, _startPosY.Value + 30, 5, 10); + } +} diff --git a/Cruiser/Cruiser/Entities/EntityCruiser.cs b/Cruiser/Cruiser/Entities/EntityCruiser.cs new file mode 100644 index 0000000..fb660ef --- /dev/null +++ b/Cruiser/Cruiser/Entities/EntityCruiser.cs @@ -0,0 +1,45 @@ +namespace Cruiser.Entities; + +/// +/// Класс-сущность Корабль Круизер +/// +public class EntityCruiser : EntityShip +{ + /// + /// Дополнительный цвеь (детали) + /// + public Color AdditionalColor { get; private set; } + + /// + /// Наличие "надстроек" + /// + public bool BodyKit { get; private set; } + + /// + /// Наличие вооружения + /// + public bool Arms { get; private set; } + + /// + /// Наличие вертолетной площадки + /// + public bool Helicopter { get; private set; } + + /// + /// Конструктор сущности + /// + /// Скорость + /// Вес автомобиля + /// Основной цвет + /// <Дополнительный_цвет/param> + /// <Надстройки/param> + /// <Вооружение/param> + /// <Вертолетная_площадка/param> + public EntityCruiser(int speed, double weight, Color bodyСolor, Color additionalСolor, bool bodykit, bool arms, bool helicopter) : base(speed, weight, bodyСolor) + { + AdditionalColor = additionalСolor; + BodyKit = bodykit; + Arms = arms; + Helicopter = helicopter; + } +} diff --git a/Cruiser/Cruiser/Entities/EntityShip.cs b/Cruiser/Cruiser/Entities/EntityShip.cs new file mode 100644 index 0000000..572cc7a --- /dev/null +++ b/Cruiser/Cruiser/Entities/EntityShip.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Cruiser.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 => Speed * 100 / Weight; + + /// + /// Конструктор сущности + /// + /// <Скорость/param> + /// <Вес/param> + /// <Основной_цвет/param> + public EntityShip(int speed, double weight, Color bodyСolor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyСolor; + } +} diff --git a/Cruiser/Cruiser/EntityCruiser.cs b/Cruiser/Cruiser/EntityCruiser.cs deleted file mode 100644 index 3646076..0000000 --- a/Cruiser/Cruiser/EntityCruiser.cs +++ /dev/null @@ -1,68 +0,0 @@ -namespace Cruiser; - -/// -/// Класс-сущность Корабль Круизер -/// -public class EntityCruiser -{ - /// - /// Скорость сущности - /// - 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 Arms { get; private set; } - - /// - /// Наличие вертолетной площадки - /// - public bool Helicopter { get; private set; } - - /// - /// Шаг перемещения - /// - public double Step => Speed * 100 / Weight; - - /// - /// - /// - /// <Скорость/param> - /// <Вес/param> - /// <Основной_цвет/param> - /// <Дополнительный_цвет/param> - /// <Надстройки/param> - /// <Вооружение/param> - /// <Якорь/param> - public void Init(int speed, double weight, Color bodycolor, Color additionalcolor, bool bodykit, bool arms, bool helicopter) - { - Speed = speed; - Weight = weight; - BodyColor = bodycolor; - AdditionalColor = additionalcolor; - BodyKit = bodykit; - Arms = arms; - Helicopter = helicopter; - } -} diff --git a/Cruiser/Cruiser/FormCruiser.Designer.cs b/Cruiser/Cruiser/FormCruiser.Designer.cs index 0f7299c..799a607 100644 --- a/Cruiser/Cruiser/FormCruiser.Designer.cs +++ b/Cruiser/Cruiser/FormCruiser.Designer.cs @@ -34,6 +34,9 @@ buttonDown = new Button(); buttonUp = new Button(); buttonLeft = new Button(); + buttonCreateShip = new Button(); + comboBoxStrategy = new ComboBox(); + buttonStrategyStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxCruiser).BeginInit(); SuspendLayout(); // @@ -52,10 +55,10 @@ buttonCreateCruiser.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; buttonCreateCruiser.Location = new Point(12, 678); buttonCreateCruiser.Name = "buttonCreateCruiser"; - buttonCreateCruiser.Size = new Size(80, 34); + buttonCreateCruiser.Size = new Size(299, 34); buttonCreateCruiser.TabIndex = 8; - buttonCreateCruiser.Text = "Создать"; - buttonCreateCruiser.Click += buttonCreate_Click; + buttonCreateCruiser.Text = "Создать Крейсер"; + buttonCreateCruiser.Click += ButtonCreateCruiser_Click; // // buttonRight // @@ -105,11 +108,44 @@ buttonLeft.UseVisualStyleBackColor = true; buttonLeft.Click += ButtonMove_Click; // + // buttonCreateShip + // + buttonCreateShip.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateShip.Location = new Point(349, 678); + buttonCreateShip.Name = "buttonCreateShip"; + buttonCreateShip.Size = new Size(299, 34); + buttonCreateShip.TabIndex = 10; + buttonCreateShip.Text = "Создать Корабль"; + buttonCreateShip.Click += ButtonCreateShip_Click; + // + // comboBoxStrategy + // + comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Items.AddRange(new object[] { "К центру", "К краю" }); + comboBoxStrategy.Location = new Point(839, 12); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(151, 28); + comboBoxStrategy.TabIndex = 11; + // + // buttonStrategyStep + // + buttonStrategyStep.Location = new Point(896, 63); + buttonStrategyStep.Name = "buttonStrategyStep"; + buttonStrategyStep.Size = new Size(94, 29); + buttonStrategyStep.TabIndex = 12; + buttonStrategyStep.Text = "Шаг"; + buttonStrategyStep.UseVisualStyleBackColor = true; + buttonStrategyStep.Click += buttonStrategyStep_Click; + // // FormCruiser // AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(1002, 724); + Controls.Add(buttonStrategyStep); + Controls.Add(comboBoxStrategy); + Controls.Add(buttonCreateShip); Controls.Add(buttonLeft); Controls.Add(buttonUp); Controls.Add(buttonDown); @@ -130,5 +166,8 @@ private Button buttonDown; private Button buttonUp; private Button buttonLeft; + private Button buttonCreateShip; + private ComboBox comboBoxStrategy; + private Button buttonStrategyStep; } } \ No newline at end of file diff --git a/Cruiser/Cruiser/FormCruiser.cs b/Cruiser/Cruiser/FormCruiser.cs index fd1222b..7c767ec 100644 --- a/Cruiser/Cruiser/FormCruiser.cs +++ b/Cruiser/Cruiser/FormCruiser.cs @@ -1,42 +1,74 @@ -namespace Cruiser; +using Cruiser.Drawings; +using Cruiser.MovementStrategy; + +namespace Cruiser; public partial class FormCruiser : Form { - private DrawingCruiser? _drawingCruiser; + private DrawingShip? _drawingShip; + + private AbstructStrategy? _strategy; public FormCruiser() { InitializeComponent(); + _strategy = null; + } + + private void CreateObject(string type) + { + Random random = new(); + switch (type) + { + case nameof(DrawingShip): + _drawingShip = new DrawingShip(random.Next(100, 300), random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256))); + break; + case nameof(DrawingCruiser): + _drawingShip = new DrawingCruiser(random.Next(100, 300), random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2))); + break; + default: + return; + } + _drawingShip.SetPictureSize(pictureBoxCruiser.Width, pictureBoxCruiser.Height); + _drawingShip.SetPosition(random.Next(10, 100), random.Next(10, 100)); + _strategy = null; + comboBoxStrategy.Enabled = true; + Draw(); } private void Draw() { - if (_drawingCruiser == null) + if (_drawingShip == null) { return; } Bitmap bmp = new(pictureBoxCruiser.Width, pictureBoxCruiser.Height); Graphics gr = Graphics.FromImage(bmp); - _drawingCruiser.DrawTransport(gr); + _drawingShip.DrawTransport(gr); pictureBoxCruiser.Image = bmp; } - private void buttonCreate_Click(object sender, EventArgs e) - { - Random random = new(); - _drawingCruiser = new DrawingCruiser(); - _drawingCruiser.Init(random.Next(100, 300), random.Next(200, 400), - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), - Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2))); - _drawingCruiser.SetPictureSize(pictureBoxCruiser.Width, pictureBoxCruiser.Height); - _drawingCruiser.SetPosition(random.Next(pictureBoxCruiser.Right - 200, pictureBoxCruiser.Right - 160), random.Next(pictureBoxCruiser.Bottom - 150, pictureBoxCruiser.Bottom - 100)); - Draw(); - } + /// + /// Обработка кнопки "Создать Крейсер" + /// + /// + /// + private void ButtonCreateCruiser_Click(object sender, EventArgs e) => CreateObject(nameof(DrawingCruiser)); + + /// + /// Обработка кнопки "Создать Корабль" + /// + /// + /// + private void ButtonCreateShip_Click(object sender, EventArgs e) => CreateObject(nameof(DrawingShip)); private void ButtonMove_Click(object sender, EventArgs e) { - if (_drawingCruiser == null) + if (_drawingShip == null) { return; } @@ -47,16 +79,16 @@ public partial class FormCruiser : Form switch (name) { case "buttonUp": - result = _drawingCruiser.MoveTransport(DirectionType.Up); + result = _drawingShip.MoveTransport(DirectionType.Up); break; case "buttonDown": - result = _drawingCruiser.MoveTransport(DirectionType.Down); + result = _drawingShip.MoveTransport(DirectionType.Down); break; case "buttonLeft": - result = _drawingCruiser.MoveTransport(DirectionType.Left); + result = _drawingShip.MoveTransport(DirectionType.Left); break; case "buttonRight": - result = _drawingCruiser.MoveTransport(DirectionType.Right); + result = _drawingShip.MoveTransport(DirectionType.Right); break; } if (result) @@ -64,4 +96,41 @@ public partial class FormCruiser : Form Draw(); } } + + private void buttonStrategyStep_Click(object sender, EventArgs e) + { + if (_drawingShip == null) + { + return; + } + if (comboBoxStrategy.Enabled) + { + _strategy = comboBoxStrategy.SelectedIndex switch + { + 0 => new MoveToCenter(), + 1 => new MoveToBorder(), + _ => null, + }; + if (_strategy == null) + { + return; + } + _strategy.SetData(new MoveableShip(_drawingShip), pictureBoxCruiser.Width, pictureBoxCruiser.Height); + } + + if (_strategy == null) + { + return; + } + + comboBoxStrategy.Enabled = false; + _strategy.MakeStep(); + Draw(); + + if (_strategy.GetStatus() == StrategyStatus.Finish) + { + comboBoxStrategy.Enabled = true; + _strategy = null; + } + } } diff --git a/Cruiser/Cruiser/MovementStrategy/AbstructStrategy.cs b/Cruiser/Cruiser/MovementStrategy/AbstructStrategy.cs new file mode 100644 index 0000000..038c9e6 --- /dev/null +++ b/Cruiser/Cruiser/MovementStrategy/AbstructStrategy.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Cruiser.MovementStrategy; + +public abstract class AbstructStrategy +{ + private IMoveableObject? _moveableObject; + + private StrategyStatus _state = StrategyStatus.NotInit; + + protected int FieldHeight { get; private set; } + + protected int FieldWidth { get; private set;} + + public StrategyStatus GetStatus() { return _state; } + + public void SetData(IMoveableObject moveableObject, int width, int height) + { + if(moveableObject == null) + { + _state = StrategyStatus.NotInit; + return; + } + + _state = StrategyStatus.InProgress; + _moveableObject = moveableObject; + FieldHeight = height; + FieldWidth = width; + } + + public void MakeStep() + { + if (_state != StrategyStatus.InProgress) + { + return; + } + if (IsTargetDestination()) + { + _state = StrategyStatus.Finish; + return; + } + + MoveToTarget(); + } + + protected bool MoveLeft() => MoveTo(MovementDirection.Left); + + protected bool MoveRight() => MoveTo(MovementDirection.Right); + + protected bool MoveUp() => MoveTo(MovementDirection.Up); + + protected bool MoveDown() => MoveTo(MovementDirection.Down); + + protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition; + + protected int? GetStep() + { + if (_state!= StrategyStatus.InProgress) + { + return null; + } + return _moveableObject.GetStep; + } + + protected abstract void MoveToTarget(); + + protected abstract bool IsTargetDestination(); + + private bool MoveTo(MovementDirection movementDirection) + { + if (_state != StrategyStatus.InProgress) + { + return false; + } + return _moveableObject?.TryMoveObject(movementDirection) ?? false; + } +} diff --git a/Cruiser/Cruiser/MovementStrategy/IMoveableObject.cs b/Cruiser/Cruiser/MovementStrategy/IMoveableObject.cs new file mode 100644 index 0000000..5f8f315 --- /dev/null +++ b/Cruiser/Cruiser/MovementStrategy/IMoveableObject.cs @@ -0,0 +1,19 @@ +namespace Cruiser.MovementStrategy; + +/// +/// Интерфейс для работы с перемещаемыми объектом +/// +public interface IMoveableObject +{ + /// + /// Получение координат объекта + /// + ObjectParameters? GetObjectPosition { get; } + + /// + /// Шаг объекта + /// + int GetStep { get; } + + bool TryMoveObject(MovementDirection direction); +} diff --git a/Cruiser/Cruiser/MovementStrategy/MoveToBorder.cs b/Cruiser/Cruiser/MovementStrategy/MoveToBorder.cs new file mode 100644 index 0000000..cd18b9d --- /dev/null +++ b/Cruiser/Cruiser/MovementStrategy/MoveToBorder.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Cruiser.MovementStrategy; + +public class MoveToBorder : AbstructStrategy +{ + protected override bool IsTargetDestination() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return false; + } + return objParams.RightBorder + GetStep() >= FieldWidth && objParams.DownBorder + GetStep() >= FieldHeight; + //return objParams.ObjectMiddleHorizontal - GetStep() <= FieldWidth / 2 && objParams.ObjectMiddleHorizontal + GetStep() >= FieldWidth / 2 && + // objParams.ObjectMiddleVertical - GetStep() <= FieldHeight / 2 && objParams.ObjectMiddleVertical + GetStep() >= FieldHeight / 2; + } + + protected override void MoveToTarget() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return; + } + if (objParams.RightBorder + GetStep() <= FieldWidth) + { + MoveRight(); + } + if (objParams.DownBorder + GetStep() <= FieldHeight) + { + MoveDown(); + } + + + } +} diff --git a/Cruiser/Cruiser/MovementStrategy/MoveToCenter.cs b/Cruiser/Cruiser/MovementStrategy/MoveToCenter.cs new file mode 100644 index 0000000..2afcb16 --- /dev/null +++ b/Cruiser/Cruiser/MovementStrategy/MoveToCenter.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Cruiser.MovementStrategy; + +public class MoveToCenter : AbstructStrategy +{ + protected override bool IsTargetDestination() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return false; + } + + return objParams.ObjectMiddleHorizontal - GetStep() <= FieldWidth / 2 && objParams.ObjectMiddleHorizontal + GetStep() >= FieldWidth / 2 && + objParams.ObjectMiddleVertical - GetStep() <= FieldHeight / 2 && objParams.ObjectMiddleVertical + GetStep() >= FieldHeight / 2; + } + + protected override void MoveToTarget() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return; + } + + int diffX = objParams.ObjectMiddleHorizontal - FieldWidth / 2; + if (Math.Abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + + int diffY = objParams.ObjectMiddleVertical - FieldHeight / 2; + if (Math.Abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } +} \ No newline at end of file diff --git a/Cruiser/Cruiser/MovementStrategy/MoveableShip.cs b/Cruiser/Cruiser/MovementStrategy/MoveableShip.cs new file mode 100644 index 0000000..e74924d --- /dev/null +++ b/Cruiser/Cruiser/MovementStrategy/MoveableShip.cs @@ -0,0 +1,53 @@ +using Cruiser.Drawings; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Cruiser.MovementStrategy; + +public class MoveableShip : IMoveableObject +{ + private readonly DrawingShip? _ship = null; + + + public MoveableShip(DrawingShip? ship) + { + _ship = ship; + } + public ObjectParameters? GetObjectPosition + { + get + { + if (_ship == null || _ship.EntityShip == null || !_ship.GetPosX.HasValue || !_ship.GetPosY.HasValue) + { + return null; + } + return new ObjectParameters(_ship.GetPosX.Value, _ship.GetPosY.Value, _ship.GetWidth, _ship.GetHeight); + } + } + + public int GetStep => (int)(_ship.EntityShip?.Step ?? 0); + + public bool TryMoveObject(MovementDirection direction) + { + if (_ship == null || _ship.EntityShip == null) + { + return false; + } + return _ship.MoveTransport(GetDirectionType(direction)); + } + + private static DirectionType GetDirectionType(MovementDirection direction) + { + return direction switch + { + MovementDirection.Left => DirectionType.Left, + MovementDirection.Right => DirectionType.Right, + MovementDirection.Up => DirectionType.Up, + MovementDirection.Down => DirectionType.Down, + _ => DirectionType.Unknow, + }; + } +} diff --git a/Cruiser/Cruiser/MovementStrategy/MovementDirection.cs b/Cruiser/Cruiser/MovementStrategy/MovementDirection.cs new file mode 100644 index 0000000..b0d1c0c --- /dev/null +++ b/Cruiser/Cruiser/MovementStrategy/MovementDirection.cs @@ -0,0 +1,27 @@ +namespace Cruiser.MovementStrategy; + +/// +/// Перечисление направлений +/// +public enum MovementDirection +{ + /// + /// Вверх + /// + Up = 1, + + /// + /// Вниз + /// + Down = 2, + + /// + /// Влево + /// + Left = 3, + + /// + /// Вправо + /// + Right = 4, +} diff --git a/Cruiser/Cruiser/MovementStrategy/ObjectParameters.cs b/Cruiser/Cruiser/MovementStrategy/ObjectParameters.cs new file mode 100644 index 0000000..29a3a80 --- /dev/null +++ b/Cruiser/Cruiser/MovementStrategy/ObjectParameters.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Cruiser.MovementStrategy; + +public class ObjectParameters +{ + /// + /// Координата x + /// + private readonly int _x; + + /// + /// Координата y + /// + private readonly int _y; + + /// + /// Ширина объекта + /// + private readonly int _width; + + /// + /// Высота объекта + /// + private readonly int _height; + + /// + /// Левая граница + /// + public int LeftBorder => _x; + + /// + /// Верхняя граница + /// + public int TopBorder => _y; + + /// + /// Правая граница + /// + public int RightBorder => _width + _x; + + /// + /// Нижняя граница + /// + public int DownBorder => _height + _y; + + /// + ///Середина объекта + /// + public int ObjectMiddleHorizontal => _x + _width / 2; + + /// + /// Середина объекта + /// + public int ObjectMiddleVertical => _y + _height / 2; + + /// + /// Конструктор + /// + /// + /// + /// + /// + public ObjectParameters(int x, int y, int width, int height) + { + _x = x; + _y = y; + _width = width; + _height = height; + } +} diff --git a/Cruiser/Cruiser/MovementStrategy/StrategyStatus.cs b/Cruiser/Cruiser/MovementStrategy/StrategyStatus.cs new file mode 100644 index 0000000..7744691 --- /dev/null +++ b/Cruiser/Cruiser/MovementStrategy/StrategyStatus.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Cruiser.MovementStrategy; + +/// +/// Статус выполнения операции перемещения +/// +public enum StrategyStatus +{ + /// + /// Все готово к началу + /// + NotInit, + + /// + /// Выполняется + /// + InProgress, + + /// + /// Завершено + /// + Finish +}