diff --git a/ElectricLocomotive/ElectricLocomotive/AbstractStrategy.cs b/ElectricLocomotive/ElectricLocomotive/AbstractStrategy.cs new file mode 100644 index 0000000..bfdc1b4 --- /dev/null +++ b/ElectricLocomotive/ElectricLocomotive/AbstractStrategy.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ElectricLocomotive; +using ProjectElectricLocomotive.DrawingObjects; + +namespace ProjectElectricLocomotive.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(); + } + protected bool MoveLeft() => MoveTo(Direction.Left); + protected bool MoveRight() => MoveTo(Direction.Right); + protected bool MoveUp() => MoveTo(Direction.Up); + protected bool MoveDown() => MoveTo(Direction.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(); + /// Направление + private bool MoveTo(Direction directionType) + { + if (_state != Status.InProgress) + { + return false; + } + if (_moveableObject?.CheckCanMove(directionType) ?? false) + { + _moveableObject.MoveObject(directionType); + return true; + } + return false; + } + } +} diff --git a/ElectricLocomotive/ElectricLocomotive/DrawningElectricLocomotive.cs b/ElectricLocomotive/ElectricLocomotive/DrawningElectricLocomotive.cs index 7c82bea..ffd4619 100644 --- a/ElectricLocomotive/ElectricLocomotive/DrawningElectricLocomotive.cs +++ b/ElectricLocomotive/ElectricLocomotive/DrawningElectricLocomotive.cs @@ -3,96 +3,24 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using ElectricLocomotive; +using ProjectElectricLocomotive.Entities; -namespace ElectricLocomotive +namespace ProjectElectricLocomotive.DrawingObjects { - public class DrawningElectricLocomotive + public class DrawingElectricLocomotive : DrawingLocomotive { - public EntityElectricLocomotive? EntityElectricLocomotive { get; private set; } - private int _pictureWidth; - private int _pictureHeight; - private int _startPosX; - private int _startPosY; - private readonly int _locomWidth = 80; - private readonly int _locomHeight = 52; - /// Скорость - /// Вес - /// Цвет кузова - /// Дополнительный цвет - /// Признак наличия токоприемника - /// Признак наличия отсеков под электрические батареи - /// Ширина картинки - /// Высота картинки - /// true - объект создан, false - проверка не пройдена, нельзя создать объект в этих размерах - public bool Init(int speed, double weight, Color bodyColor, Color additionalColor, bool pantograph, bool compartment, int width, int height) + public DrawingElectricLocomotive(int speed, double weight, Color bodyColor, Color additionalColor, + bool pantograph, bool compartment, int width, int height) : base(speed, weight, bodyColor, width, height, 80, 52) { - if (width < _locomWidth || height < _locomHeight) + if (EntityLocomotive != null) { - return false; - } - _pictureWidth = width; - _pictureHeight = height; - EntityElectricLocomotive = new EntityElectricLocomotive(); - EntityElectricLocomotive.Init(speed, weight, bodyColor, additionalColor, pantograph, compartment); - return true; - } - /// Координата X - /// Координата Y - public void SetPosition(int x, int y) - { - if (x < 0 || x + _locomWidth > _pictureWidth) - { - x = _pictureWidth - _locomWidth; - } - if (y < 0 || y + _locomHeight > _pictureHeight) - { - y = _pictureHeight - _locomHeight; - } - _startPosX = x; - _startPosY = y; - } - /// Направление - public void MoveTransport(Direction direction) - { - if (EntityElectricLocomotive == null) - { - return; - } - switch (direction) - { - //влево - case Direction.Left: - if (_startPosX - EntityElectricLocomotive.Step > 0) - { - _startPosX -= (int)EntityElectricLocomotive.Step; - } - break; - //вверх - case Direction.Up: - if (_startPosY - EntityElectricLocomotive.Step > 0) - { - _startPosY -= (int)EntityElectricLocomotive.Step; - } - break; - //вправо - case Direction.Right: - if (_startPosX + EntityElectricLocomotive.Step + _locomWidth < _pictureWidth) - { - _startPosX += (int)EntityElectricLocomotive.Step; - } - break; - case Direction.Down: - if (_startPosY + EntityElectricLocomotive.Step + _locomHeight < _pictureHeight) - { - _startPosY += (int)EntityElectricLocomotive.Step; - } - break; + EntityLocomotive = new EntityElectricLocomotive(speed, width, bodyColor, additionalColor, pantograph, compartment); } } - /// - public void DrawTransport(Graphics g) + public override void DrawTransport(Graphics g) { - if (EntityElectricLocomotive == null) + if (EntityLocomotive is not EntityElectricLocomotive electricLocomotive) { return; } @@ -100,74 +28,23 @@ namespace ElectricLocomotive Pen pen = new(Color.Black); Brush blackBrush = new SolidBrush(Color.Black); Brush windows = new SolidBrush(Color.LightBlue); - Brush bodyColor = new SolidBrush(EntityElectricLocomotive.BodyColor); - Brush additionalBrush = new SolidBrush(EntityElectricLocomotive.AdditionalColor); + Brush additionalBrush = new SolidBrush(electricLocomotive.AdditionalColor); + Brush bodyColor = new SolidBrush(electricLocomotive.BodyColor); + g.DrawRectangle(pen, _startPosX + 40, _startPosY + 24, 25, 11); + g.FillPolygon(additionalBrush, new Point[] + { + new Point(_startPosX + 61, _startPosY + 25), + new Point(_startPosX + 85, _startPosY + 25), + new Point(_startPosX + 85, _startPosY + 35), + new Point(_startPosX + 61, _startPosY + 35), + new Point(_startPosX + 61, _startPosY + 25), + } + ); - if (EntityElectricLocomotive.Pantograph) - { - // Токоприемники - g.FillRectangle(blackBrush, _startPosX + 30, _startPosY + 15, 20, 5); - g.DrawLine(pen, _startPosX + 30, _startPosY + 15, _startPosX + 50, _startPosY + 2); - g.DrawLine(pen, _startPosX + 40, _startPosY + 15, _startPosX + 60, _startPosY + 2); - } - - // Локомотив - g.FillPolygon(bodyColor, new Point[] - { - new Point(_startPosX, _startPosY + 40), - new Point(_startPosX, _startPosY + 30), - new Point(_startPosX + 20, _startPosY + 20), - new Point(_startPosX + 70, _startPosY + 20), - new Point(_startPosX +80, _startPosY + 20), - new Point(_startPosX +80, _startPosY + 40), - new Point(_startPosX +75, _startPosY + 45), - new Point(_startPosX +5, _startPosY + 45), - new Point(_startPosX, _startPosY + 40), - } - ); - - if (EntityElectricLocomotive.Compartment) - { - g.DrawRectangle(pen, _startPosX + 40, _startPosY + 24, 25, 11); - g.FillPolygon(additionalBrush, new Point[] - { - new Point(_startPosX + 41, _startPosY + 25), - new Point(_startPosX + 65, _startPosY + 25), - new Point(_startPosX + 65, _startPosY + 35), - new Point(_startPosX + 41, _startPosY + 35), - new Point(_startPosX + 41, _startPosY + 25), - } - ); - } - - g.DrawPolygon(pen, new Point[] - { - new Point(_startPosX, _startPosY + 40), - new Point(_startPosX, _startPosY + 30), - new Point(_startPosX + 20, _startPosY + 20), - new Point(_startPosX + 70, _startPosY + 20), - new Point(_startPosX + 80, _startPosY + 20), - new Point(_startPosX + 80, _startPosY + 40), - new Point(_startPosX + 75, _startPosY + 45), - new Point(_startPosX + 5, _startPosY + 45), - new Point(_startPosX, _startPosY + 40), - } - ); - - // Окна - g.FillEllipse(windows, _startPosX + 10, _startPosY + 24, 10, 10); - g.DrawEllipse(pen, _startPosX + 10, _startPosY + 25, 10, 10); - - g.FillRectangle(windows, _startPosX + 25, _startPosY + 25, 10, 5); - g.DrawRectangle(pen, _startPosX + 25, _startPosY + 25, 10, 5); - - // Колёса - // Локомотив - g.FillEllipse(blackBrush, _startPosX + 10, _startPosY + 45, 10, 10); - g.FillEllipse(blackBrush, _startPosX + 25, _startPosY + 45, 10, 10); - - g.FillEllipse(blackBrush, _startPosX + 50, _startPosY + 45, 10, 10); - g.FillEllipse(blackBrush, _startPosX + 65, _startPosY + 45, 10, 10); + g.FillRectangle(blackBrush, _startPosX + 30, _startPosY + 15, 20, 5); + g.DrawLine(pen, _startPosX + 30, _startPosY + 15, _startPosX + 50, _startPosY + 2); + g.DrawLine(pen, _startPosX + 40, _startPosY + 15, _startPosX + 60, _startPosY + 2); + base.DrawTransport(g); } } -} \ No newline at end of file +} diff --git a/ElectricLocomotive/ElectricLocomotive/DrawningLocomotive.cs b/ElectricLocomotive/ElectricLocomotive/DrawningLocomotive.cs new file mode 100644 index 0000000..49bcf18 --- /dev/null +++ b/ElectricLocomotive/ElectricLocomotive/DrawningLocomotive.cs @@ -0,0 +1,184 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ElectricLocomotive; +using ProjectElectricLocomotive.Entities; +using ProjectElectricLocomotive.Properties; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; + +namespace ProjectElectricLocomotive.DrawingObjects +{ + public class DrawingLocomotive + { + public EntityLocomotive? EntityLocomotive { get; protected set; } + + protected int _pictureWidth; + protected int _pictureHeight; + protected int _startPosX; + protected int _startPosY; + protected readonly int _locomWidth = 80; + protected readonly int _locomHeight = 52; + public int GetPosX => _startPosX; + public int GetPosY => _startPosY; + public int GetWidth => _locomWidth; + public int GetHeight => _locomHeight; + /// Скорость + /// Вес + /// Цвет кузова + /// Ширина картинки + /// Высота картинки + + public DrawingLocomotive(int speed, double weight, Color bodyColor, int width, int heigth) + { + if (width < _locomWidth || heigth < _locomHeight) + { + return; + } + _pictureWidth = width; + _pictureHeight = heigth; + EntityLocomotive = new EntityLocomotive(speed, weight, bodyColor); + } + /// Скорость + /// Вес + /// Цвет кузова + /// Ширина картинки + /// Высота картинки + /// Ширина картинки + /// Высота картинки + protected DrawingLocomotive(int speed, double weight, Color bodyColor, int width, + int height, int locomWidth, int locomHeight) + { + if (width < _locomWidth || height < _locomHeight) + { + return; + } + _pictureWidth = width; + _pictureHeight = height; + _locomWidth = locomWidth; + _locomHeight = locomHeight; + EntityLocomotive = new EntityLocomotive(speed, weight, bodyColor); + } + /// Координата X + /// Координата Y + public void SetPosition(int x, int y) + { + if (x < 0 || x + _locomWidth > _pictureWidth) + { + x = _pictureWidth - _locomWidth; + } + if (y < 0 || y + _locomHeight > _pictureHeight) + { + y = _pictureHeight - _locomHeight; + } + _startPosX = x; + _startPosY = y; + } + /// Направление + public void MoveTransport(Direction direction) + { + if (EntityLocomotive == null) + { + return; + } + switch (direction) + { + case Direction.Left: + if (_startPosX - EntityLocomotive.Step > 0) + { + _startPosX -= (int)EntityLocomotive.Step; + } + break; + case Direction.Up: + if (_startPosY - EntityLocomotive.Step > 0) + { + _startPosY -= (int)EntityLocomotive.Step; + } + break; + case Direction.Right: + if (_startPosX + EntityLocomotive.Step + _locomWidth < _pictureWidth) + { + _startPosX += (int)EntityLocomotive.Step; + } + break; + case Direction.Down: + if (_startPosY + EntityLocomotive.Step + _locomHeight < _pictureHeight) + { + _startPosY += (int)EntityLocomotive.Step; + } + break; + } + } + /// + public virtual void DrawTransport(Graphics g) + { + { + if (EntityLocomotive == null) return; + } + + Pen pen = new(Color.Black); + Brush blackBrush = new SolidBrush(Color.Black); + Brush windows = new SolidBrush(Color.LightBlue); + Brush bodyColor = new SolidBrush(EntityLocomotive.BodyColor); + g.FillPolygon(bodyColor, new Point[] + { + new Point(_startPosX, _startPosY + 40), + new Point(_startPosX, _startPosY + 30), + new Point(_startPosX + 20, _startPosY + 20), + new Point(_startPosX + 70, _startPosY + 20), + new Point(_startPosX + 80, _startPosY + 20), + new Point(_startPosX + 80, _startPosY + 40), + new Point(_startPosX + 75, _startPosY + 45), + new Point(_startPosX + 5, _startPosY + 45), + new Point(_startPosX, _startPosY + 40), + } + ); + g.DrawPolygon(pen, new Point[] + { + new Point(_startPosX, _startPosY + 40), + new Point(_startPosX, _startPosY + 30), + new Point(_startPosX + 20, _startPosY + 20), + new Point(_startPosX + 70, _startPosY + 20), + new Point(_startPosX + 80, _startPosY + 20), + new Point(_startPosX + 80, _startPosY + 40), + new Point(_startPosX + 75, _startPosY + 45), + new Point(_startPosX + 5, _startPosY + 45), + new Point(_startPosX, _startPosY + 40), + } + ); + + g.FillEllipse(windows, _startPosX + 10, _startPosY + 24, 10, 10); + g.DrawEllipse(pen, _startPosX + 10, _startPosY + 25, 10, 10); + + g.FillRectangle(windows, _startPosX + 25, _startPosY + 25, 10, 5); + g.DrawRectangle(pen, _startPosX + 25, _startPosY + 25, 10, 5); + + + g.FillEllipse(blackBrush, _startPosX + 10, _startPosY + 45, 10, 10); + g.FillEllipse(blackBrush, _startPosX + 25, _startPosY + 45, 10, 10); + + g.FillEllipse(blackBrush, _startPosX + 50, _startPosY + 45, 10, 10); + g.FillEllipse(blackBrush, _startPosX + 65, _startPosY + 45, 10, 10); + } + /// Направление + public bool CanMove(Direction direction) + { + if (EntityLocomotive == null) + { + return false; + } + return direction switch + { + //влево + Direction.Left => _startPosX - EntityLocomotive.Step > 0, + //вверх + Direction.Up => _startPosY - EntityLocomotive.Step > 0, + // вправо + Direction.Right => _startPosX + EntityLocomotive.Step < _pictureWidth, + //вниз + Direction.Down => _startPosY + EntityLocomotive.Step < _pictureHeight, + }; + } + } +} diff --git a/ElectricLocomotive/ElectricLocomotive/DrawningObjectLocomotive.cs b/ElectricLocomotive/ElectricLocomotive/DrawningObjectLocomotive.cs new file mode 100644 index 0000000..8660f4c --- /dev/null +++ b/ElectricLocomotive/ElectricLocomotive/DrawningObjectLocomotive.cs @@ -0,0 +1,35 @@ +using ProjectElectricLocomotive.DrawingObjects; +using ElectricLocomotive; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectElectricLocomotive.MovementStrategy +{ + public class DrawingObjectLocomotive : IMoveableObject + { + private readonly DrawingLocomotive? _drawningLocomotive = null; + + public DrawingObjectLocomotive(DrawingLocomotive drawningLocomotive) + { + _drawningLocomotive = drawningLocomotive; + } + public ObjectParameters? GetObjectPosition + { + get + { + if (_drawningLocomotive == null || _drawningLocomotive.EntityLocomotive == null) + { + return null; + } + return new ObjectParameters(_drawningLocomotive.GetPosX, + _drawningLocomotive.GetPosY, _drawningLocomotive.GetWidth, _drawningLocomotive.GetHeight); + } + } + public int GetStep => (int)(_drawningLocomotive?.EntityLocomotive?.Step ?? 0); + public bool CheckCanMove(Direction direction) => _drawningLocomotive?.CanMove(direction) ?? false; + public void MoveObject(Direction direction) => _drawningLocomotive?.MoveTransport(direction); + } +} diff --git a/ElectricLocomotive/ElectricLocomotive/EntityElectricLocomotive.cs b/ElectricLocomotive/ElectricLocomotive/EntityElectricLocomotive.cs index e54c539..1f148e3 100644 --- a/ElectricLocomotive/ElectricLocomotive/EntityElectricLocomotive.cs +++ b/ElectricLocomotive/ElectricLocomotive/EntityElectricLocomotive.cs @@ -1,31 +1,24 @@ -using System; +using ProjectElectricLocomotive.Entities; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace ElectricLocomotive +namespace ProjectElectricLocomotive.Entities { - public class EntityElectricLocomotive + public class EntityElectricLocomotive : EntityLocomotive { - 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 Pantograph { get; private set; } public bool Compartment { get; private set; } - public double Step => (double)Speed * 100 / Weight; - /// Скорость - /// Вес локомотива - /// Основной цвет + /// Дополнительный цвет /// Признак наличия токоприемника /// Признак наличия отсеков под электрические батареи - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool pantograph, bool compartment) + public EntityElectricLocomotive(int speed, double weight, Color bodyColor, Color additionalColor, bool pantograph, + bool compartment) : base(speed, weight, bodyColor) { - Speed = speed; - Weight = weight; - BodyColor = bodyColor; AdditionalColor = additionalColor; Pantograph = pantograph; Compartment = compartment; diff --git a/ElectricLocomotive/ElectricLocomotive/EntityLocomotive.cs b/ElectricLocomotive/ElectricLocomotive/EntityLocomotive.cs new file mode 100644 index 0000000..da602cf --- /dev/null +++ b/ElectricLocomotive/ElectricLocomotive/EntityLocomotive.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectElectricLocomotive.Entities +{ + public class EntityLocomotive + { + 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 EntityLocomotive (int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + } + } +} diff --git a/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.Designer.cs b/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.Designer.cs index 354fdc3..a828c5b 100644 --- a/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.Designer.cs +++ b/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.Designer.cs @@ -1,6 +1,8 @@ -namespace ElectricLocomotive +using System; + +namespace ElectricLocomotive { - partial class FormElectricLocomotive + partial class ElectricLocomotive { /// /// Required designer variable. @@ -29,11 +31,14 @@ private void InitializeComponent() { pictureBoxElectricLocomotive = new PictureBox(); - buttonCreate = new Button(); + buttonCreateElectricLocomotive = new Button(); buttonLeft = new Button(); - buttonRight = new Button(); buttonUp = new Button(); + buttonRight = new Button(); buttonDown = new Button(); + comboBoxStrategy = new ComboBox(); + buttonCreateLocomotive = new Button(); + buttonStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxElectricLocomotive).BeginInit(); SuspendLayout(); // @@ -44,81 +49,132 @@ pictureBoxElectricLocomotive.Enabled = false; pictureBoxElectricLocomotive.Location = new Point(0, 0); pictureBoxElectricLocomotive.Name = "pictureBoxElectricLocomotive"; - pictureBoxElectricLocomotive.Size = new Size(1052, 553); + pictureBoxElectricLocomotive.Size = new Size(847, 441); pictureBoxElectricLocomotive.SizeMode = PictureBoxSizeMode.AutoSize; pictureBoxElectricLocomotive.TabIndex = 0; pictureBoxElectricLocomotive.TabStop = false; pictureBoxElectricLocomotive.Click += buttonMove_Click; // - // buttonCreate + // buttonCreateElectricLocomotive // - buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - buttonCreate.Location = new Point(0, 490); - buttonCreate.Name = "buttonCreate"; - buttonCreate.Size = new Size(172, 63); - buttonCreate.TabIndex = 1; - buttonCreate.Text = "Создать"; - buttonCreate.UseVisualStyleBackColor = true; - buttonCreate.Click += buttonCreate_Click; + buttonCreateElectricLocomotive.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateElectricLocomotive.Font = new Font("Calibri", 9.75F, FontStyle.Regular, GraphicsUnit.Point); + buttonCreateElectricLocomotive.Location = new Point(11, 365); + buttonCreateElectricLocomotive.Margin = new Padding(2); + buttonCreateElectricLocomotive.Name = "buttonCreateElectricLocomotive"; + buttonCreateElectricLocomotive.Size = new Size(134, 64); + buttonCreateElectricLocomotive.TabIndex = 1; + buttonCreateElectricLocomotive.Text = "Создать электролокомотив"; + buttonCreateElectricLocomotive.UseVisualStyleBackColor = true; + buttonCreateElectricLocomotive.Click += buttonCreateElectricLocomotive_Click; // // buttonLeft // buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; - buttonLeft.BackgroundImage = Properties.Resources.free_icon_left_arrow_line_symbol_54321; + buttonLeft.BackgroundImage = ProjectElectricLocomotive.Properties.Resources.free_icon_left_arrow_line_symbol_54321; buttonLeft.BackgroundImageLayout = ImageLayout.Zoom; - buttonLeft.Location = new Point(938, 511); + buttonLeft.Location = new Point(733, 399); + buttonLeft.Margin = new Padding(2); buttonLeft.Name = "buttonLeft"; buttonLeft.Size = new Size(30, 30); buttonLeft.TabIndex = 2; buttonLeft.UseVisualStyleBackColor = true; buttonLeft.Click += buttonMove_Click; // - // buttonRight - // - buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; - buttonRight.BackgroundImage = Properties.Resources.free_icon_right_arrow_angle_54833; - buttonRight.BackgroundImageLayout = ImageLayout.Zoom; - buttonRight.Location = new Point(1010, 511); - buttonRight.Name = "buttonRight"; - buttonRight.Size = new Size(30, 30); - buttonRight.TabIndex = 3; - buttonRight.UseVisualStyleBackColor = true; - buttonRight.Click += buttonMove_Click; - // // buttonUp // buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; - buttonUp.BackgroundImage = Properties.Resources.free_icon_up_arrow_angle_54817; + buttonUp.BackgroundImage = ProjectElectricLocomotive.Properties.Resources.free_icon_up_arrow_angle_54817; buttonUp.BackgroundImageLayout = ImageLayout.Zoom; - buttonUp.Location = new Point(974, 475); + buttonUp.Location = new Point(767, 365); + buttonUp.Margin = new Padding(2); buttonUp.Name = "buttonUp"; buttonUp.Size = new Size(30, 30); - buttonUp.TabIndex = 4; + buttonUp.TabIndex = 3; buttonUp.UseVisualStyleBackColor = true; buttonUp.Click += buttonMove_Click; // + // buttonRight + // + buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonRight.BackgroundImage = ProjectElectricLocomotive.Properties.Resources.free_icon_right_arrow_angle_54833; + buttonRight.BackgroundImageLayout = ImageLayout.Zoom; + buttonRight.Location = new Point(802, 399); + buttonRight.Margin = new Padding(2); + buttonRight.Name = "buttonRight"; + buttonRight.Size = new Size(30, 30); + buttonRight.TabIndex = 4; + buttonRight.UseVisualStyleBackColor = true; + buttonRight.Click += buttonMove_Click; + // // buttonDown // buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; - buttonDown.BackgroundImage = Properties.Resources.free_icon_down_arrow_54785; + buttonDown.BackgroundImage = ProjectElectricLocomotive.Properties.Resources.free_icon_down_arrow_54785; buttonDown.BackgroundImageLayout = ImageLayout.Zoom; - buttonDown.Location = new Point(974, 511); + buttonDown.Location = new Point(767, 399); + buttonDown.Margin = new Padding(2); buttonDown.Name = "buttonDown"; buttonDown.Size = new Size(30, 30); buttonDown.TabIndex = 5; buttonDown.UseVisualStyleBackColor = true; buttonDown.Click += buttonMove_Click; // - // FormElectricLocomotive + // comboBoxStrategy // - ClientSize = new Size(1052, 553); + comboBoxStrategy.Anchor = AnchorStyles.Top | AnchorStyles.Right; + comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Items.AddRange(new object[] { "MoveToCenter", "MoveToRightEdge" }); + comboBoxStrategy.Location = new Point(681, 7); + comboBoxStrategy.Margin = new Padding(2); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(151, 23); + comboBoxStrategy.TabIndex = 6; + comboBoxStrategy.SelectedIndexChanged += comboBoxStrategy_SelectedIndexChanged; + // + // buttonCreateLocomotive + // + buttonCreateLocomotive.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateLocomotive.Font = new Font("Calibri", 9.75F, FontStyle.Regular, GraphicsUnit.Point); + buttonCreateLocomotive.Location = new Point(149, 365); + buttonCreateLocomotive.Margin = new Padding(2); + buttonCreateLocomotive.Name = "buttonCreateLocomotive"; + buttonCreateLocomotive.Size = new Size(102, 65); + buttonCreateLocomotive.TabIndex = 7; + buttonCreateLocomotive.Text = "Создать локомотив"; + buttonCreateLocomotive.UseVisualStyleBackColor = true; + buttonCreateLocomotive.Click += buttonCreateLocomotive_Click; + // + // buttonStep + // + buttonStep.Anchor = AnchorStyles.Top | AnchorStyles.Right; + buttonStep.Font = new Font("Calibri", 9.75F, FontStyle.Regular, GraphicsUnit.Point); + buttonStep.Location = new Point(744, 34); + buttonStep.Margin = new Padding(2); + buttonStep.Name = "buttonStep"; + buttonStep.Size = new Size(88, 34); + buttonStep.TabIndex = 8; + buttonStep.Text = "Шаг"; + buttonStep.UseVisualStyleBackColor = true; + buttonStep.Click += buttonStep_Click; + // + // ElectricLocomotive + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(847, 441); + Controls.Add(buttonStep); + Controls.Add(buttonCreateLocomotive); + Controls.Add(comboBoxStrategy); Controls.Add(buttonDown); - Controls.Add(buttonUp); Controls.Add(buttonRight); + Controls.Add(buttonUp); Controls.Add(buttonLeft); - Controls.Add(buttonCreate); + Controls.Add(buttonCreateElectricLocomotive); Controls.Add(pictureBoxElectricLocomotive); - Name = "FormElectricLocomotive"; + Margin = new Padding(2); + Name = "ElectricLocomotive"; StartPosition = FormStartPosition.CenterScreen; Text = "ElectricLocomotive"; ((System.ComponentModel.ISupportInitialize)pictureBoxElectricLocomotive).EndInit(); @@ -129,10 +185,13 @@ #endregion private PictureBox pictureBoxElectricLocomotive; - private Button buttonCreate; + private Button buttonCreateElectricLocomotive; private Button buttonLeft; - private Button buttonRight; private Button buttonUp; + private Button buttonRight; private Button buttonDown; + private ComboBox comboBoxStrategy; + private Button buttonCreateLocomotive; + private Button buttonStep; } } \ No newline at end of file diff --git a/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.cs b/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.cs index 32e7e82..a7d53ce 100644 --- a/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.cs +++ b/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.cs @@ -1,44 +1,61 @@ + +using ProjectElectricLocomotive; +using ProjectElectricLocomotive.DrawingObjects; +using ProjectElectricLocomotive.MovementStrategy; +using System; + namespace ElectricLocomotive + { - public partial class FormElectricLocomotive : Form + public partial class ElectricLocomotive : Form { - private DrawningElectricLocomotive? _drawningElectricLocomotive; - public FormElectricLocomotive() + + private DrawingLocomotive? _drawningLocomotive; + + private AbstractStrategy? _abstractStrategy; + + public ElectricLocomotive() { InitializeComponent(); } + private void Draw() { - if (_drawningElectricLocomotive == null) + if (_drawningLocomotive == null) { return; } - Bitmap bmp = new(pictureBoxElectricLocomotive.Width, - pictureBoxElectricLocomotive.Height); + Bitmap bmp = new(pictureBoxElectricLocomotive.Width, pictureBoxElectricLocomotive.Height); Graphics gr = Graphics.FromImage(bmp); - _drawningElectricLocomotive.DrawTransport(gr); + _drawningLocomotive.DrawTransport(gr); pictureBoxElectricLocomotive.Image = bmp; } - /// - /// - private void buttonCreate_Click(object sender, EventArgs e) + + private void buttonCreateElectricLocomotive_Click(object sender, EventArgs e) { - Random random = new(); - _drawningElectricLocomotive = new DrawningElectricLocomotive(); - _drawningElectricLocomotive.Init(random.Next(100, 300), random.Next(1000, 3000), + Random random = new Random(); + _drawningLocomotive = new DrawingElectricLocomotive(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)), Convert.ToBoolean(random.Next(0, 2)), pictureBoxElectricLocomotive.Width, pictureBoxElectricLocomotive.Height); - _drawningElectricLocomotive.SetPosition(random.Next(1, 100), random.Next(1, 100)); + _drawningLocomotive.SetPosition(random.Next(10, 100), random.Next(10, 100)); Draw(); } - /// - /// + + private void buttonCreateLocomotive_Click(object sender, EventArgs e) + { + Random rnd = new Random(); + _drawningLocomotive = new DrawingLocomotive(rnd.Next(100, 300), rnd.Next(1000, 3000), + Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)), + pictureBoxElectricLocomotive.Width, pictureBoxElectricLocomotive.Height); + _drawningLocomotive.SetPosition(rnd.Next(10, 100), rnd.Next(10, 100)); + Draw(); + } + private void buttonMove_Click(object sender, EventArgs e) { - if (_drawningElectricLocomotive == null) + if (_drawningLocomotive == null) { return; } @@ -46,19 +63,65 @@ namespace ElectricLocomotive switch (name) { case "buttonUp": - _drawningElectricLocomotive.MoveTransport(Direction.Up); + _drawningLocomotive.MoveTransport(Direction.Up); break; case "buttonDown": - _drawningElectricLocomotive.MoveTransport(Direction.Down); + _drawningLocomotive.MoveTransport(Direction.Down); break; case "buttonLeft": - _drawningElectricLocomotive.MoveTransport(Direction.Left); + _drawningLocomotive.MoveTransport(Direction.Left); break; case "buttonRight": - _drawningElectricLocomotive.MoveTransport(Direction.Right); + _drawningLocomotive.MoveTransport(Direction.Right); break; } Draw(); } + + private void buttonStep_Click(object sender, EventArgs e) + { + if (_drawningLocomotive == null) + { + return; + } + if (comboBoxStrategy.Enabled) + { + _abstractStrategy = comboBoxStrategy.SelectedIndex switch + { + 0 => new MoveToCenter(), + 1 => new MoveToRightEdge(), + _ => null, + }; + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.SetData(new + DrawingObjectLocomotive(_drawningLocomotive), pictureBoxElectricLocomotive.Width, + pictureBoxElectricLocomotive.Height); + comboBoxStrategy.Enabled = false; + } + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.MakeStep(); + Draw(); + if (_abstractStrategy.GetStatus() == Status.Finish) + { + comboBoxStrategy.Enabled = true; + _abstractStrategy = null; + } + } + + private void comboBoxStrategy_SelectedIndexChanged(object sender, EventArgs e) + { + + } + + private void pictureBoxElectricLocomotive_Click(object sender, EventArgs e) + { + + } } } \ No newline at end of file diff --git a/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.resx b/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.resx index f298a7b..af32865 100644 --- a/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.resx +++ b/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.resx @@ -1,4 +1,64 @@ - + + + diff --git a/ElectricLocomotive/ElectricLocomotive/IMoveableObject.cs b/ElectricLocomotive/ElectricLocomotive/IMoveableObject.cs new file mode 100644 index 0000000..e559e03 --- /dev/null +++ b/ElectricLocomotive/ElectricLocomotive/IMoveableObject.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ElectricLocomotive; +using ProjectElectricLocomotive.DrawingObjects; + +namespace ProjectElectricLocomotive.MovementStrategy +{ + public interface IMoveableObject + { + ObjectParameters? GetObjectPosition { get; } + + int GetStep { get; } + /// + bool CheckCanMove(Direction direction); + /// Направление + void MoveObject(Direction direction); + + } +} diff --git a/ElectricLocomotive/ElectricLocomotive/MoveToCenter.cs b/ElectricLocomotive/ElectricLocomotive/MoveToCenter.cs new file mode 100644 index 0000000..7ced34e --- /dev/null +++ b/ElectricLocomotive/ElectricLocomotive/MoveToCenter.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectElectricLocomotive.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/ElectricLocomotive/ElectricLocomotive/MoveToRightEdge.cs b/ElectricLocomotive/ElectricLocomotive/MoveToRightEdge.cs new file mode 100644 index 0000000..65988c0 --- /dev/null +++ b/ElectricLocomotive/ElectricLocomotive/MoveToRightEdge.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectElectricLocomotive.MovementStrategy +{ + public class MoveToRightEdge : AbstractStrategy + { + protected override bool IsTargetDestinaion() + { + var objParams = GetObjectParameters; + if (objParams == null) return false; + + return objParams.RightBorder >= FieldWidth - GetStep() && objParams.DownBorder >= FieldHeight - GetStep(); + } + + protected override void MoveToTarget() + { + var objParams = GetObjectParameters; + if (objParams == null) return; + if (objParams.RightBorder < FieldWidth - GetStep()) MoveRight(); + if (objParams.DownBorder < FieldHeight - GetStep()) MoveDown(); + + + } + } +} diff --git a/ElectricLocomotive/ElectricLocomotive/ObjectParameters.cs b/ElectricLocomotive/ElectricLocomotive/ObjectParameters.cs new file mode 100644 index 0000000..8fca35b --- /dev/null +++ b/ElectricLocomotive/ElectricLocomotive/ObjectParameters.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectElectricLocomotive.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/ElectricLocomotive/ElectricLocomotive/Program.cs b/ElectricLocomotive/ElectricLocomotive/Program.cs index 3c929fb..cfc9721 100644 --- a/ElectricLocomotive/ElectricLocomotive/Program.cs +++ b/ElectricLocomotive/ElectricLocomotive/Program.cs @@ -11,7 +11,7 @@ namespace ElectricLocomotive // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new FormElectricLocomotive()); + Application.Run(new ElectricLocomotive()); } } } \ No newline at end of file diff --git a/ElectricLocomotive/ElectricLocomotive/ElectricLocomotive.csproj b/ElectricLocomotive/ElectricLocomotive/ProjectElectricLocomotive.csproj similarity index 100% rename from ElectricLocomotive/ElectricLocomotive/ElectricLocomotive.csproj rename to ElectricLocomotive/ElectricLocomotive/ProjectElectricLocomotive.csproj diff --git a/ElectricLocomotive/ElectricLocomotive/Properties/Resources.Designer.cs b/ElectricLocomotive/ElectricLocomotive/Properties/Resources.Designer.cs index 13a990a..d973a85 100644 --- a/ElectricLocomotive/ElectricLocomotive/Properties/Resources.Designer.cs +++ b/ElectricLocomotive/ElectricLocomotive/Properties/Resources.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace ElectricLocomotive.Properties { +namespace ProjectElectricLocomotive.Properties { using System; @@ -39,7 +39,7 @@ namespace ElectricLocomotive.Properties { internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ElectricLocomotive.Properties.Resources", typeof(Resources).Assembly); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProjectElectricLocomotive.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; diff --git a/ElectricLocomotive/ElectricLocomotive/Status.cs b/ElectricLocomotive/ElectricLocomotive/Status.cs new file mode 100644 index 0000000..4313144 --- /dev/null +++ b/ElectricLocomotive/ElectricLocomotive/Status.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectElectricLocomotive.MovementStrategy +{ + public enum Status + { + NotInit, + InProgress, + Finish + } + +} diff --git a/ElectricLocomotive/ElectricLocomotive.sln b/ElectricLocomotive/ProjectElectricLocomotive.sln similarity index 84% rename from ElectricLocomotive/ElectricLocomotive.sln rename to ElectricLocomotive/ProjectElectricLocomotive.sln index 8cf9c0a..37fda21 100644 --- a/ElectricLocomotive/ElectricLocomotive.sln +++ b/ElectricLocomotive/ProjectElectricLocomotive.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.7.34031.279 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElectricLocomotive", "ElectricLocomotive\ElectricLocomotive.csproj", "{A7A62158-ECC2-48DA-81F7-565BB5CE1E0D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProjectElectricLocomotive", "ElectricLocomotive\ProjectElectricLocomotive.csproj", "{A7A62158-ECC2-48DA-81F7-565BB5CE1E0D}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution