ISEbd-22 Alimova M.S. Lab Work 02 Hard #2

Closed
malimova wants to merge 9 commits from Lab2 into Lab1
17 changed files with 834 additions and 212 deletions

View File

@ -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;
}
}
}

View File

@ -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);
}
}
}

View File

@ -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;
}
}
}
}

View File

@ -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);
}
}
}
}

View File

@ -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)

View File

@ -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),
}
);
}
}
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -28,25 +28,28 @@
/// </summary>
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;
}
}

View File

@ -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;
}
}
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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();
}
}
}

View File

@ -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();
}
}
}
}
}

View File

@ -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;
}
}
}

View File

@ -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
}
}