Compare commits

..

No commits in common. "0b087e4583e528d6a075329caa84d7fbe2b3d29f" and "110730bc992e0fae09d855e24bec2190ecfd20d2" have entirely different histories.

17 changed files with 139 additions and 836 deletions

View File

@ -0,0 +1,12 @@
namespace ProjectAirFighter;
public enum DirectionType
{
Up = 1,
Down = 2,
Left = 3,
Right = 4
}

View File

@ -1,100 +1,31 @@
using ProjectAirFighter.Entities; namespace ProjectAirFighter;
namespace ProjectAirFighter.Drawnings; public class DrawningAirFighter
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение базового объекта-сущности
/// </summary>
public class DrawningFighter
{ {
/// <summary> public EntityAirFighter? EntityAirFighter { get; private set; }
/// Класс-сущность
/// </summary>
public EntityFighter? EntityFighter { get; protected set; }
/// <summary>
/// Ширина окна
/// </summary>
private int? _pictureWidth; private int? _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int? _pictureHeight; private int? _pictureHeight;
/// <summary> private int? _startPosX;
/// Левая координата прорисовки самолёта
/// </summary>
protected int? _startPosX;
/// <summary> private int? _startPosY;
/// Верхняя кооридната прорисовки самолёта
/// </summary>
protected int? _startPosY;
/// <summary>
/// Ширина прорисовки самолёта
/// </summary>
private readonly int _drawningFighterWidth = 70; private readonly int _drawningFighterWidth = 70;
/// <summary>
/// Высота прорисовки самолёта
/// </summary>
private readonly int _drawningFighterHeight = 70; private readonly int _drawningFighterHeight = 70;
/// <summary> public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool wings, bool rockets)
/// Координата X объекта
/// </summary>
public int? GetPosX => _startPosX;
/// <summary>
/// Координата Y объекта
/// </summary>
public int? GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth => _drawningFighterWidth;
/// <summary>
/// Высота объекта
/// </summary>
public int GetHeight => _drawningFighterHeight;
/// <summary>
/// Пустой конструктор
/// </summary>
private DrawningFighter()
{ {
EntityAirFighter = new EntityAirFighter();
EntityAirFighter.Init(speed, weight, bodyColor, additionalColor, wings, rockets);
_pictureWidth = null; _pictureWidth = null;
_pictureHeight = null; _pictureHeight = null;
_startPosX = null; _startPosX = null;
_startPosY = null; _startPosY = null;
} }
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
public DrawningFighter (int speed, double weight, Color bodyColor) : this()
{
EntityFighter = new EntityFighter(speed, weight, bodyColor);
}
/// <summary>
/// Конструктор для наследников
/// </summary>
/// <param name="drawningCarWidth">Ширина прорисовки самолёта</param>
/// <param name="drawningCarHeight">Высота прорисовки самолёта</param>
protected DrawningFighter(int drawningFighterWidth, int drawningFighterHeight) : this()
{
_drawningFighterWidth = drawningFighterWidth;
_drawningFighterHeight = drawningFighterHeight;
}
public bool SetPictureSize(int width, int height) public bool SetPictureSize(int width, int height)
{ {
if (_drawningFighterWidth < width && _drawningFighterHeight < height) if (_drawningFighterWidth < width && _drawningFighterHeight < height)
@ -146,7 +77,7 @@ public class DrawningFighter
public bool MoveTransport(DirectionType direction) public bool MoveTransport(DirectionType direction)
{ {
if (EntityFighter == null || !_startPosX.HasValue || !_startPosY.HasValue) if (EntityAirFighter == null || !_startPosX.HasValue || !_startPosY.HasValue)
{ {
return false; return false;
} }
@ -154,27 +85,27 @@ public class DrawningFighter
switch (direction) switch (direction)
{ {
case DirectionType.Left: case DirectionType.Left:
if (_startPosX.Value - EntityFighter.Step > 0) if (_startPosX.Value - EntityAirFighter.Step > 0)
{ {
_startPosX -= (int)EntityFighter.Step; _startPosX -= (int)EntityAirFighter.Step;
} }
return true; return true;
case DirectionType.Up: case DirectionType.Up:
if (_startPosY.Value - EntityFighter.Step > 0) if (_startPosY.Value - EntityAirFighter.Step > 0)
{ {
_startPosY -= (int)EntityFighter.Step; _startPosY -= (int)EntityAirFighter.Step;
} }
return true; return true;
case DirectionType.Right: case DirectionType.Right:
if (_startPosX.Value + _drawningFighterWidth + EntityFighter.Step < _pictureWidth) if (_startPosX.Value + _drawningFighterWidth + EntityAirFighter.Step < _pictureWidth)
{ {
_startPosX += (int)EntityFighter.Step; _startPosX += (int)EntityAirFighter.Step;
} }
return true; return true;
case DirectionType.Down: case DirectionType.Down:
if (_startPosY.Value + _drawningFighterHeight + EntityFighter.Step < _pictureHeight) if (_startPosY.Value + _drawningFighterHeight + EntityAirFighter.Step < _pictureHeight)
{ {
_startPosY += (int)EntityFighter.Step; _startPosY += (int)EntityAirFighter.Step;
} }
return true; return true;
default: default:
@ -182,15 +113,16 @@ public class DrawningFighter
} }
} }
public virtual void DrawTransport(Graphics g) public void DrawTransport(Graphics g)
{ {
if (EntityFighter == null || !_startPosX.HasValue || !_startPosY.HasValue) if (EntityAirFighter == null || !_startPosX.HasValue || !_startPosY.HasValue)
{ {
return; return;
} }
Pen pen = new(Color.Black); Pen pen = new(Color.Black);
Brush br = new SolidBrush(EntityFighter.BodyColor); Brush br = new SolidBrush(EntityAirFighter.BodyColor);
Brush additionalBrush = new SolidBrush(EntityAirFighter.AdditionalColor);
g.FillRectangle(br, _startPosX.Value + 10, _startPosY.Value + 30, 60, 10); g.FillRectangle(br, _startPosX.Value + 10, _startPosY.Value + 30, 60, 10);
g.DrawRectangle(pen, _startPosX.Value + 10, _startPosY.Value + 30, 60, 10); g.DrawRectangle(pen, _startPosX.Value + 10, _startPosY.Value + 30, 60, 10);
@ -235,5 +167,45 @@ public class DrawningFighter
Point[] HvostDown = { point13, point14, point15, point16 }; Point[] HvostDown = { point13, point14, point15, point16 };
g.FillPolygon(brPink, HvostDown); g.FillPolygon(brPink, HvostDown);
g.DrawPolygon(pen, HvostDown); g.DrawPolygon(pen, HvostDown);
if (EntityAirFighter.Wings)
{
Point wings1 = new Point(_startPosX.Value + 45, _startPosY.Value + 30);
Point wings2 = new Point(_startPosX.Value + 45, _startPosY.Value + 15);
Point wings3 = new Point(_startPosX.Value + 50, _startPosY.Value + 15);
Point wings4 = new Point(_startPosX.Value + 55, _startPosY.Value + 30);
Point[] UpWing = { wings1, wings2, wings3, wings4 };
g.FillPolygon(additionalBrush, UpWing);
g.DrawPolygon(pen, UpWing);
Point wings5 = new Point(_startPosX.Value + 45, _startPosY.Value + 40);
Point wings6 = new Point(_startPosX.Value + 45, _startPosY.Value + 55);
Point wings7 = new Point(_startPosX.Value + 50, _startPosY.Value + 55);
Point wings8 = new Point(_startPosX.Value + 55, _startPosY.Value + 40);
Point[] DownWing = { wings5, wings6, wings7, wings8 };
g.FillPolygon(additionalBrush, DownWing);
g.DrawPolygon(pen, DownWing);
}
if (EntityAirFighter.Rockets)
{
Point rocket1 = new Point(_startPosX.Value + 40, _startPosY.Value + 5);
Point rocket2 = new Point(_startPosX.Value + 15, _startPosY.Value + 5);
Point rocket3 = new Point(_startPosX.Value + 10, _startPosY.Value + 10);
Point rocket4 = new Point(_startPosX.Value + 15, _startPosY.Value + 15);
Point rocket5 = new Point(_startPosX.Value + 40, _startPosY.Value + 15);
Point[] Rocket1 = { rocket1, rocket2, rocket3, rocket4, rocket5 };
g.FillPolygon(additionalBrush, Rocket1);
g.DrawPolygon(pen, Rocket1);
Point rocket6 = new Point(_startPosX.Value + 40, _startPosY.Value + 55);
Point rocket7 = new Point(_startPosX.Value + 15, _startPosY.Value + 55);
Point rocket8 = new Point(_startPosX.Value + 10, _startPosY.Value + 60);
Point rocket9 = new Point(_startPosX.Value + 15, _startPosY.Value + 65);
Point rocket10 = new Point(_startPosX.Value + 40, _startPosY.Value + 65);
Point[] Rocket2 = { rocket6, rocket7, rocket8, rocket9, rocket10 };
g.FillPolygon(additionalBrush, Rocket2);
g.DrawPolygon(pen, Rocket2);
}
} }
} }

View File

@ -1,33 +0,0 @@
namespace ProjectAirFighter.Drawnings;
/// <summary>
/// Направление перемещения
/// </summary>
public enum DirectionType
{
/// <summary>
/// Неизвестное направление
/// </summary>
Unknow = -1,
/// <summary>
/// Вверх
/// </summary>
Up = 1,
/// <summary>
/// Вниз
/// </summary>
Down = 2,
/// <summary>
/// Влево
/// </summary>
Left = 3,
/// <summary>
/// Вправо
/// </summary>
Right = 4
}

View File

@ -1,77 +0,0 @@
using ProjectAirFighter.Entities;
namespace ProjectAirFighter.Drawnings;
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawningAirFighter : DrawningFighter
{
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="wings">Признак наличия доп крыльев</param>
/// <param name="rockets">Признак наличия ракет</param>
public DrawningAirFighter (int speed, double weight, Color bodyColor, Color additionalColor, bool wings, bool rockets) : base (70, 70)
{
EntityFighter = new EntityAirFighter(speed, weight, bodyColor, additionalColor, wings, rockets);
}
public override void DrawTransport(Graphics g)
{
if (EntityFighter == null || EntityFighter is not EntityAirFighter airFighter || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new(Color.Black);
Brush additionalBrush = new SolidBrush(airFighter.AdditionalColor);
base.DrawTransport(g);
if (airFighter.Wings)
{
Point wings1 = new Point(_startPosX.Value + 45, _startPosY.Value + 30);
Point wings2 = new Point(_startPosX.Value + 45, _startPosY.Value + 15);
Point wings3 = new Point(_startPosX.Value + 50, _startPosY.Value + 15);
Point wings4 = new Point(_startPosX.Value + 55, _startPosY.Value + 30);
Point[] UpWing = { wings1, wings2, wings3, wings4 };
g.FillPolygon(additionalBrush, UpWing);
g.DrawPolygon(pen, UpWing);
Point wings5 = new Point(_startPosX.Value + 45, _startPosY.Value + 40);
Point wings6 = new Point(_startPosX.Value + 45, _startPosY.Value + 55);
Point wings7 = new Point(_startPosX.Value + 50, _startPosY.Value + 55);
Point wings8 = new Point(_startPosX.Value + 55, _startPosY.Value + 40);
Point[] DownWing = { wings5, wings6, wings7, wings8 };
g.FillPolygon(additionalBrush, DownWing);
g.DrawPolygon(pen, DownWing);
}
if (airFighter.Rockets)
{
Point rocket1 = new Point(_startPosX.Value + 40, _startPosY.Value + 5);
Point rocket2 = new Point(_startPosX.Value + 15, _startPosY.Value + 5);
Point rocket3 = new Point(_startPosX.Value + 10, _startPosY.Value + 10);
Point rocket4 = new Point(_startPosX.Value + 15, _startPosY.Value + 15);
Point rocket5 = new Point(_startPosX.Value + 40, _startPosY.Value + 15);
Point[] Rocket1 = { rocket1, rocket2, rocket3, rocket4, rocket5 };
g.FillPolygon(additionalBrush, Rocket1);
g.DrawPolygon(pen, Rocket1);
Point rocket6 = new Point(_startPosX.Value + 40, _startPosY.Value + 55);
Point rocket7 = new Point(_startPosX.Value + 15, _startPosY.Value + 55);
Point rocket8 = new Point(_startPosX.Value + 10, _startPosY.Value + 60);
Point rocket9 = new Point(_startPosX.Value + 15, _startPosY.Value + 65);
Point rocket10 = new Point(_startPosX.Value + 40, _startPosY.Value + 65);
Point[] Rocket2 = { rocket6, rocket7, rocket8, rocket9, rocket10 };
g.FillPolygon(additionalBrush, Rocket2);
g.DrawPolygon(pen, Rocket2);
}
}
}

View File

@ -1,20 +0,0 @@
namespace ProjectAirFighter.Entities;
/// <summary>
/// Класс-сущность "Истребитель"
/// </summary>
public class EntityAirFighter : EntityFighter
{
public Color AdditionalColor { get; private set; }
public bool Wings { get; private set; }
public bool Rockets { get; private set; }
public EntityAirFighter(int speed, double weight, Color bodyColor, Color additionalColor, bool wings, bool rockets) : base(5, 45, Color.Black)
{
AdditionalColor = additionalColor;
Rockets = rockets;
Wings = wings;
}
}

View File

@ -1,29 +0,0 @@
namespace ProjectAirFighter.Entities;
/// <summary>
/// Класс-сущность "Истребитель"
/// </summary>
public class EntityFighter
{
public int Speed { get; private set; }
public double Weight { get; private set; }
public Color BodyColor { get; private set; }
public double Step => Speed * 100 / Weight;
/// <summary>
/// Конструктор сущности
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес автомобиля</param>
/// <param name="bodyColor">Основной цвет</param>
public EntityFighter (int speed, double weight, Color bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
}
}

View File

@ -0,0 +1,29 @@
namespace ProjectAirFighter;
public class EntityAirFighter
{
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 Wings { get; private set; }
public bool Rockets { get; private set; }
public double Step => Speed * 100 / Weight;
public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool wings, bool rockets)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
AdditionalColor = additionalColor;
Rockets = rockets;
Wings = wings;
}
}

View File

@ -21,35 +21,32 @@
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {
pictureBoxAirFighter = new PictureBox(); pictureBox1 = new PictureBox();
buttonCreateAirFighter = new Button(); buttonCreateAirFighter = new Button();
buttonDown = new Button(); buttonDown = new Button();
buttonRight = new Button(); buttonRight = new Button();
buttonLeft = new Button(); buttonLeft = new Button();
buttonUp = new Button(); buttonUp = new Button();
buttonCreateFighter = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
comboBoxStrategy = new ComboBox();
buttonStrategyStep = new Button();
((System.ComponentModel.ISupportInitialize)pictureBoxAirFighter).BeginInit();
SuspendLayout(); SuspendLayout();
// //
// pictureBoxAirFighter // pictureBox1
// //
pictureBoxAirFighter.Dock = DockStyle.Fill; pictureBox1.Dock = DockStyle.Fill;
pictureBoxAirFighter.Location = new Point(0, 0); pictureBox1.Location = new Point(0, 0);
pictureBoxAirFighter.Name = "pictureBoxAirFighter"; pictureBox1.Name = "pictureBox1";
pictureBoxAirFighter.Size = new Size(800, 450); pictureBox1.Size = new Size(800, 450);
pictureBoxAirFighter.TabIndex = 0; pictureBox1.TabIndex = 0;
pictureBoxAirFighter.TabStop = false; pictureBox1.TabStop = false;
// //
// buttonCreateAirFighter // buttonCreateAirFighter
// //
buttonCreateAirFighter.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; buttonCreateAirFighter.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreateAirFighter.Location = new Point(12, 409); buttonCreateAirFighter.Location = new Point(12, 409);
buttonCreateAirFighter.Name = "buttonCreateAirFighter"; buttonCreateAirFighter.Name = "buttonCreateAirFighter";
buttonCreateAirFighter.Size = new Size(169, 29); buttonCreateAirFighter.Size = new Size(94, 29);
buttonCreateAirFighter.TabIndex = 1; buttonCreateAirFighter.TabIndex = 1;
buttonCreateAirFighter.Text = "Создать истребитель"; buttonCreateAirFighter.Text = "Создать";
buttonCreateAirFighter.UseVisualStyleBackColor = true; buttonCreateAirFighter.UseVisualStyleBackColor = true;
buttonCreateAirFighter.Click += buttonCreateAirFighter_Click; buttonCreateAirFighter.Click += buttonCreateAirFighter_Click;
// //
@ -101,67 +98,30 @@
buttonUp.UseVisualStyleBackColor = true; buttonUp.UseVisualStyleBackColor = true;
buttonUp.Click += ButtonMove_Click; buttonUp.Click += ButtonMove_Click;
// //
// buttonCreateFighter
//
buttonCreateFighter.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreateFighter.Location = new Point(196, 409);
buttonCreateFighter.Name = "buttonCreateFighter";
buttonCreateFighter.Size = new Size(169, 29);
buttonCreateFighter.TabIndex = 6;
buttonCreateFighter.Text = "Создать самолёт";
buttonCreateFighter.UseVisualStyleBackColor = true;
buttonCreateFighter.Click += buttonCreateAir_Click;
//
// comboBoxStrategy
//
comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxStrategy.FormattingEnabled = true;
comboBoxStrategy.Items.AddRange(new object[] { "К центру", "К краю" });
comboBoxStrategy.Location = new Point(637, 12);
comboBoxStrategy.Name = "comboBoxStrategy";
comboBoxStrategy.Size = new Size(151, 28);
comboBoxStrategy.TabIndex = 7;
//
// buttonStrategyStep
//
buttonStrategyStep.Location = new Point(694, 57);
buttonStrategyStep.Name = "buttonStrategyStep";
buttonStrategyStep.Size = new Size(94, 29);
buttonStrategyStep.TabIndex = 8;
buttonStrategyStep.Text = "Шаг";
buttonStrategyStep.UseVisualStyleBackColor = true;
buttonStrategyStep.Click += ButtonStrategyStep_Click;
//
// FormAirFighter // FormAirFighter
// //
AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450); ClientSize = new Size(800, 450);
Controls.Add(buttonStrategyStep);
Controls.Add(comboBoxStrategy);
Controls.Add(buttonCreateFighter);
Controls.Add(buttonUp); Controls.Add(buttonUp);
Controls.Add(buttonLeft); Controls.Add(buttonLeft);
Controls.Add(buttonRight); Controls.Add(buttonRight);
Controls.Add(buttonDown); Controls.Add(buttonDown);
Controls.Add(buttonCreateAirFighter); Controls.Add(buttonCreateAirFighter);
Controls.Add(pictureBoxAirFighter); Controls.Add(pictureBox1);
Name = "FormAirFighter"; Name = "FormAirFighter";
Text = "Истребитель"; Text = "Истребитель";
((System.ComponentModel.ISupportInitialize)pictureBoxAirFighter).EndInit(); ((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
ResumeLayout(false); ResumeLayout(false);
} }
#endregion #endregion
private PictureBox pictureBoxAirFighter; private PictureBox pictureBox1;
private Button buttonCreateAirFighter; private Button buttonCreateAirFighter;
private Button buttonDown; private Button buttonDown;
private Button buttonRight; private Button buttonRight;
private Button buttonLeft; private Button buttonLeft;
private Button buttonUp; private Button buttonUp;
private Button buttonCreateFighter;
private ComboBox comboBoxStrategy;
private Button buttonStrategyStep;
} }
} }

