From 049741136568efd16ddbace8bf27a1fd0f714ab1 Mon Sep 17 00:00:00 2001 From: ekallin Date: Tue, 26 Sep 2023 00:18:33 +0400 Subject: [PATCH] Created all classes, but without second moving method --- .../AbstractStrategy.cs | 97 +++++++++++++++++++ .../DrawingElectricLocomotive.cs | 94 +----------------- .../DrawingLocomotive.cs | 46 +++++++-- .../DrawingObjectLocomotive.cs | 35 +++++++ .../FormElectricLocomotive.Designer.cs | 83 ++++++++++++---- .../FormElectricLocomotive.cs | 82 +++++++++++++--- .../IMoveableObject.cs | 2 +- .../ProjectElectricLocomotive/MoveToCenter.cs | 51 ++++++++++ .../ObjectsParameters.cs | 2 +- .../ProjectElectricLocomotive/Status.cs | 15 +++ 10 files changed, 375 insertions(+), 132 deletions(-) create mode 100644 ProjectElectricLocomotive/ProjectElectricLocomotive/AbstractStrategy.cs create mode 100644 ProjectElectricLocomotive/ProjectElectricLocomotive/DrawingObjectLocomotive.cs create mode 100644 ProjectElectricLocomotive/ProjectElectricLocomotive/MoveToCenter.cs create mode 100644 ProjectElectricLocomotive/ProjectElectricLocomotive/Status.cs diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/AbstractStrategy.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/AbstractStrategy.cs new file mode 100644 index 0000000..7fa8d67 --- /dev/null +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/AbstractStrategy.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ElectricLocomotive; +using ProjectElectricLocomotive.DrawingObjects; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; + +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(DirectionType.Left); + + protected bool MoveRight() => MoveTo(DirectionType.Right); + + protected bool MoveUp() => MoveTo(DirectionType.Up); + + 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/ProjectElectricLocomotive/ProjectElectricLocomotive/DrawingElectricLocomotive.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/DrawingElectricLocomotive.cs index 4df0187..facebe4 100644 --- a/ProjectElectricLocomotive/ProjectElectricLocomotive/DrawingElectricLocomotive.cs +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/DrawingElectricLocomotive.cs @@ -1,20 +1,17 @@ -using ProjectElectricLocomotive.DrawingObjects; -using ProjectElectricLocomotive.Entities; +using ProjectElectricLocomotive.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace ElectricLocomotive +namespace ProjectElectricLocomotive.DrawingObjects { public class DrawingElectricLocomotive : DrawingLocomotive { - public DrawingElectricLocomotive(int speed, double weight, Color bodyColor, Color additionalColor, bool bodyKit, + public DrawingElectricLocomotive(int speed, double weight, Color bodyColor, Color additionalColor, bool horns, bool seifBatteries, int width, int height) : base(speed, weight, bodyColor, width, height, 150, 50) { - - if (EntityLocomotive != null) { EntityLocomotive = new EntityElectricLocomotive(speed, width, bodyColor, additionalColor, horns, seifBatteries); @@ -46,91 +43,10 @@ namespace ElectricLocomotive if (electricLocomotive.SeifBatteries) { - g.DrawPolygon(pen, new Point[] - { - new Point(_startPosX + 40, _startPosY + 25), - new Point(_startPosX + 65, _startPosY + 25), - new Point(_startPosX + 65, _startPosY + 35), - new Point(_startPosX + 40, _startPosY + 35), - new Point(_startPosX + 40, _startPosY + 25), - } - ); + g.FillRectangle(blackBrush, _startPosX + 80, _startPosY + 30, 5, 10); + } -/* - - //окошки - g.FillPolygon(windows, new Point[] - { - new Point(_startPosX + 10, _startPosY + 30), - new Point(_startPosX +15, _startPosY + 25), - new Point(_startPosX + 20, _startPosY + 25), - new Point(_startPosX + 20, _startPosY + 30), - new Point(_startPosX +10, _startPosY + 30), - } - ); - - g.DrawPolygon(pen, new Point[] - { - new Point(_startPosX + 10, _startPosY + 30), - new Point(_startPosX +15, _startPosY + 25), - new Point(_startPosX + 20, _startPosY + 25), - new Point(_startPosX + 20, _startPosY + 30), - new Point(_startPosX +10, _startPosY + 30), - } - ); - - g.FillRectangle(windows, _startPosX + 25, _startPosY + 25, 10, 5); - g.DrawRectangle(pen, _startPosX + 25, _startPosY + 25, 10, 5); - - //обязательные колеса - //loco - g.FillEllipse(blackBrush, _startPosX + 10, _startPosY + 45, 5, 5); - g.FillEllipse(blackBrush, _startPosX + 25, _startPosY + 45, 5, 5); - g.FillEllipse(blackBrush, _startPosX + 50, _startPosY + 45, 5, 5); - g.FillEllipse(blackBrush, _startPosX + 65, _startPosY + 45, 5, 5); - - //telega - g.FillEllipse(blackBrush, _startPosX + 95, _startPosY + 45, 5, 5); - g.FillEllipse(blackBrush, _startPosX + 140, _startPosY + 45, 5, 5); - - g.FillEllipse(blackBrush, _startPosX + 130, _startPosY + 45, 5, 5); - g.FillEllipse(blackBrush, _startPosX + 105, _startPosY + 45, 5, 5); - - //telejka - g.FillPolygon(additionalBrush, new Point[] - { - new Point(_startPosX + 90, _startPosY + 25), - new Point(_startPosX + 95, _startPosY + 20), - new Point(_startPosX + 145, _startPosY + 20), - new Point(_startPosX + 150, _startPosY + 25), - new Point(_startPosX + 150, _startPosY + 45), - new Point(_startPosX + 90, _startPosY + 45), - new Point(_startPosX + 90, _startPosY + 25), - } - ); - - g.DrawPolygon(pen, new Point[] - { - new Point(_startPosX + 90, _startPosY + 25), - new Point(_startPosX + 95, _startPosY + 20), - new Point(_startPosX + 145, _startPosY + 20), - new Point(_startPosX + 150, _startPosY + 25), - new Point(_startPosX + 150, _startPosY + 45), - new Point(_startPosX + 90, _startPosY + 45), - new Point(_startPosX + 90, _startPosY + 25), - } - ); - //телега окна - g.DrawLine(pen, _startPosX + 80, _startPosY + 40, _startPosX + 90, _startPosY + 40); - g.FillRectangle(windows, _startPosX + 95, _startPosY + 30, 10, 5); - g.FillRectangle(windows, _startPosX + 115, _startPosY + 30, 10, 5); - g.FillRectangle(windows, _startPosX + 135, _startPosY + 30, 10, 5);*/ - - base.DrawTransport(g); } - - - } } \ No newline at end of file diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/DrawingLocomotive.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/DrawingLocomotive.cs index c991a9b..d87751d 100644 --- a/ProjectElectricLocomotive/ProjectElectricLocomotive/DrawingLocomotive.cs +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/DrawingLocomotive.cs @@ -13,10 +13,10 @@ namespace ProjectElectricLocomotive.DrawingObjects { public EntityLocomotive? EntityLocomotive { get; protected set; } - private int _pictureHeight; - private int _pictureWidth; + private int _pictureHeight; + protected int _startPosX; protected int _startPosY; @@ -25,21 +25,29 @@ namespace ProjectElectricLocomotive.DrawingObjects protected readonly int _locoHeight = 50; + public int GetPosX => _startPosX; + + public int GetPosY => _startPosY; + + public int GetWidth => _locoWidth; + + public int GetHeight => _locoHeight; + public DrawingLocomotive(int speed, double weight, Color bodyColor, int width, int heigth) { - if(EntityLocomotive == null) + if (width < _locoWidth || heigth < _locoHeight) { return; } - _locoWidth = width; - _locoHeight = heigth; + _pictureWidth = width; + _pictureHeight = heigth; EntityLocomotive = new EntityLocomotive(speed, weight, bodyColor); } - protected DrawingLocomotive(int speed, double weight, Color bodyColor, int width, + protected DrawingLocomotive(int speed, double weight, Color bodyColor, int width, int height, int locoWidth, int locoHeight) { - if (EntityLocomotive == null) + if (width < _locoWidth || height < _locoHeight) { return; } @@ -53,7 +61,7 @@ namespace ProjectElectricLocomotive.DrawingObjects //Установка позиции public void SetPosition(int x, int y) { - if(x < 0 || x + _locoWidth > _pictureWidth) + if (x < 0 || x + _locoWidth > _pictureWidth) { x = _pictureWidth - _locoWidth; } @@ -126,6 +134,7 @@ namespace ProjectElectricLocomotive.DrawingObjects } ); + g.DrawPolygon(pen, new Point[] { new Point(_startPosX, _startPosY + 40), @@ -170,6 +179,27 @@ namespace ProjectElectricLocomotive.DrawingObjects g.FillEllipse(blackBrush, _startPosX + 25, _startPosY + 45, 5, 5); g.FillEllipse(blackBrush, _startPosX + 50, _startPosY + 45, 5, 5); g.FillEllipse(blackBrush, _startPosX + 65, _startPosY + 45, 5, 5); + + } + + + public bool CanMove(DirectionType direction) + { + if (EntityLocomotive == null) + { + return false; + } + return direction switch + { + //влево + DirectionType.Left => _startPosX - EntityLocomotive.Step > 0, + //вверх + DirectionType.Up => _startPosY - EntityLocomotive.Step > 0, + // вправо + DirectionType.Right => _startPosX + EntityLocomotive.Speed < _pictureWidth, + //вниз + DirectionType.Down => _startPosY + EntityLocomotive.Speed < _pictureHeight, + }; } } } diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/DrawingObjectLocomotive.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/DrawingObjectLocomotive.cs new file mode 100644 index 0000000..33543b0 --- /dev/null +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/DrawingObjectLocomotive.cs @@ -0,0 +1,35 @@ +using ElectricLocomotive; +using ProjectElectricLocomotive.DrawingObjects; +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(DirectionType direction) => _drawningLocomotive?.CanMove(direction) ?? false; + public void MoveObject(DirectionType direction) => _drawningLocomotive?.MoveTransport(direction); + } +} diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.Designer.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.Designer.cs index be16dad..8dadd24 100644 --- a/ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.Designer.cs +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.Designer.cs @@ -29,11 +29,14 @@ private void InitializeComponent() { this.pictureBoxElectricLocomotive = new System.Windows.Forms.PictureBox(); - this.buttonCreate = new System.Windows.Forms.Button(); + this.buttonCreateElectricLocomotive = new System.Windows.Forms.Button(); this.buttonLeft = new System.Windows.Forms.Button(); this.buttonUp = new System.Windows.Forms.Button(); this.buttonRight = new System.Windows.Forms.Button(); this.buttonDown = new System.Windows.Forms.Button(); + this.comboBoxStrategy = new System.Windows.Forms.ComboBox(); + this.buttonCreateLocomotive = new System.Windows.Forms.Button(); + this.buttonStep = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.pictureBoxElectricLocomotive)).BeginInit(); this.SuspendLayout(); // @@ -42,29 +45,29 @@ this.pictureBoxElectricLocomotive.Dock = System.Windows.Forms.DockStyle.Fill; this.pictureBoxElectricLocomotive.Location = new System.Drawing.Point(0, 0); this.pictureBoxElectricLocomotive.Name = "pictureBoxElectricLocomotive"; - this.pictureBoxElectricLocomotive.Size = new System.Drawing.Size(533, 465); + this.pictureBoxElectricLocomotive.Size = new System.Drawing.Size(1242, 512); this.pictureBoxElectricLocomotive.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; this.pictureBoxElectricLocomotive.TabIndex = 0; this.pictureBoxElectricLocomotive.TabStop = false; // - // buttonCreate + // buttonCreateElectricLocomotive // - this.buttonCreate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.buttonCreate.Font = new System.Drawing.Font("Candara Light", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); - this.buttonCreate.Location = new System.Drawing.Point(16, 395); - this.buttonCreate.Name = "buttonCreate"; - this.buttonCreate.Size = new System.Drawing.Size(111, 52); - this.buttonCreate.TabIndex = 1; - this.buttonCreate.Text = "Создать"; - this.buttonCreate.UseVisualStyleBackColor = true; - this.buttonCreate.Click += new System.EventHandler(this.buttonCreate_Click); + this.buttonCreateElectricLocomotive.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonCreateElectricLocomotive.Font = new System.Drawing.Font("Candara Light", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.buttonCreateElectricLocomotive.Location = new System.Drawing.Point(16, 442); + this.buttonCreateElectricLocomotive.Name = "buttonCreateElectricLocomotive"; + this.buttonCreateElectricLocomotive.Size = new System.Drawing.Size(272, 52); + this.buttonCreateElectricLocomotive.TabIndex = 1; + this.buttonCreateElectricLocomotive.Text = "Создать электролокомотив"; + this.buttonCreateElectricLocomotive.UseVisualStyleBackColor = true; + this.buttonCreateElectricLocomotive.Click += new System.EventHandler(this.buttonCreateElectricLocomotive_Click); // // buttonLeft // this.buttonLeft.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonLeft.BackgroundImage = global::ProjectElectricLocomotive.Properties.Resources.arrowLeft; this.buttonLeft.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; - this.buttonLeft.Location = new System.Drawing.Point(389, 417); + this.buttonLeft.Location = new System.Drawing.Point(1098, 464); this.buttonLeft.Name = "buttonLeft"; this.buttonLeft.Size = new System.Drawing.Size(30, 30); this.buttonLeft.TabIndex = 2; @@ -76,7 +79,7 @@ this.buttonUp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonUp.BackgroundImage = global::ProjectElectricLocomotive.Properties.Resources.arrowUP; this.buttonUp.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; - this.buttonUp.Location = new System.Drawing.Point(435, 368); + this.buttonUp.Location = new System.Drawing.Point(1144, 415); this.buttonUp.Name = "buttonUp"; this.buttonUp.Size = new System.Drawing.Size(30, 30); this.buttonUp.TabIndex = 3; @@ -88,7 +91,7 @@ this.buttonRight.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonRight.BackgroundImage = global::ProjectElectricLocomotive.Properties.Resources.arrowRight; this.buttonRight.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; - this.buttonRight.Location = new System.Drawing.Point(479, 417); + this.buttonRight.Location = new System.Drawing.Point(1188, 464); this.buttonRight.Name = "buttonRight"; this.buttonRight.Size = new System.Drawing.Size(30, 30); this.buttonRight.TabIndex = 4; @@ -100,23 +103,62 @@ this.buttonDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonDown.BackgroundImage = global::ProjectElectricLocomotive.Properties.Resources.arrowDown; this.buttonDown.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; - this.buttonDown.Location = new System.Drawing.Point(435, 417); + this.buttonDown.Location = new System.Drawing.Point(1144, 464); this.buttonDown.Name = "buttonDown"; this.buttonDown.Size = new System.Drawing.Size(30, 30); this.buttonDown.TabIndex = 5; this.buttonDown.UseVisualStyleBackColor = true; this.buttonDown.Click += new System.EventHandler(this.buttonMove_Click); // + // comboBoxStrategy + // + this.comboBoxStrategy.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.comboBoxStrategy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxStrategy.FormattingEnabled = true; + this.comboBoxStrategy.Items.AddRange(new object[] { + "MoveToCenter"}); + this.comboBoxStrategy.Location = new System.Drawing.Point(1058, 12); + this.comboBoxStrategy.Name = "comboBoxStrategy"; + this.comboBoxStrategy.Size = new System.Drawing.Size(160, 33); + this.comboBoxStrategy.TabIndex = 6; + // + // buttonCreateLocomotive + // + this.buttonCreateLocomotive.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.buttonCreateLocomotive.Font = new System.Drawing.Font("Candara Light", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.buttonCreateLocomotive.Location = new System.Drawing.Point(333, 442); + this.buttonCreateLocomotive.Name = "buttonCreateLocomotive"; + this.buttonCreateLocomotive.Size = new System.Drawing.Size(272, 52); + this.buttonCreateLocomotive.TabIndex = 7; + this.buttonCreateLocomotive.Text = "Создать локомотив"; + this.buttonCreateLocomotive.UseVisualStyleBackColor = true; + this.buttonCreateLocomotive.Click += new System.EventHandler(this.buttonCreateLocomotive_Click); + // + // buttonStep + // + this.buttonStep.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.buttonStep.Font = new System.Drawing.Font("Candara Light", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.buttonStep.Location = new System.Drawing.Point(1079, 65); + this.buttonStep.Name = "buttonStep"; + this.buttonStep.Size = new System.Drawing.Size(125, 56); + this.buttonStep.TabIndex = 8; + this.buttonStep.Text = "Шаг"; + this.buttonStep.UseVisualStyleBackColor = true; + this.buttonStep.Click += new System.EventHandler(this.buttonStep_Click); + // // ElectricLocomotive // this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 25F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(533, 465); + this.ClientSize = new System.Drawing.Size(1242, 512); + this.Controls.Add(this.buttonStep); + this.Controls.Add(this.buttonCreateLocomotive); + this.Controls.Add(this.comboBoxStrategy); this.Controls.Add(this.buttonDown); this.Controls.Add(this.buttonRight); this.Controls.Add(this.buttonUp); this.Controls.Add(this.buttonLeft); - this.Controls.Add(this.buttonCreate); + this.Controls.Add(this.buttonCreateElectricLocomotive); this.Controls.Add(this.pictureBoxElectricLocomotive); this.Name = "ElectricLocomotive"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; @@ -130,10 +172,13 @@ #endregion private PictureBox pictureBoxElectricLocomotive; - private Button buttonCreate; + private Button buttonCreateElectricLocomotive; private Button buttonLeft; 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/ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.cs index 899ccee..97dd5d4 100644 --- a/ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.cs +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/FormElectricLocomotive.cs @@ -1,8 +1,17 @@ +using ProjectElectricLocomotive; +using ProjectElectricLocomotive.DrawingObjects; +using ProjectElectricLocomotive.MovementStrategy; +using System; + namespace ElectricLocomotive { public partial class ElectricLocomotive : Form { - private DrawingElectricLocomotive? _drawingElectricLocomotive; + + private DrawingLocomotive? _drawingLocomotive; + + private AbstractStrategy? _abstractStrategy; + public ElectricLocomotive() { InitializeComponent(); @@ -10,32 +19,41 @@ namespace ElectricLocomotive private void Draw() { - if (_drawingElectricLocomotive == null) + if (_drawingLocomotive == null) { return; } Bitmap bmp = new(pictureBoxElectricLocomotive.Width, pictureBoxElectricLocomotive.Height); Graphics gr = Graphics.FromImage(bmp); - _drawingElectricLocomotive.DrawTransport(gr); + _drawingLocomotive.DrawTransport(gr); pictureBoxElectricLocomotive.Image = bmp; } - private void buttonCreate_Click(object sender, EventArgs e) + private void buttonCreateElectricLocomotive_Click(object sender, EventArgs e) + { + Random random = new Random(); + _drawingLocomotive = 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)), + pictureBoxElectricLocomotive.Width, pictureBoxElectricLocomotive.Height); + _drawingLocomotive.SetPosition(random.Next(10, 100), random.Next(10, 100)); + Draw(); + } + + private void buttonCreateLocomotive_Click(object sender, EventArgs e) { Random rnd = new Random(); - _drawingElectricLocomotive = new DrawingElectricLocomotive(); - _drawingElectricLocomotive.Init(rnd.Next(100, 300), rnd.Next(1000, 3000), + _drawingLocomotive = new DrawingLocomotive(rnd.Next(100, 300), rnd.Next(1000, 3000), Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)), - Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)), - Convert.ToBoolean(rnd.Next(0, 2)), Convert.ToBoolean(rnd.Next(0, 2)), pictureBoxElectricLocomotive.Width, pictureBoxElectricLocomotive.Height); - _drawingElectricLocomotive.SetPosition(rnd.Next(10, 100), rnd.Next(10, 100)); + _drawingLocomotive.SetPosition(rnd.Next(10, 100), rnd.Next(10, 100)); Draw(); } private void buttonMove_Click(object sender, EventArgs e) { - if (_drawingElectricLocomotive == null) + if (_drawingLocomotive == null) { return; } @@ -43,19 +61,55 @@ namespace ElectricLocomotive switch (name) { case "buttonUp": - _drawingElectricLocomotive.MoveTransport(DirectionType.Up); + _drawingLocomotive.MoveTransport(DirectionType.Up); break; case "buttonDown": - _drawingElectricLocomotive.MoveTransport(DirectionType.Down); + _drawingLocomotive.MoveTransport(DirectionType.Down); break; case "buttonLeft": - _drawingElectricLocomotive.MoveTransport(DirectionType.Left); + _drawingLocomotive.MoveTransport(DirectionType.Left); break; case "buttonRight": - _drawingElectricLocomotive.MoveTransport(DirectionType.Right); + _drawingLocomotive.MoveTransport(DirectionType.Right); break; } Draw(); } + + private void buttonStep_Click(object sender, EventArgs e) + { + if (_drawingLocomotive == null) + { + return; + } + if (comboBoxStrategy.Enabled) + { + _abstractStrategy = comboBoxStrategy.SelectedIndex switch + { + 0 => new MoveToCenter(), + //1 => new MoveToBorder(), + _ => null, + }; + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.SetData(new + DrawingObjectLocomotive(_drawingLocomotive), pictureBoxElectricLocomotive.Width, + pictureBoxElectricLocomotive.Height); + comboBoxStrategy.Enabled = false; + } + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.MakeStep(); + Draw(); + if (_abstractStrategy.GetStatus() == Status.Finish) + { + comboBoxStrategy.Enabled = true; + _abstractStrategy = null; + } + } } } \ No newline at end of file diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/IMoveableObject.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/IMoveableObject.cs index 0cf8e9c..bd4bd2f 100644 --- a/ProjectElectricLocomotive/ProjectElectricLocomotive/IMoveableObject.cs +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/IMoveableObject.cs @@ -8,7 +8,7 @@ using ProjectElectricLocomotive.DrawingObjects; namespace ProjectElectricLocomotive.MovementStrategy { - internal interface IMoveableObject + public interface IMoveableObject { ObjectParameters? GetObjectPosition { get; } diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/MoveToCenter.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/MoveToCenter.cs new file mode 100644 index 0000000..997b71c --- /dev/null +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/MoveToCenter.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectElectricLocomotive.MovementStrategy +{ + internal 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/ProjectElectricLocomotive/ProjectElectricLocomotive/ObjectsParameters.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/ObjectsParameters.cs index 8026fca..e4e356e 100644 --- a/ProjectElectricLocomotive/ProjectElectricLocomotive/ObjectsParameters.cs +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/ObjectsParameters.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace ProjectElectricLocomotive.MovementStrategy { - internal class ObjectParameters + public class ObjectParameters { private readonly int _x; private readonly int _y; diff --git a/ProjectElectricLocomotive/ProjectElectricLocomotive/Status.cs b/ProjectElectricLocomotive/ProjectElectricLocomotive/Status.cs new file mode 100644 index 0000000..525c648 --- /dev/null +++ b/ProjectElectricLocomotive/ProjectElectricLocomotive/Status.cs @@ -0,0 +1,15 @@ +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 + } +}