diff --git a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/DirectionType.cs b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/DirectionType.cs deleted file mode 100644 index 0f9516b..0000000 --- a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/DirectionType.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Project_SelfPropelledArtilleryUnit -{ - public enum DirectionType - { - Up=1, - Down=2, - Left=3, - Right=4 - } -} diff --git a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/Drawings/DirectionType.cs b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/Drawings/DirectionType.cs new file mode 100644 index 0000000..7463166 --- /dev/null +++ b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/Drawings/DirectionType.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Project_SelfPropelledArtilleryUnit.Drawings; + +public enum DirectionType +{ + Unknow = -1, + Up = 1, + Down = 2, + Left = 3, + Right = 4 +} diff --git a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/DrawingSAU.cs b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/Drawings/DrawingBase.cs similarity index 56% rename from Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/DrawingSAU.cs rename to Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/Drawings/DrawingBase.cs index 164efc8..5159000 100644 --- a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/DrawingSAU.cs +++ b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/Drawings/DrawingBase.cs @@ -1,33 +1,52 @@ -using System; +using Project_SelfPropelledArtilleryUnit.Entity; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Project_SelfPropelledArtilleryUnit +namespace Project_SelfPropelledArtilleryUnit.Drawings { - public class DrawingSAU + public class DrawingBase { - public EntitySAU? EntitySAU { get; private set; } + public BaseSAU? BaseSAU { get; protected set; } private int? _pictureWidth; private int? _pictureHeight; - private int? _startPosX; - private int? _startPosY; + protected int? _startPosX; + protected int? _startPosY; private readonly int _drawingSAUWidth = 150; - private readonly int _drawingSAUHeight = 90; + private readonly int _drawingSAUHeight = 80; - public void Init (int speed, double weight, Color bodyColor, Color additionalColor, bool armor, bool guns) + + + public int? GetPosX => _startPosX; + public int? GetPosY => _startPosY; + public int GetWidth => _drawingSAUWidth; + public int GetHeight => _drawingSAUHeight; + + + + public DrawingBase(int speed, double weight, Color bodyColor) : this() { - EntitySAU = new EntitySAU(); - EntitySAU.Init(speed, weight, bodyColor, additionalColor, armor, guns); - _pictureWidth = null; - _pictureHeight = null; - _startPosX = null; - _startPosY = null; + BaseSAU =new BaseSAU(speed, weight, bodyColor); } - public bool SetPictureSize(int width,int height) + public DrawingBase() + { + _pictureWidth = null; + _pictureHeight = null; + _startPosX = null; + _startPosY = null; + } + + public DrawingBase(int width,int height) : this() + { + _drawingSAUWidth = width; + _drawingSAUHeight = height; + } + + public bool SetPictureSize(int width, int height) { if (width > _pictureWidth || height > _pictureHeight) { @@ -49,22 +68,16 @@ namespace Project_SelfPropelledArtilleryUnit } } return false; - + } public void SetPosition(int x, int y) { - - - if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) { return; } - _startPosX = x; - _startPosY = y; - if (x < 0) { _startPosX = 0; @@ -85,89 +98,80 @@ namespace Project_SelfPropelledArtilleryUnit _startPosY = _pictureHeight - _drawingSAUHeight; } + _startPosX = x; + _startPosY = y; } public bool MoveSAU(DirectionType direction) { - if(EntitySAU==null || !_startPosX.HasValue || !_startPosY.HasValue) + if (BaseSAU == null || !_startPosX.HasValue || !_startPosY.HasValue) { return false; } switch (direction) { case DirectionType.Left: - if (_startPosX.Value - EntitySAU.Step >0) + if (_startPosX.Value - BaseSAU.Step > 0) { - _startPosX-=(int)EntitySAU.Step; + _startPosX -= (int)BaseSAU.Step; } return true; case DirectionType.Up: - if(_startPosY.Value - EntitySAU.Step >0) + if (_startPosY.Value - BaseSAU.Step > 0) { - _startPosY-=(int)EntitySAU.Step; - } + _startPosY -= (int)BaseSAU.Step; + } return true; case DirectionType.Right: - if (_startPosX.Value + EntitySAU.Step +_drawingSAUWidth < _pictureWidth.Value) + if (_startPosX.Value + BaseSAU.Step + _drawingSAUWidth < _pictureWidth.Value) { - _startPosX += (int)EntitySAU.Step; + _startPosX += (int)BaseSAU.Step; } return true; case DirectionType.Down: - if (_startPosY.Value + EntitySAU.Step + _drawingSAUHeight < _pictureHeight.Value) + if (_startPosY.Value + BaseSAU.Step + _drawingSAUHeight < _pictureHeight.Value) { - _startPosY += (int)EntitySAU.Step; + _startPosY += (int)BaseSAU.Step; } return true; default: - return false; + return false; } } - public void DrawSAU(Graphics g) + public virtual void DrawSAU(Graphics g) { - if (EntitySAU == null || !_startPosX.HasValue || !_startPosY.HasValue) + if (BaseSAU == null || !_startPosX.HasValue || !_startPosY.HasValue) { return; } - Pen pen = new(Color.Black); - Brush additionalBrush = new SolidBrush(EntitySAU.AdditionalColor); - Brush BaseBrush = new SolidBrush(Color.Brown); - Brush brBlack = new SolidBrush(Color.Black); - - if (EntitySAU.Wheels) - { - g.FillEllipse(additionalBrush, _startPosX.Value, _startPosY.Value + 45, 40, 40); - g.FillEllipse(additionalBrush, _startPosX.Value + 40, _startPosY.Value + 45, 40, 40); - g.FillEllipse(additionalBrush, _startPosX.Value + 80, _startPosY.Value + 45, 40, 40); - } - else - { - g.FillEllipse(additionalBrush, _startPosX.Value, _startPosY.Value + 55, 130, 40); - } + Pen pen = new(Color.Black); + Brush BaseBrush = new SolidBrush(BaseSAU.BodyColor); + + //Корпус Point point1 = new Point(_startPosX.Value, _startPosY.Value + 45); - Point point2 = new Point(_startPosX.Value + 120, _startPosY.Value + 45); + Point point2 = new Point(_startPosX.Value + 120, _startPosY.Value + 45); Point point3 = new Point(_startPosX.Value + 140, _startPosY.Value + 75); - Point point4 = new Point(_startPosX.Value + 120, _startPosY.Value + 65); + Point point4 = new Point(_startPosX.Value + 120, _startPosY.Value + 65); Point point5 = new Point(_startPosX.Value, _startPosY.Value + 65); - Point[] Points1 = { point1, point2, point3, point4, point5 }; - g.FillPolygon (BaseBrush, Points1); - + Point[] Points1 = { point1, point2, point3, point4, point5 }; + g.FillPolygon(BaseBrush, Points1); + g.FillRectangle(BaseBrush, _startPosX.Value + 20, _startPosY.Value + 15, 80, 30); //Ствол - Point point6 = new Point(_startPosX.Value+ 100, _startPosY.Value + 25); + Point point6 = new Point(_startPosX.Value + 100, _startPosY.Value + 25); Point point7 = new Point(_startPosX.Value + 150, _startPosY.Value + 10); Point point8 = new Point(_startPosX.Value + 150, _startPosY.Value + 20); Point point9 = new Point(_startPosX.Value + 100, _startPosY.Value + 35); - Point[] Points2 = { point6, point7, point8, point9}; - g.FillPolygon(BaseBrush, Points2); + Point[] Points2 = { point6, point7, point8, point9 }; + g.FillPolygon(BaseBrush, Points2); Point point10 = new Point(_startPosX.Value + 140, _startPosY.Value + 10); Point point11 = new Point(_startPosX.Value + 145, _startPosY.Value + 5); @@ -176,16 +180,8 @@ namespace Project_SelfPropelledArtilleryUnit Point[] Points3 = { point10, point11, point12, point13 }; g.FillPolygon(BaseBrush, Points3); - //пулеметы - - if (EntitySAU.Guns) - { - - g.FillRectangle(additionalBrush, _startPosX.Value + 40, _startPosY.Value, 5, 15); - g.FillRectangle(additionalBrush, _startPosX.Value + 75, _startPosY.Value, 5, 15); - - } } } } + diff --git a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/Drawings/DrawingSAU.cs b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/Drawings/DrawingSAU.cs new file mode 100644 index 0000000..23c9c1c --- /dev/null +++ b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/Drawings/DrawingSAU.cs @@ -0,0 +1,62 @@ +using Project_SelfPropelledArtilleryUnit.Entity; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static System.Windows.Forms.VisualStyles.VisualStyleElement; + +namespace Project_SelfPropelledArtilleryUnit.Drawings; + +public class DrawingSAU : DrawingBase +{ + + + public DrawingSAU(int speed, double weight, Color bodyColor, Color additionalColor, bool wheels, bool guns) : base(150, 100) + { + BaseSAU = new EntitySAU( speed, weight, bodyColor, additionalColor, wheels, guns); + + } + + public override void DrawSAU(Graphics g) + { + if (BaseSAU==null || BaseSAU is not EntitySAU SAU || !_startPosX.HasValue || !_startPosY.HasValue) + { + return; + } + + Pen pen = new(Color.Black); + Brush additionalBrush = new SolidBrush(SAU.AdditionalColor); + + + if (SAU.Wheels) + { + + g.FillEllipse(additionalBrush, _startPosX.Value, _startPosY.Value + 45, 40, 40); + g.FillEllipse(additionalBrush, _startPosX.Value + 40, _startPosY.Value + 45, 40, 40); + g.FillEllipse(additionalBrush, _startPosX.Value + 80, _startPosY.Value + 45, 40, 40); + } + else + { + + + g.FillEllipse(additionalBrush, _startPosX.Value, _startPosY.Value + 55, 130, 40); + } + + //пулеметы + + if (SAU.Guns) + { + + g.FillRectangle(additionalBrush, _startPosX.Value + 40, _startPosY.Value, 5, 15); + g.FillRectangle(additionalBrush, _startPosX.Value + 75, _startPosY.Value, 5, 15); + + } + + base.DrawSAU(g); + } + + + + +} diff --git a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/Entity/BaseSAU.cs b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/Entity/BaseSAU.cs new file mode 100644 index 0000000..5f1b5e7 --- /dev/null +++ b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/Entity/BaseSAU.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Project_SelfPropelledArtilleryUnit.Entity +{ + public class BaseSAU + { + public int Speed { get; private set; } + public double Weight { get; private set; } + public Color BodyColor { get; private set; } + + public double Step => Speed * 100 / Weight; + public BaseSAU(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + + } + } +} diff --git a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/Entity/EntitySAU.cs b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/Entity/EntitySAU.cs new file mode 100644 index 0000000..335665e --- /dev/null +++ b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/Entity/EntitySAU.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Project_SelfPropelledArtilleryUnit.Entity; + +public class EntitySAU: BaseSAU +{ + + + public Color AdditionalColor { get; private set; } + public bool Wheels { get; private set; } + //длина ствола + public bool Guns { get; private set; } + + public EntitySAU(int speed, double weight, Color bodyColor, Color additionalColor, bool wheels, bool guns) : base(speed, weight, bodyColor) + { + AdditionalColor = additionalColor; + Wheels = wheels; + Guns = guns; + } + +} diff --git a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/EntitySAU.cs b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/EntitySAU.cs deleted file mode 100644 index 2564a14..0000000 --- a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/EntitySAU.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Project_SelfPropelledArtilleryUnit -{ - public class EntitySAU - { - 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 Wheels { get; private set; } - //длина ствола - public bool Guns { get; private set; } - - public double Step => Speed * 100 / Weight; - - - - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool wheels, bool guns) - { - Speed = speed; - Weight = weight; - BodyColor = bodyColor; - AdditionalColor = additionalColor; - Wheels = wheels; - Guns = guns; - } - } -} diff --git a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/FormSAU.Designer.cs b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/FormSAU.Designer.cs index 819c41d..362ad4c 100644 --- a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/FormSAU.Designer.cs +++ b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/FormSAU.Designer.cs @@ -34,6 +34,9 @@ up = new Button(); right = new Button(); down = new Button(); + baseSAU = new Button(); + comboBoxStrategy = new ComboBox(); + strategyStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit(); SuspendLayout(); // @@ -105,11 +108,45 @@ down.UseVisualStyleBackColor = true; down.Click += Move_Click; // + // baseSAU + // + baseSAU.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + baseSAU.Location = new Point(112, 481); + baseSAU.Name = "baseSAU"; + baseSAU.Size = new Size(94, 29); + baseSAU.TabIndex = 6; + baseSAU.Text = "creat base sau"; + baseSAU.UseVisualStyleBackColor = true; + baseSAU.Click += baseSAU_Click; + // + // comboBoxStrategy + // + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Items.AddRange(new object[] { "to the center", "to the edge" }); + comboBoxStrategy.Location = new Point(891, 12); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(151, 28); + comboBoxStrategy.TabIndex = 7; + // + // strategyStep + // + strategyStep.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + strategyStep.Location = new Point(948, 46); + strategyStep.Name = "strategyStep"; + strategyStep.Size = new Size(94, 29); + strategyStep.TabIndex = 8; + strategyStep.Text = "Step"; + strategyStep.UseVisualStyleBackColor = true; + strategyStep.Click += strategyStep_Click; + // // FormSAU // AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(1054, 522); + Controls.Add(strategyStep); + Controls.Add(comboBoxStrategy); + Controls.Add(baseSAU); Controls.Add(down); Controls.Add(right); Controls.Add(up); @@ -130,5 +167,8 @@ private Button up; private Button right; private Button down; + private Button baseSAU; + private ComboBox comboBoxStrategy; + private Button strategyStep; } } \ No newline at end of file diff --git a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/FormSAU.cs b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/FormSAU.cs index 40665ab..f60c1ca 100644 --- a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/FormSAU.cs +++ b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/FormSAU.cs @@ -4,85 +4,141 @@ using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; +using System.Security.AccessControl; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using Project_SelfPropelledArtilleryUnit.Drawings; +using Project_SelfPropelledArtilleryUnit.MovementStrategy; -namespace Project_SelfPropelledArtilleryUnit +namespace Project_SelfPropelledArtilleryUnit; + +public partial class FormSAU : Form { - public partial class FormSAU : Form + private DrawingBase? _drawingBase; + private AbstractStrategy? _strategy; + + + public FormSAU() { - private DrawingSAU? _drawingSAU; - private EntitySAU? _entity; + InitializeComponent(); + } - public FormSAU() + private void Draw() + { + if (_drawingBase == null) { - InitializeComponent(); + return; } - private void Draw() + Bitmap bmp = new(pictureBox1.Width, pictureBox1.Height); + Graphics gr = Graphics.FromImage(bmp); + _drawingBase.DrawSAU(gr); + pictureBox1.Image = bmp; + } + + private void CreateObject(string type) + { + Random random = new(); + switch (type) { - if (_drawingSAU == null) - { + case nameof(DrawingBase): + _drawingBase = new DrawingBase(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(DrawingSAU): + _drawingBase = new DrawingSAU(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))); + break; + default: return; - } - Bitmap bmp = new(pictureBox1.Width, pictureBox1.Height); - Graphics gr = Graphics.FromImage(bmp); - _drawingSAU.DrawSAU(gr); - pictureBox1.Image = bmp; } - private void Create_Click(object sender, EventArgs e) + _drawingBase.SetPictureSize(pictureBox1.Width, pictureBox1.Height); + _drawingBase.SetPosition(random.Next(10, 100), random.Next(10, 100)); + + _strategy = null; + comboBoxStrategy.Enabled = true; + Draw(); + } + private void Create_Click(object sender, EventArgs e) => CreateObject(nameof(DrawingSAU)); + + + + private void Move_Click(object sender, EventArgs e) + { + if (_drawingBase == null) { + return; + } - - - Random random = new(); - _drawingSAU = new DrawingSAU(); - // _entity = new EntitySAU(); - _drawingSAU.Init(random.Next(100, 300), random.Next(1000, 3000), - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), - Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2))); - - _drawingSAU.SetPictureSize(pictureBox1.Width, pictureBox1.Height); - _drawingSAU.SetPosition(pictureBox1.Width , pictureBox1.Height); - - + string name = ((Button)sender)?.Name ?? string.Empty; + bool result = false; + switch (name) + { + case "up": + result = _drawingBase.MoveSAU(DirectionType.Up); + break; + case "down": + result = _drawingBase.MoveSAU(DirectionType.Down); + break; + case "left": + result = _drawingBase.MoveSAU(DirectionType.Left); + break; + case "right": + result = _drawingBase.MoveSAU(DirectionType.Right); + break; + } + if (result) + { Draw(); } + } - private void Move_Click(object sender, EventArgs e) + private void baseSAU_Click(object sender, EventArgs e) => CreateObject(nameof(DrawingBase)); + + private void strategyStep_Click(object sender, EventArgs e) + { + if (_drawingBase == null) { - if(_drawingSAU==null) + return; + } + + if (comboBoxStrategy.Enabled) + { + _strategy = comboBoxStrategy.SelectedIndex + switch + { + 0 => new MoveToCenter(), + 1 => new MoveToBorder(), + _ => null, + }; + + + if (_strategy == null) { return; } + _strategy.SetData(new MoveableSAU(_drawingBase), pictureBox1.Width, pictureBox1.Height); + } - string name=((Button)sender)?.Name ?? string.Empty; - bool result = false; - switch (name) - { - case "up": - result = _drawingSAU.MoveSAU(DirectionType.Up); - break; - case "down": - result = _drawingSAU.MoveSAU(DirectionType.Down); - break; - case "left": - result = _drawingSAU.MoveSAU(DirectionType.Left); - break; - case "right": - result = _drawingSAU.MoveSAU(DirectionType.Right); - break; - } + if (_strategy == null) + { + return; + } - if(result) - { - Draw(); - } + comboBoxStrategy.Enabled = false; + _strategy.MakeStep(); + Draw(); + + if (_strategy.GetStatus() == StrategyStatus.Finish) + { + comboBoxStrategy.Enabled = true; + _strategy = null; } } } diff --git a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/AbstractStrategy.cs b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/AbstractStrategy.cs new file mode 100644 index 0000000..2b8ef24 --- /dev/null +++ b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/AbstractStrategy.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Project_SelfPropelledArtilleryUnit.MovementStrategy; + +public abstract class AbstractStrategy +{ + + private IMoveableObject? _moveableObject; + + + private StrategyStatus _state = StrategyStatus.NotInit; + + + protected int FieldWidth { get; private set; } + + + protected int FieldHeight { 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; + FieldWidth = width; + FieldHeight = height; + } + + 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/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/IMoveableObject.cs b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/IMoveableObject.cs new file mode 100644 index 0000000..a21e94a --- /dev/null +++ b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/IMoveableObject.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Project_SelfPropelledArtilleryUnit.MovementStrategy; + + +public interface IMoveableObject +{ + + ObjectParameters? GetObjectPosition { get; } + + + int GetStep { get; } + + + bool TryMoveObject(MovementDirection direction); +} diff --git a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/MoveToBorder.cs b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/MoveToBorder.cs new file mode 100644 index 0000000..0098408 --- /dev/null +++ b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/MoveToBorder.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Project_SelfPropelledArtilleryUnit.MovementStrategy; + +public class MoveToBorder : AbstractStrategy +{ + protected override bool IsTargetDestination() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return false; + } + + return objParams.RightBorder <= FieldWidth && objParams.RightBorder + GetStep() >= FieldWidth && + objParams.DownBorder <= FieldHeight && objParams.DownBorder + GetStep() >= FieldHeight; + } + + protected override void MoveToTarget() + { + ObjectParameters? objParams = GetObjectParameters; + if (objParams == null) + { + return; + } + int diffX = objParams.RightBorder - FieldWidth; + if (Math.Abs(diffX) > GetStep()) + { + if (diffX > 0) + { + MoveLeft(); + } + else + { + MoveRight(); + } + } + int diffY = objParams.DownBorder - FieldHeight; + if (Math.Abs(diffY) > GetStep()) + { + if (diffY > 0) + { + MoveUp(); + } + else + { + MoveDown(); + } + } + } +} diff --git a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/MoveToCenter.cs b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/MoveToCenter.cs new file mode 100644 index 0000000..5574084 --- /dev/null +++ b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/MoveToCenter.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Project_SelfPropelledArtilleryUnit.MovementStrategy; + +public class MoveToCenter : AbstractStrategy +{ + 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(); + } + } + } +} diff --git a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/MoveableSAU.cs b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/MoveableSAU.cs new file mode 100644 index 0000000..e91608a --- /dev/null +++ b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/MoveableSAU.cs @@ -0,0 +1,57 @@ +using Project_SelfPropelledArtilleryUnit.Drawings; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Project_SelfPropelledArtilleryUnit.MovementStrategy; + +public class MoveableSAU : IMoveableObject +{ + + private readonly DrawingBase? _SAU = null; + + + public MoveableSAU(DrawingBase sau) + { + _SAU = sau; + } + + public ObjectParameters? GetObjectPosition + { + get + { + if (_SAU == null || _SAU.BaseSAU == null || !_SAU.GetPosX.HasValue || !_SAU.GetPosY.HasValue) + { + return null; + } + return new ObjectParameters(_SAU.GetPosX.Value, _SAU.GetPosY.Value, _SAU.GetWidth, _SAU.GetHeight); + } + } + + public int GetStep => (int)(_SAU?.BaseSAU.Step ?? 0); + + public bool TryMoveObject(MovementDirection direction) + { + if (_SAU == null || _SAU.BaseSAU == null) + { + return false; + } + + return _SAU.MoveSAU(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/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/MovementDirection.cs b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/MovementDirection.cs new file mode 100644 index 0000000..64b5d1a --- /dev/null +++ b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/MovementDirection.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Project_SelfPropelledArtilleryUnit.MovementStrategy; + +public enum MovementDirection +{ + + Up = 1, + Down = 2, + Left = 3, + Right = 4 +} diff --git a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/ObjectParameters.cs b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/ObjectParameters.cs new file mode 100644 index 0000000..a5b9eee --- /dev/null +++ b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/ObjectParameters.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Project_SelfPropelledArtilleryUnit.MovementStrategy; + +public class ObjectParameters +{ + private readonly int _x; + private readonly int _y; + private readonly int _width; + private readonly int _height; + + public int LeftBorder => _x; + public int TopBorder => _y; + public int RightBorder => _x + _width; + public int DownBorder => _y + _height; + public int ObjectMiddleHorizontal => _x + _width / 2; + public int ObjectMiddleVertical => _y + _height / 2; + + public ObjectParameters(int x, int y, int width, int height) + { + _x = x; + _y = y; + _width = width; + _height = height; + } +} diff --git a/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/StrategyStatus.cs b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/StrategyStatus.cs new file mode 100644 index 0000000..a3e37e9 --- /dev/null +++ b/Project_SelfPropelledArtilleryUnit/Project_SelfPropelledArtilleryUnit/MovementStrategy/StrategyStatus.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Project_SelfPropelledArtilleryUnit.MovementStrategy; + +public enum StrategyStatus +{ + NotInit, + InProgress, + Finish +}