View File

@ -1,66 +1,43 @@
using ProjectAirFighter.Drawnings; namespace ProjectAirFighter;
using ProjectAirFighter.MovementStrategy;
namespace ProjectAirFighter;
public partial class FormAirFighter : Form public partial class FormAirFighter : Form
{ {
private DrawningFighter? _drawningFighter; private DrawningAirFighter? _drawningAirFighter;
private AbstractStrategy? _strategy;
public FormAirFighter() public FormAirFighter()
{ {
InitializeComponent(); InitializeComponent();
_strategy = null;
} }
private void Draw() private void Draw()
{ {
if (_drawningFighter == null) if (_drawningAirFighter == null)
{ {
return; return;
} }
Bitmap bmp = new(pictureBoxAirFighter.Width, pictureBoxAirFighter.Height); Bitmap bmp = new(pictureBox1.Width, pictureBox1.Height);
Graphics gr = Graphics.FromImage(bmp); Graphics gr = Graphics.FromImage(bmp);
_drawningFighter.DrawTransport(gr); _drawningAirFighter.DrawTransport(gr);
pictureBoxAirFighter.Image = bmp; pictureBox1.Image = bmp;
} }
private void CreateObject(string type) private void buttonCreateAirFighter_Click(object sender, EventArgs e)
{ {
Random random = new(); Random random = new();
switch (type) _drawningAirFighter = new DrawningAirFighter();
{ _drawningAirFighter.Init(random.Next(100, 300), random.Next(1000, 3000),
case nameof(DrawningFighter):
_drawningFighter = new DrawningFighter(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(DrawningAirFighter):
_drawningFighter = new DrawningAirFighter(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)),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2))); Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)));
break; _drawningAirFighter.SetPictureSize(pictureBox1.Width, pictureBox1.Height);
default: _drawningAirFighter.SetPosition(random.Next(10, 100), random.Next(10, 100));
return;
}
_drawningFighter.SetPictureSize(pictureBoxAirFighter.Width, pictureBoxAirFighter.Height);
_drawningFighter.SetPosition(random.Next(10, 100), random.Next(10, 100));
_strategy = null;
comboBoxStrategy.Enabled = true;
Draw(); Draw();
} }
private void buttonCreateAirFighter_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningAirFighter));
private void buttonCreateAir_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningFighter));
private void ButtonMove_Click(object sender, EventArgs e) private void ButtonMove_Click(object sender, EventArgs e)
{ {
if (_drawningFighter == null) if (_drawningAirFighter == null)
{ {
return; return;
} }
@ -70,16 +47,16 @@ public partial class FormAirFighter : Form
switch (name) switch (name)
{ {
case "buttonUp": case "buttonUp":
result = _drawningFighter.MoveTransport(DirectionType.Up); result = _drawningAirFighter.MoveTransport(DirectionType.Up);
break; break;
case "buttonDown": case "buttonDown":
result = _drawningFighter.MoveTransport(DirectionType.Down); result = _drawningAirFighter.MoveTransport(DirectionType.Down);
break; break;
case "buttonLeft": case "buttonLeft":
result = _drawningFighter.MoveTransport(DirectionType.Left); result = _drawningAirFighter.MoveTransport(DirectionType.Left);
break; break;
case "buttonRight": case "buttonRight":
result = _drawningFighter.MoveTransport(DirectionType.Right); result = _drawningAirFighter.MoveTransport(DirectionType.Right);
break; break;
} }
@ -88,42 +65,4 @@ public partial class FormAirFighter : Form
Draw(); Draw();
} }
} }
private void ButtonStrategyStep_Click(object sender, EventArgs e)
{
if (_drawningFighter == null)
{
return;
}
if (comboBoxStrategy.Enabled)
{
_strategy = comboBoxStrategy.SelectedIndex switch
{
0 => new MoveToCenter(),
1 => new MoveToBorder(),
_ => null,
};
if (_strategy == null)
{
return;
}
_strategy.SetData(new MoveableAir(_drawningFighter), pictureBoxAirFighter.Width, pictureBoxAirFighter.Height);
}
if (_strategy == null)
{
return;
}
comboBoxStrategy.Enabled = false;
_strategy.MakeStep();
Draw();
if (_strategy.GetStatus() == StrategyStatus.Finish)
{
comboBoxStrategy.Enabled = true;
_strategy = null;
}
}
} }

