diff --git a/AirBomber/AirBomber/AbstractStrategy.cs b/AirBomber/AirBomber/AbstractStrategy.cs new file mode 100644 index 0000000..6859bd6 --- /dev/null +++ b/AirBomber/AirBomber/AbstractStrategy.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirBomber +{ + 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(); + 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/AirBomber/AirBomber/DrawningAirBomber.cs b/AirBomber/AirBomber/DrawningAirBomber.cs index 4358657..1d4e68a 100644 --- a/AirBomber/AirBomber/DrawningAirBomber.cs +++ b/AirBomber/AirBomber/DrawningAirBomber.cs @@ -6,190 +6,37 @@ using System.Threading.Tasks; namespace AirBomber { - public class DrawningAirBomber + public class DrawningAirBomber : DrawningAirPlane { - public EntityAirBomber? EntityAirBomber { get; private set; } - private int _pictureWidth; - private int _pictureHeight; - private int _startPosX; - private int _startPosY; - private readonly int _bomberWidth = 160; - private readonly int _bomberHeight = 118; - private DrawningEngines drawningEngines; - - public bool Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bombs, bool fuelTanks, int engines, int width, int height) + public DrawningAirBomber(int speed, double weight, Color bodyColor, Color additionalColor, bool bombs, bool fuelTanks, int width, int height, int engines, int enginesShape) : + base(speed, weight, bodyColor, width, height, engines, enginesShape) { - if (width < _bomberWidth || height < _bomberHeight) + if (EntityAirPlane != null) { - return false; - } - _pictureWidth = width; - _pictureHeight = height; - EntityAirBomber = new EntityAirBomber(); - EntityAirBomber.Init(speed, weight, bodyColor, additionalColor, bombs, fuelTanks, engines); - - drawningEngines = new DrawningEngines(); - drawningEngines.SetAmount(engines); - - return true; - } - - public void SetPosition(int x, int y) - { - if (x < 0 || x + _bomberWidth > _pictureWidth) - { - x = _pictureWidth - _bomberWidth; - } - - if (y < 0 || y + _bomberWidth > _pictureHeight) - { - y = _pictureHeight - _bomberHeight; - } - _startPosX = x; - _startPosY = y; - } - public void MoveTransport(DirectionType direction) - { - if (EntityAirBomber == null) - { - return; - } - switch (direction) - { - case DirectionType.Left: - if (_startPosX - EntityAirBomber.Step > 0) - { - _startPosX -= (int)EntityAirBomber.Step; - } - break; - case DirectionType.Up: - if (_startPosY - EntityAirBomber.Step > 0) - { - _startPosY -= (int)EntityAirBomber.Step; - } - break; - case DirectionType.Right: - if (_startPosX + EntityAirBomber.Step + _bomberWidth < _pictureWidth) - { - _startPosX += (int)EntityAirBomber.Step; - } - break; - case DirectionType.Down: - if (_startPosY + EntityAirBomber.Step + _bomberHeight < _pictureHeight) - { - _startPosY += (int)EntityAirBomber.Step; - } - break; + EntityAirPlane = new EntityAirBomber(speed, weight, bodyColor, additionalColor, bombs, fuelTanks); } } - public void DrawBomber(Graphics g) + public override void DrawPlane(Graphics g) { - if (EntityAirBomber == null) + if (EntityAirPlane is not EntityAirBomber airBomber) { return; } Pen pen = new(Color.Black); - Brush additionalBrush = new SolidBrush(EntityAirBomber.AdditionalColor); - Brush bodyColor = new SolidBrush(EntityAirBomber.BodyColor); - Brush wingsColor = new SolidBrush(Color.DeepPink); - if (EntityAirBomber.Bombs) - { - g.FillEllipse(additionalBrush, _startPosX + 140, _startPosY + 50, 15, 15); - g.DrawEllipse(pen, _startPosX + 140, _startPosY + 50, 15, 15); - g.FillEllipse(additionalBrush, _startPosX + 140, _startPosY + 30, 15, 15); - g.DrawEllipse(pen, _startPosX + 140, _startPosY + 30, 15, 15); - g.FillEllipse(additionalBrush, _startPosX + 140, _startPosY + 70, 15, 15); - g.DrawEllipse(pen, _startPosX + 140, _startPosY + 70, 15, 15); - } - g.FillPolygon(additionalBrush, new Point[] //nose - { - new Point(_startPosX + 19, _startPosY + 50), - new Point(_startPosX + 19, _startPosY + 69), - new Point(_startPosX + 1, _startPosY + 59), - } - ); - g.FillRectangle(bodyColor, _startPosX + 20, _startPosY + 50, 120, 20); //body - g.FillPolygon(additionalBrush, new Point[] //up left wing - { - new Point(_startPosX + 36, _startPosY + 49), - new Point(_startPosX + 36, _startPosY + 1), - new Point(_startPosX + 45, _startPosY + 1), - new Point(_startPosX + 55, _startPosY + 49), - } - ); - g.FillPolygon(additionalBrush, new Point[] //down left wing - { - new Point(_startPosX + 36, _startPosY + 71), - new Point(_startPosX + 36, _startPosY + 116), - new Point(_startPosX + 45, _startPosY + 116), - new Point(_startPosX + 54, _startPosY + 71), - } - ); - g.FillPolygon(wingsColor, new Point[] //up right wing - { - new Point(_startPosX + 120, _startPosY + 49), - new Point(_startPosX + 120, _startPosY + 42), - new Point(_startPosX + 140, _startPosY + 7), - new Point(_startPosX + 140, _startPosY + 49), - } - ); - g.FillPolygon(wingsColor, new Point[] //down right wing - { - new Point(_startPosX + 120, _startPosY + 70), - new Point(_startPosX + 120, _startPosY + 77), - new Point(_startPosX + 140, _startPosY + 112), - new Point(_startPosX + 140, _startPosY + 70), - } - ); - - g.DrawPolygon(pen, new Point[] //nose - { - new Point(_startPosX + 20, _startPosY + 49), - new Point(_startPosX + 20, _startPosY + 70), - new Point(_startPosX, _startPosY + 59), - } - ); - g.DrawRectangle(pen, _startPosX + 19, _startPosY + 49, 121, 21); //body - g.DrawPolygon(pen, new Point[] //up left wing - { - new Point(_startPosX + 35, _startPosY + 49), - new Point(_startPosX + 35, _startPosY), - new Point(_startPosX + 45, _startPosY), - new Point(_startPosX + 55, _startPosY + 49), - } - ); - g.DrawPolygon(pen, new Point[] //down left wing - { - new Point(_startPosX + 36, _startPosY + 71), - new Point(_startPosX + 36, _startPosY + 116), - new Point(_startPosX + 45, _startPosY + 116), - new Point(_startPosX + 54, _startPosY + 71), - } - ); - g.DrawPolygon(pen, new Point[] //up right wing - { - new Point(_startPosX + 120, _startPosY + 49), - new Point(_startPosX + 120, _startPosY + 42), - new Point(_startPosX + 140, _startPosY + 7), - new Point(_startPosX + 140, _startPosY + 49), - } - ); - g.DrawPolygon(pen, new Point[] //down right wing - { - new Point(_startPosX + 120, _startPosY + 70), - new Point(_startPosX + 120, _startPosY + 77), - new Point(_startPosX + 140, _startPosY + 112), - new Point(_startPosX + 140, _startPosY + 70), - } - ); - if (EntityAirBomber.FuelTanks) - { - g.FillRectangle(additionalBrush, _startPosX + 85, _startPosY + 34, 30, 15); - g.DrawRectangle(pen, _startPosX + 85, _startPosY + 34, 30, 15); - g.FillRectangle(additionalBrush, _startPosX + 85, _startPosY + 70, 30, 15); - g.DrawRectangle(pen, _startPosX + 85, _startPosY + 70, 30, 15); - } - drawningEngines.DrawEngines(g, _startPosX, _startPosY); + Brush additionalBrush = new SolidBrush(airBomber.AdditionalColor); + base.DrawPlane(g); + // bombs + g.FillEllipse(additionalBrush, _startPosX + 140, _startPosY + 50, 15, 15); + g.DrawEllipse(pen, _startPosX + 140, _startPosY + 50, 15, 15); + g.FillEllipse(additionalBrush, _startPosX + 140, _startPosY + 30, 15, 15); + g.DrawEllipse(pen, _startPosX + 140, _startPosY + 30, 15, 15); + g.FillEllipse(additionalBrush, _startPosX + 140, _startPosY + 70, 15, 15); + g.DrawEllipse(pen, _startPosX + 140, _startPosY + 70, 15, 15); + // fueltanks + g.FillRectangle(additionalBrush, _startPosX + 85, _startPosY + 34, 30, 15); + g.DrawRectangle(pen, _startPosX + 85, _startPosY + 34, 30, 15); + g.FillRectangle(additionalBrush, _startPosX + 85, _startPosY + 70, 30, 15); + g.DrawRectangle(pen, _startPosX + 85, _startPosY + 70, 30, 15); } } } diff --git a/AirBomber/AirBomber/DrawningAirPlane.cs b/AirBomber/AirBomber/DrawningAirPlane.cs new file mode 100644 index 0000000..b28b224 --- /dev/null +++ b/AirBomber/AirBomber/DrawningAirPlane.cs @@ -0,0 +1,193 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirBomber +{ + public class DrawningAirPlane + { + public EntityAirPlane? EntityAirPlane { get; protected set; } + private int _pictureWidth; + private int _pictureHeight; + protected int _startPosX; + protected int _startPosY; + protected readonly int _airPlaneWidth = 150; + protected readonly int _airPlaneHeight = 118; + private IDrawningEngines drawningEngines; + public DrawningAirPlane(int speed, double weight, Color bodyColor, int width, int height, int engines, int enginesShape) + { + if (width < _airPlaneWidth || height < _airPlaneHeight) + { + return; + } + _pictureWidth = width; + _pictureHeight = height; + EntityAirPlane = new EntityAirPlane(speed, weight, bodyColor); + switch (enginesShape) + { + case 1: + drawningEngines = new DrawningEnginesCircle(); + break; + case 2: + drawningEngines = new DrawningEnginesTriangle(); + break; + default: + drawningEngines = new DrawningEnginesRectangle(); + break; + } + drawningEngines.SetAmount(engines); + } + public void SetPosition(int x, int y) + { + if (x < 0 || x + _airPlaneWidth > _pictureWidth) + { + x = _pictureWidth - _airPlaneWidth; + } + if (y < 0 || y + _airPlaneHeight > _pictureHeight) + { + y = _pictureHeight - _airPlaneHeight; + } + _startPosX = x; + _startPosY = y; + } + public virtual void DrawPlane(Graphics g) + { + if (EntityAirPlane == null) + { + return; + } + Pen pen = new(Color.Black); + Brush bodyColor = new SolidBrush(EntityAirPlane.BodyColor); + Brush wingsColor = new SolidBrush(Color.DeepPink); + g.FillPolygon(bodyColor, new Point[] //nose + { + new Point(_startPosX + 19, _startPosY + 50), + new Point(_startPosX + 19, _startPosY + 69), + new Point(_startPosX + 1, _startPosY + 59), + } + ); + g.FillRectangle(bodyColor, _startPosX + 20, _startPosY + 50, 120, 20); //body + g.FillPolygon(bodyColor, new Point[] //up left wing + { + new Point(_startPosX + 36, _startPosY + 49), + new Point(_startPosX + 36, _startPosY + 1), + new Point(_startPosX + 45, _startPosY + 1), + new Point(_startPosX + 55, _startPosY + 49), + } + ); + g.FillPolygon(bodyColor, new Point[] //down left wing + { + new Point(_startPosX + 36, _startPosY + 71), + new Point(_startPosX + 36, _startPosY + 116), + new Point(_startPosX + 45, _startPosY + 116), + new Point(_startPosX + 54, _startPosY + 71), + } + ); + g.FillPolygon(wingsColor, new Point[] //up right wing + { + new Point(_startPosX + 120, _startPosY + 49), + new Point(_startPosX + 120, _startPosY + 42), + new Point(_startPosX + 140, _startPosY + 7), + new Point(_startPosX + 140, _startPosY + 49), + } + ); + g.FillPolygon(wingsColor, new Point[] //down right wing + { + new Point(_startPosX + 120, _startPosY + 70), + new Point(_startPosX + 120, _startPosY + 77), + new Point(_startPosX + 140, _startPosY + 112), + new Point(_startPosX + 140, _startPosY + 70), + } + ); + + g.DrawPolygon(pen, new Point[] //nose + { + new Point(_startPosX + 20, _startPosY + 49), + new Point(_startPosX + 20, _startPosY + 70), + new Point(_startPosX, _startPosY + 59), + } + ); + g.DrawRectangle(pen, _startPosX + 19, _startPosY + 49, 121, 21); //body + g.DrawPolygon(pen, new Point[] //up left wing + { + new Point(_startPosX + 35, _startPosY + 49), + new Point(_startPosX + 35, _startPosY), + new Point(_startPosX + 45, _startPosY), + new Point(_startPosX + 55, _startPosY + 49), + } + ); + g.DrawPolygon(pen, new Point[] //down left wing + { + new Point(_startPosX + 36, _startPosY + 71), + new Point(_startPosX + 36, _startPosY + 116), + new Point(_startPosX + 45, _startPosY + 116), + new Point(_startPosX + 54, _startPosY + 71), + } + ); + g.DrawPolygon(pen, new Point[] //up right wing + { + new Point(_startPosX + 120, _startPosY + 49), + new Point(_startPosX + 120, _startPosY + 42), + new Point(_startPosX + 140, _startPosY + 7), + new Point(_startPosX + 140, _startPosY + 49), + } + ); + g.DrawPolygon(pen, new Point[] //down right wing + { + new Point(_startPosX + 120, _startPosY + 70), + new Point(_startPosX + 120, _startPosY + 77), + new Point(_startPosX + 140, _startPosY + 112), + new Point(_startPosX + 140, _startPosY + 70), + } + ); + drawningEngines.DrawEngines(g, _startPosX, _startPosY); + } + public int GetPosX => _startPosX; + public int GetPosY => _startPosY; + public int GetWidth => _airPlaneWidth; + public int GetHeight => _airPlaneHeight; + public bool CanMove(DirectionType direction) + { + if (EntityAirPlane == null) + { + return false; + } + return direction switch + { + //влево + DirectionType.Left => _startPosX - EntityAirPlane.Step > 0, + //вверх + DirectionType.Up => _startPosY - EntityAirPlane.Step > 0, + // вправо + DirectionType.Right => _startPosX + EntityAirPlane.Step + _airPlaneWidth < _pictureWidth, + //вниз + DirectionType.Down => _startPosY + EntityAirPlane.Step + _airPlaneHeight < _pictureHeight, + _ => false, + }; + } + public void MovePlane(DirectionType direction) + { + if (!CanMove(direction) || EntityAirPlane == null) + { + return; + } + switch (direction) + { + case DirectionType.Left: + _startPosX -= (int)EntityAirPlane.Step; + break; + case DirectionType.Up: + _startPosY -= (int)EntityAirPlane.Step; + break; + case DirectionType.Right: + _startPosX += (int)EntityAirPlane.Step; + break; + case DirectionType.Down: + _startPosY += (int)EntityAirPlane.Step; + break; + } + } + } +} diff --git a/AirBomber/AirBomber/DrawningEnginesCircle.cs b/AirBomber/AirBomber/DrawningEnginesCircle.cs new file mode 100644 index 0000000..e6ae763 --- /dev/null +++ b/AirBomber/AirBomber/DrawningEnginesCircle.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirBomber +{ + public class DrawningEnginesCircle : IDrawningEngines + { + private Engines amount; + public void SetAmount(int a) + { + if (a <= 2) + { + amount = Engines.Two; + } + else if (a == 4) + { + amount = Engines.Four; + } + else if (a >= 6) + { + amount = Engines.Six; + } + } + public void DrawEngines(Graphics g, int _startPosX, int _startPosY) + { + Brush enginesColor = new SolidBrush(Color.Black); + + g.FillPolygon(enginesColor, new Point[] //two up + { + new Point(_startPosX + 51, _startPosY + 30), + new Point(_startPosX + 75, _startPosY + 30), + new Point(_startPosX + 75, _startPosY + 40), + new Point(_startPosX + 53, _startPosY + 40), + } + ); + g.FillEllipse(enginesColor, _startPosX + 71, _startPosY + 28, 13, 13); + g.FillPolygon(enginesColor, new Point[] //two down + { + new Point(_startPosX + 52, _startPosY + 80), + new Point(_startPosX + 75, _startPosY + 80), + new Point(_startPosX + 75, _startPosY + 90), + new Point(_startPosX + 50, _startPosY + 90), + } + ); + g.FillEllipse(enginesColor, _startPosX + 71, _startPosY + 78, 13, 13); + + if (amount == Engines.Four || amount == Engines.Six) + { + g.FillPolygon(enginesColor, new Point[] //four up + { + new Point(_startPosX + 48, _startPosY + 18), + new Point(_startPosX + 75, _startPosY + 18), + new Point(_startPosX + 75, _startPosY + 28), + new Point(_startPosX + 50, _startPosY + 28), + } + ); + g.FillEllipse(enginesColor, _startPosX + 71, _startPosY + 16, 13, 13); + g.FillPolygon(enginesColor, new Point[] //four down + { + new Point(_startPosX + 49, _startPosY + 92), + new Point(_startPosX + 75, _startPosY + 92), + new Point(_startPosX + 75, _startPosY + 102), + new Point(_startPosX + 47, _startPosY + 102), + } + ); + g.FillEllipse(enginesColor, _startPosX + 71, _startPosY + 90, 13, 13); + } + if (amount == Engines.Six) + { + g.FillPolygon(enginesColor, new Point[] //six up + { + new Point(_startPosX + 46, _startPosY + 6), + new Point(_startPosX + 75, _startPosY + 6), + new Point(_startPosX + 75, _startPosY + 16), + new Point(_startPosX + 48, _startPosY + 16), + } + ); + g.FillEllipse(enginesColor, _startPosX + 71, _startPosY + 4, 13, 13); + g.FillPolygon(enginesColor, new Point[] //six down + { + new Point(_startPosX + 47, _startPosY + 104), + new Point(_startPosX + 75, _startPosY + 104), + new Point(_startPosX + 75, _startPosY + 114), + new Point(_startPosX + 45, _startPosY + 114), + } + ); + g.FillEllipse(enginesColor, _startPosX + 71, _startPosY + 102, 13, 13); + } + } + } +} diff --git a/AirBomber/AirBomber/DrawningEngines.cs b/AirBomber/AirBomber/DrawningEnginesRectangle.cs similarity index 98% rename from AirBomber/AirBomber/DrawningEngines.cs rename to AirBomber/AirBomber/DrawningEnginesRectangle.cs index 64d97f8..8801ec8 100644 --- a/AirBomber/AirBomber/DrawningEngines.cs +++ b/AirBomber/AirBomber/DrawningEnginesRectangle.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace AirBomber { - internal class DrawningEngines + public class DrawningEnginesRectangle : IDrawningEngines { private Engines amount; public void SetAmount(int a) diff --git a/AirBomber/AirBomber/DrawningEnginesTriangle.cs b/AirBomber/AirBomber/DrawningEnginesTriangle.cs new file mode 100644 index 0000000..bd6b48b --- /dev/null +++ b/AirBomber/AirBomber/DrawningEnginesTriangle.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirBomber +{ + public class DrawningEnginesTriangle : IDrawningEngines + { + private Engines amount; + public void SetAmount(int a) + { + if (a <= 2) + { + amount = Engines.Two; + } + else if (a == 4) + { + amount = Engines.Four; + } + else if (a >= 6) + { + amount = Engines.Six; + } + } + public void DrawEngines(Graphics g, int _startPosX, int _startPosY) + { + Brush enginesColor = new SolidBrush(Color.Black); + + g.FillPolygon(enginesColor, new Point[] //two up + { + new Point(_startPosX + 51, _startPosY + 30), + new Point(_startPosX + 75, _startPosY + 30), + new Point(_startPosX + 75, _startPosY + 40), + new Point(_startPosX + 53, _startPosY + 40), + } + ); + g.FillPolygon(enginesColor, new Point[] //two up TRIANGLE SHAPE + { + new Point(_startPosX + 73, _startPosY + 33), + new Point(_startPosX + 80, _startPosY + 28), + new Point(_startPosX + 80, _startPosY + 41), + } + ); + g.FillPolygon(enginesColor, new Point[] //two down + { + new Point(_startPosX + 52, _startPosY + 80), + new Point(_startPosX + 75, _startPosY + 80), + new Point(_startPosX + 75, _startPosY + 90), + new Point(_startPosX + 50, _startPosY + 90), + } + ); + g.FillPolygon(enginesColor, new Point[] //two down TRIANGLE SHAPE + { + new Point(_startPosX + 73, _startPosY + 83), + new Point(_startPosX + 80, _startPosY + 78), + new Point(_startPosX + 80, _startPosY + 91), + } + ); + + if (amount == Engines.Four || amount == Engines.Six) + { + g.FillPolygon(enginesColor, new Point[] //four up + { + new Point(_startPosX + 48, _startPosY + 18), + new Point(_startPosX + 75, _startPosY + 18), + new Point(_startPosX + 75, _startPosY + 28), + new Point(_startPosX + 50, _startPosY + 28), + } + ); + g.FillPolygon(enginesColor, new Point[] //four up TRIANGLE SHAPE + { + new Point(_startPosX + 73, _startPosY + 23), + new Point(_startPosX + 80, _startPosY + 16), + new Point(_startPosX + 80, _startPosY + 27), + } + ); + g.FillPolygon(enginesColor, new Point[] //four down + { + new Point(_startPosX + 49, _startPosY + 92), + new Point(_startPosX + 75, _startPosY + 92), + new Point(_startPosX + 75, _startPosY + 102), + new Point(_startPosX + 47, _startPosY + 102), + } + ); + g.FillPolygon(enginesColor, new Point[] //four down TRIANGLE SHAPE + { + new Point(_startPosX + 73, _startPosY + 97), + new Point(_startPosX + 80, _startPosY + 92), + new Point(_startPosX + 80, _startPosY + 105), + } + ); + } + if (amount == Engines.Six) + { + g.FillPolygon(enginesColor, new Point[] //six up + { + new Point(_startPosX + 46, _startPosY + 6), + new Point(_startPosX + 75, _startPosY + 6), + new Point(_startPosX + 75, _startPosY + 16), + new Point(_startPosX + 48, _startPosY + 16), + } + ); + g.FillPolygon(enginesColor, new Point[] //six up TRIANGLE SHAPE + { + new Point(_startPosX + 73, _startPosY + 11), + new Point(_startPosX + 80, _startPosY + 5), + new Point(_startPosX + 80, _startPosY + 17), + } + ); + g.FillPolygon(enginesColor, new Point[] //six down + { + new Point(_startPosX + 47, _startPosY + 104), + new Point(_startPosX + 75, _startPosY + 104), + new Point(_startPosX + 75, _startPosY + 114), + new Point(_startPosX + 45, _startPosY + 114), + } + ); + g.FillPolygon(enginesColor, new Point[] //six down TRIANGLE SHAPE + { + new Point(_startPosX + 73, _startPosY + 109), + new Point(_startPosX + 80, _startPosY + 103), + new Point(_startPosX + 80, _startPosY + 115), + } + ); + } + } + } +} diff --git a/AirBomber/AirBomber/DrawningObjectAirPlane.cs b/AirBomber/AirBomber/DrawningObjectAirPlane.cs new file mode 100644 index 0000000..90aa636 --- /dev/null +++ b/AirBomber/AirBomber/DrawningObjectAirPlane.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirBomber +{ + public class DrawningObjectAirPlane : IMoveableObject + { + private readonly DrawningAirPlane? _drawningAirPlane = null; + public DrawningObjectAirPlane(DrawningAirPlane drawningAirPlane) + { + _drawningAirPlane = drawningAirPlane; + } + public ObjectParameters? GetObjectPosition + { + get + { + if (_drawningAirPlane == null || _drawningAirPlane.EntityAirPlane == null) + { + return null; + } + return new ObjectParameters(_drawningAirPlane.GetPosX, _drawningAirPlane.GetPosY, _drawningAirPlane.GetWidth, _drawningAirPlane.GetHeight); + } + } + public int GetStep => (int)(_drawningAirPlane?.EntityAirPlane?.Step ?? 0); + public bool CheckCanMove(DirectionType direction) => _drawningAirPlane?.CanMove(direction) ?? false; + public void MoveObject(DirectionType direction) => _drawningAirPlane?.MovePlane(direction); + } +} diff --git a/AirBomber/AirBomber/EntityAirBomber.cs b/AirBomber/AirBomber/EntityAirBomber.cs index 3d1c052..2b4b3fa 100644 --- a/AirBomber/AirBomber/EntityAirBomber.cs +++ b/AirBomber/AirBomber/EntityAirBomber.cs @@ -6,25 +6,16 @@ using System.Threading.Tasks; namespace AirBomber { - public class EntityAirBomber + public class EntityAirBomber : EntityAirPlane { - 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 Bombs { get; private set; } public bool FuelTanks { get; private set; } - public int Engines { get; private set; } - public double Step => (double)Speed * 100 / Weight; - public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool bombs, bool fuelTanks, int engines) + public EntityAirBomber(int speed, double weight, Color bodyColor, Color additionalColor, bool bombs, bool fuelTanks) : base(speed, weight, bodyColor) { - Speed = speed; - Weight = weight; - BodyColor = bodyColor; AdditionalColor = additionalColor; Bombs = bombs; FuelTanks = fuelTanks; - Engines = engines; } } } diff --git a/AirBomber/AirBomber/EntityAirPlane.cs b/AirBomber/AirBomber/EntityAirPlane.cs new file mode 100644 index 0000000..a4b993e --- /dev/null +++ b/AirBomber/AirBomber/EntityAirPlane.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirBomber +{ + public class EntityAirPlane + { + 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 EntityAirPlane(int speed, double weight, Color bodyColor) + { + Speed = speed; + Weight = weight; + BodyColor = bodyColor; + } + } +} diff --git a/AirBomber/AirBomber/FormAirBomber.Designer.cs b/AirBomber/AirBomber/FormAirBomber.Designer.cs index c0d96ee..a8ba700 100644 --- a/AirBomber/AirBomber/FormAirBomber.Designer.cs +++ b/AirBomber/AirBomber/FormAirBomber.Designer.cs @@ -28,25 +28,28 @@ /// private void InitializeComponent() { - buttonCreate = new Button(); + buttonCreateAirBomber = new Button(); buttonLeft = new Button(); buttonRight = new Button(); buttonUp = new Button(); buttonDown = new Button(); pictureBoxAirBomber = new PictureBox(); + buttonCreateAirPlane = new Button(); + comboBoxStrategy = new ComboBox(); + buttonStep = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxAirBomber).BeginInit(); SuspendLayout(); // - // buttonCreate + // buttonCreateAirBomber // - buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; - buttonCreate.Location = new Point(47, 364); - buttonCreate.Name = "buttonCreate"; - buttonCreate.Size = new Size(186, 45); - buttonCreate.TabIndex = 0; - buttonCreate.Text = "Создать"; - buttonCreate.UseVisualStyleBackColor = true; - buttonCreate.Click += buttonCreate_Click; + buttonCreateAirBomber.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateAirBomber.Location = new Point(40, 343); + buttonCreateAirBomber.Name = "buttonCreateAirBomber"; + buttonCreateAirBomber.Size = new Size(186, 66); + buttonCreateAirBomber.TabIndex = 0; + buttonCreateAirBomber.Text = "Создать бомбардировщик"; + buttonCreateAirBomber.UseVisualStyleBackColor = true; + buttonCreateAirBomber.Click += buttonCreateAirBomber_Click; // // buttonLeft // @@ -105,16 +108,51 @@ pictureBoxAirBomber.TabIndex = 5; pictureBoxAirBomber.TabStop = false; // + // buttonCreateAirPlane + // + buttonCreateAirPlane.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonCreateAirPlane.Location = new Point(248, 343); + buttonCreateAirPlane.Name = "buttonCreateAirPlane"; + buttonCreateAirPlane.Size = new Size(186, 66); + buttonCreateAirPlane.TabIndex = 6; + buttonCreateAirPlane.Text = "Создать самолёт"; + buttonCreateAirPlane.UseVisualStyleBackColor = true; + buttonCreateAirPlane.Click += buttonCreateAirPlane_Click; + // + // comboBoxStrategy + // + comboBoxStrategy.Anchor = AnchorStyles.Top | AnchorStyles.Right; + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Items.AddRange(new object[] { "MoveToCenter", "MoveToBorder" }); + comboBoxStrategy.Location = new Point(590, 21); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(182, 33); + comboBoxStrategy.TabIndex = 7; + // + // buttonStep + // + buttonStep.Anchor = AnchorStyles.Top | AnchorStyles.Right; + buttonStep.Location = new Point(660, 70); + buttonStep.Name = "buttonStep"; + buttonStep.Size = new Size(112, 34); + buttonStep.TabIndex = 8; + buttonStep.Text = "Шаг"; + buttonStep.UseVisualStyleBackColor = true; + buttonStep.Click += buttonStep_Click; + // // FormAirBomber // AutoScaleDimensions = new SizeF(10F, 25F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(800, 450); + Controls.Add(buttonStep); + Controls.Add(comboBoxStrategy); + Controls.Add(buttonCreateAirPlane); Controls.Add(buttonDown); Controls.Add(buttonUp); Controls.Add(buttonRight); Controls.Add(buttonLeft); - Controls.Add(buttonCreate); + Controls.Add(buttonCreateAirBomber); Controls.Add(pictureBoxAirBomber); Name = "FormAirBomber"; Text = "Бомбардировщик"; @@ -124,11 +162,14 @@ #endregion - private Button buttonCreate; + private Button buttonCreateAirBomber; private Button buttonLeft; private Button buttonRight; private Button buttonUp; private Button buttonDown; private PictureBox pictureBoxAirBomber; + private Button buttonCreateAirPlane; + private ComboBox comboBoxStrategy; + private Button buttonStep; } } \ No newline at end of file diff --git a/AirBomber/AirBomber/FormAirBomber.cs b/AirBomber/AirBomber/FormAirBomber.cs index 2612e1c..6922714 100644 --- a/AirBomber/AirBomber/FormAirBomber.cs +++ b/AirBomber/AirBomber/FormAirBomber.cs @@ -2,36 +2,48 @@ namespace AirBomber { public partial class FormAirBomber : Form { - private DrawningAirBomber? _drawningAirBomber; + private DrawningAirPlane? _drawningAirPlane; + private AbstractStrategy? _abstractStrategy; public FormAirBomber() { InitializeComponent(); } private void Draw() { - if (_drawningAirBomber == null) + if (_drawningAirPlane == null) { return; } Bitmap bmp = new(pictureBoxAirBomber.Width, pictureBoxAirBomber.Height); Graphics gr = Graphics.FromImage(bmp); - _drawningAirBomber.DrawBomber(gr); + _drawningAirPlane.DrawPlane(gr); pictureBoxAirBomber.Image = bmp; } - private void buttonCreate_Click(object sender, EventArgs e) + private void buttonCreateAirBomber_Click(object sender, EventArgs e) { Random random = new(); - _drawningAirBomber = new DrawningAirBomber(); - _drawningAirBomber.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)), - random.Next(1, 4) * 2, pictureBoxAirBomber.Width, pictureBoxAirBomber.Height); + _drawningAirPlane = new DrawningAirBomber(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)), + pictureBoxAirBomber.Width, pictureBoxAirBomber.Height, random.Next(1, 4) * 2, random.Next(0, 4)); - _drawningAirBomber.SetPosition(random.Next(10, 100), random.Next(10, 100)); + _drawningAirPlane.SetPosition(random.Next(10, 100), random.Next(10, 100)); + Draw(); + + } + private void buttonCreateAirPlane_Click(object sender, EventArgs e) + { + Random random = new(); + _drawningAirPlane = new DrawningAirPlane(random.Next(100, 300), random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + pictureBoxAirBomber.Width, pictureBoxAirBomber.Height, random.Next(1, 4) * 2, random.Next(0, 4)); + + _drawningAirPlane.SetPosition(random.Next(10, 100), random.Next(10, 100)); Draw(); } private void buttonMove_Click(object sender, EventArgs e) { - if (_drawningAirBomber == null) + if (_drawningAirPlane == null) { return; } @@ -39,19 +51,54 @@ namespace AirBomber switch (name) { case "buttonUp": - _drawningAirBomber.MoveTransport(DirectionType.Up); + _drawningAirPlane.MovePlane(DirectionType.Up); break; case "buttonDown": - _drawningAirBomber.MoveTransport(DirectionType.Down); + _drawningAirPlane.MovePlane(DirectionType.Down); break; case "buttonLeft": - _drawningAirBomber.MoveTransport(DirectionType.Left); + _drawningAirPlane.MovePlane(DirectionType.Left); break; case "buttonRight": - _drawningAirBomber.MoveTransport(DirectionType.Right); + _drawningAirPlane.MovePlane(DirectionType.Right); break; } Draw(); } + private void buttonStep_Click(object sender, EventArgs e) + { + if (_drawningAirPlane == null) + { + return; + } + if (comboBoxStrategy.Enabled) + { + _abstractStrategy = comboBoxStrategy.SelectedIndex + switch + { + 0 => new MoveToCenter(), + 1 => new MoveToBorder(), + _ => null, + }; + if (_abstractStrategy == null) + { + return; + } + _abstractStrategy.SetData(new DrawningObjectAirPlane(_drawningAirPlane), pictureBoxAirBomber.Width, + pictureBoxAirBomber.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/AirBomber/AirBomber/IDrawningEngines.cs b/AirBomber/AirBomber/IDrawningEngines.cs new file mode 100644 index 0000000..dfeb2c8 --- /dev/null +++ b/AirBomber/AirBomber/IDrawningEngines.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirBomber +{ + internal interface IDrawningEngines + { + public void SetAmount(int a); + public void DrawEngines(Graphics g, int _startPosX, int _startPosY); + } +} diff --git a/AirBomber/AirBomber/IMoveableObject.cs b/AirBomber/AirBomber/IMoveableObject.cs new file mode 100644 index 0000000..10bbf1b --- /dev/null +++ b/AirBomber/AirBomber/IMoveableObject.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirBomber +{ + public interface IMoveableObject + { + ObjectParameters? GetObjectPosition { get; } + int GetStep { get; } + bool CheckCanMove(DirectionType direction); + void MoveObject(DirectionType direction); + } +} diff --git a/AirBomber/AirBomber/MoveToBorder.cs b/AirBomber/AirBomber/MoveToBorder.cs new file mode 100644 index 0000000..b853ffd --- /dev/null +++ b/AirBomber/AirBomber/MoveToBorder.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirBomber +{ + public class MoveToBorder : 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/AirBomber/AirBomber/MoveToCenter.cs b/AirBomber/AirBomber/MoveToCenter.cs new file mode 100644 index 0000000..99711ff --- /dev/null +++ b/AirBomber/AirBomber/MoveToCenter.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirBomber +{ + 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/AirBomber/AirBomber/ObjectParameters.cs b/AirBomber/AirBomber/ObjectParameters.cs new file mode 100644 index 0000000..b710e36 --- /dev/null +++ b/AirBomber/AirBomber/ObjectParameters.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirBomber +{ + 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/AirBomber/AirBomber/Status.cs b/AirBomber/AirBomber/Status.cs new file mode 100644 index 0000000..3e0828d --- /dev/null +++ b/AirBomber/AirBomber/Status.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirBomber +{ + public enum Status + { + NotInit, + InProgress, + Finish + } +}