View File

@ -1,139 +0,0 @@
namespace ProjectAirFighter.MovementStrategy;
/// <summary>
/// Класс-стратегия перемещения объекта
/// </summary>
public abstract class AbstractStrategy
{
/// <summary>
/// Перемещаемый объект
/// </summary>
private IMoveableObject? _moveableObject;
/// <summary>
/// Статус перемещения
/// </summary>
private StrategyStatus _state = StrategyStatus.NotInit;
/// <summary>
/// Ширина поля
/// </summary>
protected int FieldWidth { get; private set; }
/// <summary>
/// Высота поля
/// </summary>
protected int FieldHeight { get; private set; }
/// <summary>
/// Статус перемещения
/// </summary>
public StrategyStatus GetStatus() { return _state; }
/// <summary>
/// Установка данных
/// </summary>
/// <param name="moveableObject">Перемещаемый объект</param>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
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;
}
/// <summary>
/// Шаг перемещения
/// </summary>
public void MakeStep()
{
if (_state != StrategyStatus.InProgress)
{
return;
}
if (IsTargetDestinaion())
{
_state = StrategyStatus.Finish;
return;
}
MoveToTarget();
}
/// <summary>
/// Перемещение влево
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveLeft() => MoveTo(MovementDirection.Left);
/// <summary>
/// Перемещение вправо
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveRight() => MoveTo(MovementDirection.Right);
/// <summary>
/// Перемещение вверх
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveUp() => MoveTo(MovementDirection.Up);
/// <summary>
/// Перемещение вниз
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveDown() => MoveTo(MovementDirection.Down);
/// <summary>
/// Параметры объекта
/// </summary>
protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition;
/// <summary>
/// Шаг объекта
/// </summary>
/// <returns></returns>
protected int? GetStep()
{
if (_state != StrategyStatus.InProgress)
{
return null;
}
return _moveableObject?.GetStep;
}
/// <summary>
/// Перемещение к цели
/// </summary>
protected abstract void MoveToTarget();
/// <summary>
/// Достигнута ли цель
/// </summary>
/// <returns></returns>
protected abstract bool IsTargetDestinaion();
/// <summary>
/// Попытка перемещения в требуемом направлении
/// </summary>
/// <param name="movementDirection">Направление</param>
/// <returns>Результат попытки (true - удалось переместиться, false - неудача)</returns>
private bool MoveTo(MovementDirection movementDirection)
{
if (_state != StrategyStatus.InProgress)
{
return false;
}
return _moveableObject?.TryMoveObject(movementDirection) ?? false;
}
}

View File

@ -1,24 +0,0 @@
namespace ProjectAirFighter.MovementStrategy;
/// <summary>
/// Интерфейс для работы с перемещаемым объектом
/// </summary>
public interface IMoveableObject
{
/// <summary>
/// Получение координаты объекта
/// </summary>
ObjectParameters? GetObjectPosition { get; }
/// <summary>
/// Шаг объекта
/// </summary>
int GetStep { get; }
/// <summary>
/// Попытка переместить объект в указанном направлении
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - объект перемещен, false - перемещение невозможно</returns>
bool TryMoveObject(MovementDirection direction);
}

View File

@ -1,51 +0,0 @@
namespace ProjectAirFighter.MovementStrategy;
public class MoveToBorder : AbstractStrategy
{
protected override bool IsTargetDestinaion()
{
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();
}
}
}
}

View File

@ -1,54 +0,0 @@
namespace ProjectAirFighter.MovementStrategy;
/// <summary>
/// Стратегия перемещения объекта в центр экрана
/// </summary>
public class MoveToCenter : AbstractStrategy
{
protected override bool IsTargetDestinaion()
{
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();
}
}
}
}

View File

@ -1,64 +0,0 @@
using ProjectAirFighter.Drawnings;
namespace ProjectAirFighter.MovementStrategy;
/// <summary>
/// Класс-реализация IMoveableObject с использованием DrawningCar
/// </summary>
public class MoveableAir : IMoveableObject
{
/// <summary>
/// Поле-объект класса DrawningCar или его наследника
/// </summary>
private readonly DrawningFighter? _air = null;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="car">Объект класса DrawningCar</param>
public MoveableAir(DrawningFighter air)
{
_air = air;
}
public ObjectParameters? GetObjectPosition
{
get
{
if (_air == null || _air.EntityFighter == null || !_air.GetPosX.HasValue || !_air.GetPosY.HasValue)
{
return null;
}
return new ObjectParameters(_air.GetPosX.Value, _air.GetPosY.Value, _air.GetWidth, _air.GetHeight);
}
}
public int GetStep => (int)(_air?.EntityFighter?.Step ?? 0);
public bool TryMoveObject(MovementDirection direction)
{
if (_air == null || _air.EntityFighter == null)
{
return false;
}
return _air.MoveTransport(GetDirectionType(direction));
}
/// <summary>
/// Конвертация из MovementDirection в DirectionType
/// </summary>
/// <param name="direction">MovementDirection</param>
/// <returns>DirectionType</returns>
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,
};
}
}

View File

@ -1,24 +0,0 @@
namespace ProjectAirFighter.MovementStrategy;
public enum MovementDirection
{
/// <summary>
/// Вверх
/// </summary>
Up = 1,
/// <summary>
/// Вниз
/// </summary>
Down = 2,
/// <summary>
/// Влево
/// </summary>
Left = 3,
/// <summary>
/// Вправо
/// </summary>
Right = 4
}

View File

@ -1,72 +0,0 @@
namespace ProjectAirFighter.MovementStrategy;
/// <summary>
/// Параметры-координаты объекта
/// </summary>
public class ObjectParameters
{
/// <summary>
/// Координата X
/// </summary>
private readonly int _x;
/// <summary>
/// Координата Y
/// </summary>
private readonly int _y;
/// <summary>
/// Ширина объекта
/// </summary>
private readonly int _width;
/// <summary>
/// Высота объекта
/// </summary>
private readonly int _height;
/// <summary>
/// Левая граница
/// </summary>
public int LeftBorder => _x;
/// <summary>
/// Верхняя граница
/// </summary>
public int TopBorder => _y;
/// <summary>
/// Правая граница
/// </summary>
public int RightBorder => _x + _width;
/// <summary>
/// Нижняя граница
/// </summary>
public int DownBorder => _y + _height;
/// <summary>
/// Середина объекта
/// </summary>
public int ObjectMiddleHorizontal => _x + _width / 2;
/// <summary>
/// Середина объекта
/// </summary>
public int ObjectMiddleVertical => _y + _height / 2;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
/// <param name="width">Ширина объекта</param>
/// <param name="height">Высота объекта</param>
public ObjectParameters(int x, int y, int width, int height)
{
_x = x;
_y = y;
_width = width;
_height = height;
}
}

View File

@ -1,22 +0,0 @@
namespace ProjectAirFighter.MovementStrategy;
/// <summary>
/// Статус выполнения операции перемещения
/// </summary>
public enum StrategyStatus
{
/// <summary>
/// Все готово к началу
/// </summary>
NotInit,
/// <summary>
/// Выполняется
/// </summary>
InProgress,
/// <summary>
/// Завершено
/// </summary>
Finish
}