Compare commits

..

2 Commits

15 changed files with 728 additions and 124 deletions

View File

@ -5,6 +5,10 @@
/// </summary> /// </summary>
public enum DirectionType public enum DirectionType
{ {
/// <summary>
/// Неизвестное направление
/// </summary>
Unknow = -1,
/// <summary> /// <summary>
/// Вверх /// Вверх
/// </summary> /// </summary>

View File

@ -0,0 +1,66 @@
using ProjectStormtrooper.Entities;
namespace ProjectStormtrooper.Drawnings;
/// <summary>
/// Класс отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawingStormtrooper: DrawningStormtrooperBase
{
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed"></param>
/// <param name="weight"></param>
/// <param name="bodyColor"></param>
/// <param name="additionalColor"></param>
/// <param name="rockets"></param>
/// <param name="bombs"></param>
public DrawingStormtrooper(int speed,double weight, Color bodyColor,Color additionalColor, bool rockets, bool bombs):base(140,140)
{
EntityStormtrooperBase = new EntityStormtrooper(speed, weight, bodyColor, additionalColor, rockets, bombs);
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="q"></param>
public override void DrawTransport(Graphics g)
{
if (EntityStormtrooperBase == null || EntityStormtrooperBase is not EntityStormtrooper stormtrooper || !_startPosX.HasValue || !_startPosY.HasValue)
{
return;
}
Pen pen = new(Color.Black);
Brush additionalBrush = new SolidBrush(stormtrooper.AdditionalColor);
base.DrawTransport(g);
//ракеты штурмовика
if (stormtrooper.Rockets)
{
g.FillRectangle(additionalBrush, _startPosX.Value + 45, _startPosY.Value + 20, 15, 5);
g.FillRectangle(additionalBrush, _startPosX.Value + 45, _startPosY.Value + 110, 15, 5);
g.DrawRectangle(pen, _startPosX.Value + 45, _startPosY.Value + 20, 15, 5);
g.DrawRectangle(pen, _startPosX.Value + 45, _startPosY.Value + 110, 15, 5);
}
//бомбы штурмовика
if (stormtrooper.Bombs)
{
g.FillRectangle(additionalBrush, _startPosX.Value + 50, _startPosY.Value + 40, 10, 10);
g.FillRectangle(additionalBrush, _startPosX.Value + 50, _startPosY.Value + 90, 10, 10);
g.DrawRectangle(pen, _startPosX.Value + 50, _startPosY.Value + 40, 10, 10);
g.DrawRectangle(pen, _startPosX.Value + 50, _startPosY.Value + 90, 10, 10);
}
}
}

View File

@ -1,13 +1,13 @@
namespace ProjectStormtrooper; using ProjectStormtrooper.Entities;
/// <summary>
/// Класс отвечающий за прорисовку и перемещение объекта-сущности namespace ProjectStormtrooper.Drawnings;
/// </summary>
public class DrawingStormtrooper public class DrawningStormtrooperBase
{ {
/// <summary> /// <summary>
/// Класс-сущность /// Класс-сущность
/// </summary> /// </summary>
public EntityStormtrooper? EntityStormtrooper { get; private set; } public EntityStormtrooperBase? EntityStormtrooperBase { get; protected set; }
/// <summary> /// <summary>
/// Ширина окна /// Ширина окна
/// </summary> /// </summary>
@ -21,12 +21,12 @@ public class DrawingStormtrooper
/// Левая координата начала прорисовки /// Левая координата начала прорисовки
/// </summary> /// </summary>
private int? _startPosX; protected int? _startPosX;
/// <summary> /// <summary>
/// Верхняя координата начала прорисовки /// Верхняя координата начала прорисовки
/// </summary> /// </summary>
private int? _startPosY; protected int? _startPosY;
/// <summary> /// <summary>
/// Ширина прорисовки /// Ширина прорисовки
/// </summary> /// </summary>
@ -37,38 +37,76 @@ public class DrawingStormtrooper
/// </summary> /// </summary>
private readonly int _drawningStormtooperHeight = 140; private readonly int _drawningStormtooperHeight = 140;
/// <summary>
/// Инициализация свойств
/// </summary>
/// <param name="speed"></param>
/// <param name="weight"></param>
/// <param name="bodyColor"></param>
/// <param name="additionalColor"></param>
/// <param name="rockets"></param>
/// <param name="bombs"></param>
public void Init(int speed,double weight, Color bodyColor,Color additionalColor, bool rockets, bool bombs) /// <summary>
/// Координата Х объекта
/// </summary>
/// <returns></returns>
public int? GetPosX => _startPosX;
/// <summary>
/// Координата У объекта
/// </summary>
/// <returns></returns>
public int? GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
/// <returns></returns>
public int GetWidth => _drawningStormtrooperWidth;
/// <summary>
/// Высота объекта
/// </summary>
/// <returns></returns>
public int GetHeight => _drawningStormtooperHeight;
/// <summary>
/// Пустой конструктор
/// </summary>
private DrawningStormtrooperBase()
{ {
EntityStormtrooper = new EntityStormtrooper();
EntityStormtrooper.Init(speed, weight, bodyColor, additionalColor, rockets, bombs);
_pictureHeight = null; _pictureHeight = null;
_pictureWidth = null; _pictureWidth = null;
_startPosX = null; _startPosX = null;
_startPosY = null; _startPosY = null;
} }
/// <summary> /// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">скорость</param>
/// <param name="weight">вес</param>
/// <param name="bodyColor">основной цвет</param>
public DrawningStormtrooperBase(int speed, double weight, Color bodyColor):this()
{
EntityStormtrooperBase = new EntityStormtrooperBase(speed, weight, bodyColor);
}
/// <summary>
/// Конструктор для наследников
/// </summary>
/// <param name="drawningStormtrooperWidth"> Ширина прорисовки</param>
/// <param name="drawningStormtooperHeight">Высота прорисовки</param>
protected DrawningStormtrooperBase(int drawningStormtrooperWidth, int drawningStormtooperHeight) : this()
{
_drawningStormtrooperWidth = drawningStormtrooperWidth;
_drawningStormtooperHeight = drawningStormtooperHeight;
}
/// <summary>
/// Установка границ поля /// Установка границ поля
/// </summary> /// </summary>
/// <param name="width">Ширина поля</param> /// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param> /// <param name="height">Высота поля</param>
/// <returns>true - граница задана, false - проверка не пройдена, нельзя разместить объект в этих размерах</returns> /// <returns>true - граница задана, false - проверка не пройдена, нельзя разместить объект в этих размерах</returns>
public bool SetPictureSize(int width,int height) public bool SetPictureSize(int width, int height)
{ {
if (width >= _drawningStormtrooperWidth || height >= _drawningStormtooperHeight) if (width >= _drawningStormtrooperWidth || height >= _drawningStormtooperHeight)
{ {
_pictureWidth = width; _pictureWidth = width;
_pictureHeight = height; _pictureHeight = height;
if(_startPosX!=null && _startPosY != null) if (_startPosX != null && _startPosY != null)
{ {
SetPosition(_startPosX.Value, _startPosY.Value); SetPosition(_startPosX.Value, _startPosY.Value);
} }
@ -120,7 +158,7 @@ public class DrawingStormtrooper
/// <returns>true - перемещение выполнено, false - перемещение невозможно</returns> /// <returns>true - перемещение выполнено, false - перемещение невозможно</returns>
public bool MoveTransport(DirectionType direction) public bool MoveTransport(DirectionType direction)
{ {
if (EntityStormtrooper == null || !_startPosX.HasValue || !_startPosY.HasValue) if (EntityStormtrooperBase == null || !_startPosX.HasValue || !_startPosY.HasValue)
{ {
return false; return false;
} }
@ -128,31 +166,31 @@ public class DrawingStormtrooper
{ {
//влево //влево
case DirectionType.Left: case DirectionType.Left:
if (_startPosX.Value - EntityStormtrooper.Step > 0) if (_startPosX.Value - EntityStormtrooperBase.Step > 0)
{ {
_startPosX -= (int)EntityStormtrooper.Step; _startPosX -= (int)EntityStormtrooperBase.Step;
} }
return true; return true;
//Вверх //Вверх
case DirectionType.Up: case DirectionType.Up:
if (_startPosY.Value - EntityStormtrooper.Step > 0) if (_startPosY.Value - EntityStormtrooperBase.Step > 0)
{ {
_startPosY -= (int)EntityStormtrooper.Step; _startPosY -= (int)EntityStormtrooperBase.Step;
} }
return true; return true;
//Вправо //Вправо
case DirectionType.Right: case DirectionType.Right:
if (_startPosX.Value + EntityStormtrooper.Step+_drawningStormtrooperWidth < _pictureWidth) if (_startPosX.Value + EntityStormtrooperBase.Step + _drawningStormtrooperWidth < _pictureWidth)
{ {
_startPosX += (int)EntityStormtrooper.Step; _startPosX += (int)EntityStormtrooperBase.Step;
} }
return true; return true;
//Вниз //Вниз
case DirectionType.Down: case DirectionType.Down:
if (_startPosY.Value + EntityStormtrooper.Step + _drawningStormtooperHeight < _pictureHeight) if (_startPosY.Value + EntityStormtrooperBase.Step + _drawningStormtooperHeight < _pictureHeight)
{ {
_startPosY += (int)EntityStormtrooper.Step; _startPosY += (int)EntityStormtrooperBase.Step;
} }
return true; return true;
default: default:
@ -164,82 +202,60 @@ public class DrawingStormtrooper
/// Прорисовка объекта /// Прорисовка объекта
/// </summary> /// </summary>
/// <param name="q"></param> /// <param name="q"></param>
public void DrawTransport(Graphics g) public virtual void DrawTransport(Graphics g)
{ {
if (EntityStormtrooper == null || !_startPosX.HasValue || !_startPosY.HasValue) if (EntityStormtrooperBase == null || !_startPosX.HasValue || !_startPosY.HasValue)
{ {
return; return;
} }
Pen pen = new (Color.Black); Pen pen = new(Color.Black);
Brush bodyColorBrush = new SolidBrush(EntityStormtrooper.BodyColor); Brush bodyColorBrush = new SolidBrush(EntityStormtrooperBase.BodyColor);
Brush additionalBrush = new SolidBrush(EntityStormtrooper.AdditionalColor);
//нос штурмовика //нос штурмовика
Brush brBlack = new SolidBrush(Color.Black); Brush brBlack = new SolidBrush(Color.Black);
Point[] Nose = new Point[3]; Point[] Nose = new Point[3];
Nose[0].X = _startPosX.Value + 20; Nose[0].Y = _startPosY.Value + 80; Nose[0].X = _startPosX.Value + 20; Nose[0].Y = _startPosY.Value + 85;
Nose[1].X = _startPosX.Value + 20; Nose[1].Y = _startPosY.Value + 60; Nose[1].X = _startPosX.Value + 20; Nose[1].Y = _startPosY.Value + 65;
Nose[2].X = _startPosX.Value; Nose[2].Y = _startPosY.Value + 70; Nose[2].X = _startPosX.Value; Nose[2].Y = _startPosY.Value + 75;
g.FillPolygon(brBlack, Nose); g.FillPolygon(brBlack, Nose);
g.DrawPolygon(pen, Nose); g.DrawPolygon(pen, Nose);
//Заднии крылья штурмовика //Заднии крылья штурмовика
Point[] pflybtwings = new Point[6]; Point[] pflybtwings = new Point[6];
pflybtwings[0].X = _startPosX.Value + 120; pflybtwings[0].Y = _startPosY.Value + 60; pflybtwings[0].X = _startPosX.Value + 120; pflybtwings[0].Y = _startPosY.Value + 65;
pflybtwings[1].X = _startPosX.Value + 120; pflybtwings[1].Y = _startPosY.Value + 50; pflybtwings[1].X = _startPosX.Value + 120; pflybtwings[1].Y = _startPosY.Value + 55;
pflybtwings[2].X = _startPosX.Value + 140; pflybtwings[2].Y = _startPosY.Value + 30; pflybtwings[2].X = _startPosX.Value + 140; pflybtwings[2].Y = _startPosY.Value + 35;
pflybtwings[3].X = _startPosX.Value + 140; pflybtwings[3].Y = _startPosY.Value + 110; pflybtwings[3].X = _startPosX.Value + 140; pflybtwings[3].Y = _startPosY.Value + 115;
pflybtwings[4].X = _startPosX.Value + 120; pflybtwings[4].Y = _startPosY.Value + 90; pflybtwings[4].X = _startPosX.Value + 120; pflybtwings[4].Y = _startPosY.Value + 95;
pflybtwings[5].X = _startPosX.Value + 120; pflybtwings[5].Y = _startPosY.Value + 80; pflybtwings[5].X = _startPosX.Value + 120; pflybtwings[5].Y = _startPosY.Value + 85;
g.FillPolygon(bodyColorBrush, pflybtwings); g.FillPolygon(bodyColorBrush, pflybtwings);
g.DrawPolygon(pen, pflybtwings); g.DrawPolygon(pen, pflybtwings);
//Тело штурмовика //Тело штурмовика
g.FillRectangle(bodyColorBrush, _startPosX.Value + 20, _startPosY.Value + 60, 120, 20);
g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 60, 120, 20);
g.FillRectangle(bodyColorBrush, _startPosX.Value + 20, _startPosY.Value + 65, 120, 20);
g.DrawRectangle(pen, _startPosX.Value + 20, _startPosY.Value + 65, 120, 20);
//Крылья штурмовика //Крылья штурмовика
Point[] frontwings = new Point[4]; Point[] frontwings = new Point[4];
frontwings[0].X = _startPosX.Value + 60; frontwings[0].Y = _startPosY.Value + 60; frontwings[0].X = _startPosX.Value + 60; frontwings[0].Y = _startPosY.Value + 65;
frontwings[1].X = _startPosX.Value + 60; frontwings[1].Y = _startPosY.Value ; frontwings[1].X = _startPosX.Value + 60; frontwings[1].Y = _startPosY.Value + 5;
frontwings[2].X = _startPosX.Value + 70; frontwings[2].Y = _startPosY.Value ; frontwings[2].X = _startPosX.Value + 70; frontwings[2].Y = _startPosY.Value + 5;
frontwings[3].X = _startPosX.Value + 80; frontwings[3].Y = _startPosY.Value + 60; frontwings[3].X = _startPosX.Value + 80; frontwings[3].Y = _startPosY.Value + 65;
g.FillPolygon(bodyColorBrush, frontwings); g.FillPolygon(bodyColorBrush, frontwings);
g.DrawPolygon(pen, frontwings); g.DrawPolygon(pen, frontwings);
Point[] frontwings2 = new Point[4]; Point[] frontwings2 = new Point[4];
frontwings2[0].X = _startPosX.Value + 60; frontwings2[0].Y = _startPosY.Value + 80; frontwings2[0].X = _startPosX.Value + 60; frontwings2[0].Y = _startPosY.Value + 85;
frontwings2[1].X = _startPosX.Value + 60; frontwings2[1].Y = _startPosY.Value+140; frontwings2[1].X = _startPosX.Value + 60; frontwings2[1].Y = _startPosY.Value + 145;
frontwings2[2].X = _startPosX.Value + 70; frontwings2[2].Y = _startPosY.Value+140; frontwings2[2].X = _startPosX.Value + 70; frontwings2[2].Y = _startPosY.Value + 145;
frontwings2[3].X = _startPosX.Value + 80; frontwings2[3].Y = _startPosY.Value + 80; frontwings2[3].X = _startPosX.Value + 80; frontwings2[3].Y = _startPosY.Value + 85;
g.FillPolygon(bodyColorBrush, frontwings2); g.FillPolygon(bodyColorBrush, frontwings2);
g.DrawPolygon(pen, frontwings2); g.DrawPolygon(pen, frontwings2);
//Ракеты штурмовика
if (EntityStormtrooper.Rockets)
{
g.FillRectangle(additionalBrush, _startPosX.Value + 45, _startPosY.Value + 20, 15, 5);
g.FillRectangle(additionalBrush, _startPosX.Value + 45, _startPosY.Value + 110, 15, 5);
g.DrawRectangle(pen, _startPosX.Value + 45, _startPosY.Value + 20, 15, 5);
g.DrawRectangle(pen, _startPosX.Value + 45, _startPosY.Value + 110, 15, 5);
} }
//Бомбы бомбардировщика
if (EntityStormtrooper.Bombs)
{
g.FillRectangle(additionalBrush, _startPosX.Value + 50, _startPosY.Value + 40, 10, 10);
g.FillRectangle(additionalBrush, _startPosX.Value + 50, _startPosY.Value + 90, 10, 10);
g.DrawRectangle(pen, _startPosX.Value + 50, _startPosY.Value + 40, 10, 10);
g.DrawRectangle(pen, _startPosX.Value + 50, _startPosY.Value + 90, 10, 10);
}
}
} }

View File

@ -0,0 +1,42 @@
namespace ProjectStormtrooper.Entities;
/// <summary>
/// Класс-сущность "Штурмовик"
/// </summary>
public class EntityStormtrooper: EntityStormtrooperBase
{
public Color AdditionalColor { get; private set; }
/// <summary>
/// Признак (опция) наличия ракет
/// </summary>
public bool Rockets { get; private set; }
/// <summary>
/// Признак (опция) наличия бомб
/// </summary>
public bool Bombs { get; private set; }
/// <summary>
/// Инициализация полей объекта-класса штурмовик
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес </param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="rockets">Признак наличия ракет</param>
/// <param name="bombs">Признак наличия бомб</param>
public EntityStormtrooper(int speed, double weight, Color bodyColor, Color additionalColor, bool rockets, bool bombs):base(speed, weight, bodyColor)
{
AdditionalColor = additionalColor;
Rockets = rockets;
Bombs = bombs;
}
}

View File

@ -1,9 +1,9 @@
namespace ProjectStormtrooper; namespace ProjectStormtrooper.Entities;
/// <summary> /// <summary>
/// Класс-сущность "Штурмовик" /// Класс-сущность "Штурмовик"
/// </summary> /// </summary>
public class EntityStormtrooper
public class EntityStormtrooperBase
{ {
/// <summary> /// <summary>
/// Скорость /// Скорость
@ -20,28 +20,12 @@ public class EntityStormtrooper
/// </summary> /// </summary>
/// ///
public Color BodyColor { get; private set; } public Color BodyColor { get; private set; }
/// <summary> // <summary>
/// Дополнительный цвет (для опциональных элементов)
/// </summary>
public Color AdditionalColor { get; private set; }
/// <summary>
/// Признак (опция) наличия ракет
/// </summary>
public bool Rockets { get; private set; }
/// <summary>
/// Признак (опция) наличия бомб
/// </summary>
public bool Bombs { get; private set; }
/// <summary>
/// Шаг перемещения штурмовика /// Шаг перемещения штурмовика
/// </summary> /// </summary>
public double Step => Speed * 100 / Weight; public double Step => Speed * 100 / Weight;
/// <summary> /// <summary>
/// Инициализация полей объекта-класса штурмовик /// Конструктор сущности
/// </summary> /// </summary>
/// <param name="speed">Скорость</param> /// <param name="speed">Скорость</param>
/// <param name="weight">Вес </param> /// <param name="weight">Вес </param>
@ -50,15 +34,12 @@ public class EntityStormtrooper
/// <param name="rockets">Признак наличия ракет</param> /// <param name="rockets">Признак наличия ракет</param>
/// <param name="bombs">Признак наличия бомб</param> /// <param name="bombs">Признак наличия бомб</param>
public void Init(int speed, double weight, Color bodyColor, Color additionalColor, bool rockets, bool bombs) public EntityStormtrooperBase(int speed, double weight, Color bodyColor)
{ {
Speed = speed; Speed = speed;
Weight = weight; Weight = weight;
BodyColor = bodyColor; BodyColor = bodyColor;
AdditionalColor = additionalColor;
Rockets = rockets;
Bombs = bombs;
} }
} }

View File

@ -34,6 +34,9 @@
buttonUp = new Button(); buttonUp = new Button();
buttonDown = new Button(); buttonDown = new Button();
buttonRight = new Button(); buttonRight = new Button();
buttonCreateStormtrooperBase = new Button();
comboBoxStrategy = new ComboBox();
buttonStrategyStep = new Button();
((System.ComponentModel.ISupportInitialize)pictureBoxStormtrooper).BeginInit(); ((System.ComponentModel.ISupportInitialize)pictureBoxStormtrooper).BeginInit();
SuspendLayout(); SuspendLayout();
// //
@ -45,16 +48,15 @@
pictureBoxStormtrooper.Size = new Size(925, 597); pictureBoxStormtrooper.Size = new Size(925, 597);
pictureBoxStormtrooper.TabIndex = 0; pictureBoxStormtrooper.TabIndex = 0;
pictureBoxStormtrooper.TabStop = false; pictureBoxStormtrooper.TabStop = false;
// //
// buttonCreateStormtrooper // buttonCreateStormtrooper
// //
buttonCreateStormtrooper.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; buttonCreateStormtrooper.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreateStormtrooper.Location = new Point(12, 562); buttonCreateStormtrooper.Location = new Point(12, 562);
buttonCreateStormtrooper.Name = "buttonCreateStormtrooper"; buttonCreateStormtrooper.Name = "buttonCreateStormtrooper";
buttonCreateStormtrooper.Size = new Size(75, 23); buttonCreateStormtrooper.Size = new Size(162, 23);
buttonCreateStormtrooper.TabIndex = 1; buttonCreateStormtrooper.TabIndex = 1;
buttonCreateStormtrooper.Text = "Создать"; buttonCreateStormtrooper.Text = "Создать штурмовик";
buttonCreateStormtrooper.UseVisualStyleBackColor = true; buttonCreateStormtrooper.UseVisualStyleBackColor = true;
buttonCreateStormtrooper.Click += ButtonCreateStormtrooper_Click; buttonCreateStormtrooper.Click += ButtonCreateStormtrooper_Click;
// //
@ -106,11 +108,45 @@
buttonRight.UseVisualStyleBackColor = true; buttonRight.UseVisualStyleBackColor = true;
buttonRight.Click += ButtonMove_Click; buttonRight.Click += ButtonMove_Click;
// //
// buttonCreateStormtrooperBase
//
buttonCreateStormtrooperBase.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreateStormtrooperBase.Location = new Point(198, 562);
buttonCreateStormtrooperBase.Name = "buttonCreateStormtrooperBase";
buttonCreateStormtrooperBase.Size = new Size(180, 23);
buttonCreateStormtrooperBase.TabIndex = 6;
buttonCreateStormtrooperBase.Text = "Создать штурмовик базовый";
buttonCreateStormtrooperBase.UseVisualStyleBackColor = true;
buttonCreateStormtrooperBase.Click += ButtonCreateStormtrooperBase_Click;
//
// comboBoxStrategy
//
comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxStrategy.FormattingEnabled = true;
comboBoxStrategy.Items.AddRange(new object[] { "К центру", "К краю" });
comboBoxStrategy.Location = new Point(792, 8);
comboBoxStrategy.Name = "comboBoxStrategy";
comboBoxStrategy.Size = new Size(121, 23);
comboBoxStrategy.TabIndex = 7;
//
// buttonStrategyStep
//
buttonStrategyStep.Location = new Point(839, 37);
buttonStrategyStep.Name = "buttonStrategyStep";
buttonStrategyStep.Size = new Size(75, 23);
buttonStrategyStep.TabIndex = 8;
buttonStrategyStep.Text = "Шаг";
buttonStrategyStep.UseVisualStyleBackColor = true;
buttonStrategyStep.Click += ButtonStrategyStep_Click;
//
// FormStormtrooper // FormStormtrooper
// //
AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(925, 597); ClientSize = new Size(925, 597);
Controls.Add(buttonStrategyStep);
Controls.Add(comboBoxStrategy);
Controls.Add(buttonCreateStormtrooperBase);
Controls.Add(buttonRight); Controls.Add(buttonRight);
Controls.Add(buttonDown); Controls.Add(buttonDown);
Controls.Add(buttonUp); Controls.Add(buttonUp);
@ -119,7 +155,6 @@
Controls.Add(pictureBoxStormtrooper); Controls.Add(pictureBoxStormtrooper);
Name = "FormStormtrooper"; Name = "FormStormtrooper";
Text = "Штурмовик"; Text = "Штурмовик";
((System.ComponentModel.ISupportInitialize)pictureBoxStormtrooper).EndInit(); ((System.ComponentModel.ISupportInitialize)pictureBoxStormtrooper).EndInit();
ResumeLayout(false); ResumeLayout(false);
} }
@ -132,5 +167,8 @@
private Button buttonUp; private Button buttonUp;
private Button buttonDown; private Button buttonDown;
private Button buttonRight; private Button buttonRight;
private Button buttonCreateStormtrooperBase;
private ComboBox comboBoxStrategy;
private Button buttonStrategyStep;
} }
} }

View File

@ -1,4 +1,7 @@
namespace ProjectStormtrooper; using ProjectStormtrooper.Drawnings;
using ProjectStormtrooper.MovementStrategy;
namespace ProjectStormtrooper;
/// <summary> /// <summary>
/// Форма работы с объектом "Штурмовик" /// Форма работы с объектом "Штурмовик"
/// </summary> /// </summary>
@ -6,13 +9,18 @@ public partial class FormStormtrooper : Form
{/// <summary> {/// <summary>
/// Поле-объект для прорисовки объекта /// Поле-объект для прорисовки объекта
/// </summary> /// </summary>
private DrawingStormtrooper? _drawningStormtrooper; private DrawningStormtrooperBase? _drawningStormtrooperBase;
/// <summary>
/// Стратегия перемещения
/// </summary>
private AbstractStrategy? _strategy;
/// <summary> /// <summary>
/// Конструктор формы /// Конструктор формы
/// </summary> /// </summary>
public FormStormtrooper() public FormStormtrooper()
{ {
InitializeComponent(); InitializeComponent();
_strategy = null;
} }
/// <summary> /// <summary>
@ -21,34 +29,60 @@ public partial class FormStormtrooper : Form
private void Draw() private void Draw()
{ {
if (_drawningStormtrooper == null) if (_drawningStormtrooperBase == null)
{ {
return; return;
} }
Bitmap bmp = new(pictureBoxStormtrooper.Width, pictureBoxStormtrooper.Height); Bitmap bmp = new(pictureBoxStormtrooper.Width, pictureBoxStormtrooper.Height);
Graphics gr = Graphics.FromImage(bmp); Graphics gr = Graphics.FromImage(bmp);
_drawningStormtrooper.DrawTransport(gr); _drawningStormtrooperBase.DrawTransport(gr);
pictureBoxStormtrooper.Image = bmp; pictureBoxStormtrooper.Image = bmp;
} }
/// <summary> /// <summary>
/// Обработка нажатия кнопки "Создать" /// Создание объекта класса-перемещения
/// </summary> /// </summary>
/// <param name="sender"></param> /// <param name="type"></param>
/// <param name="e"></param> private void CreateObject(string type)
private void ButtonCreateStormtrooper_Click(object sender, EventArgs e)
{ {
Random random = new(); Random random = new();
_drawningStormtrooper = new DrawingStormtrooper(); switch (type)
_drawningStormtrooper.Init(random.Next(100, 300), random.Next(1000, 3000), {
case nameof(DrawingStormtrooper):
_drawningStormtrooperBase = new DrawingStormtrooper(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)));
_drawningStormtrooper.SetPictureSize(pictureBoxStormtrooper.Width, pictureBoxStormtrooper.Height); break;
_drawningStormtrooper.SetPosition(random.Next(10, 100), random.Next(10, 100)); case nameof(DrawningStormtrooperBase):
_drawningStormtrooperBase = new DrawningStormtrooperBase(random.Next(100, 300), random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)));
break;
default:
return;
Draw();
} }
_drawningStormtrooperBase.SetPictureSize(pictureBoxStormtrooper.Width, pictureBoxStormtrooper.Height);
_drawningStormtrooperBase.SetPosition(random.Next(10, 100), random.Next(10, 100));
_strategy = null;
comboBoxStrategy.Enabled = true;
Draw();
}
/// <summary>
/// Обработка нажатия кнопки "Создать штурмовик"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCreateStormtrooper_Click(object sender, EventArgs e) => CreateObject(nameof(DrawingStormtrooper));
/// <summary>
/// Обработка нажатия кнопки "Создать базовый штурмовик"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCreateStormtrooperBase_Click(object sender, EventArgs e) => CreateObject(nameof(DrawningStormtrooperBase));
/// <summary> /// <summary>
/// Перемещение объкта по форме(нажатие кнопок навигации) /// Перемещение объкта по форме(нажатие кнопок навигации)
/// </summary> /// </summary>
@ -56,7 +90,7 @@ public partial class FormStormtrooper : Form
/// <param name="e"></param> /// <param name="e"></param>
private void ButtonMove_Click(object sender, EventArgs e) private void ButtonMove_Click(object sender, EventArgs e)
{ {
if (_drawningStormtrooper == null) if (_drawningStormtrooperBase == null)
{ {
return; return;
} }
@ -66,16 +100,16 @@ public partial class FormStormtrooper : Form
switch (name) switch (name)
{ {
case "buttonUp": case "buttonUp":
result = _drawningStormtrooper.MoveTransport(DirectionType.Up); result = _drawningStormtrooperBase.MoveTransport(DirectionType.Up);
break; break;
case "buttonDown": case "buttonDown":
result = _drawningStormtrooper.MoveTransport(DirectionType.Down); result = _drawningStormtrooperBase.MoveTransport(DirectionType.Down);
break; break;
case "buttonLeft": case "buttonLeft":
result = _drawningStormtrooper.MoveTransport(DirectionType.Left); result = _drawningStormtrooperBase.MoveTransport(DirectionType.Left);
break; break;
case "buttonRight": case "buttonRight":
result = _drawningStormtrooper.MoveTransport(DirectionType.Right); result = _drawningStormtrooperBase.MoveTransport(DirectionType.Right);
break; break;
} }
@ -85,4 +119,42 @@ public partial class FormStormtrooper : Form
} }
} }
private void ButtonStrategyStep_Click(object sender, EventArgs e)
{
if (_drawningStormtrooperBase == null)
{
return;
}
if (comboBoxStrategy.Enabled)
{
_strategy = comboBoxStrategy.SelectedIndex switch
{
0 => new MoveToCenter(),
1 => new MoveToBorder(),
_ => null,
};
if (_strategy == null)
{
return;
}
_strategy.SetData(new MoveableStormtrooperBase(_drawningStormtrooperBase), pictureBoxStormtrooper.Width, pictureBoxStormtrooper.Height);
}
if (_strategy == null)
{
return;
}
comboBoxStrategy.Enabled = false;
_strategy.MakeStep();
Draw();
if (_strategy.GetStatus() == StrategyStatus.Finish)
{
comboBoxStrategy.Enabled = true;
_strategy = null;
}
}
} }

View File

@ -0,0 +1,120 @@
namespace ProjectStormtrooper.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>
/// <returns></returns>
public StrategyStatus GetStatus() { return _state; }
/// <summary>
/// Установка данных
/// </summary>
/// <param name="moveableObjects">Перемещаемый объект</param>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
public void SetData(IMoveableObject moveableObjects,int width, int height)
{
if (moveableObjects == null)
{
_state = StrategyStatus.NotInit;
return;
}
_state = StrategyStatus.InProgress;
_moveableObject = moveableObjects;
FieldWidth = width;
FieldHeight = height;
}
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

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

View File

@ -0,0 +1,28 @@
namespace ProjectStormtrooper.MovementStrategy;
public class MoveToBorder : AbstractStrategy
{
protected override bool IsTargetDestinaion()
{
ObjectParameters? objParams = GetObjectParameters;
if (objParams == null)
{
return false;
}
return objParams.LeftBorder - GetStep() <= 0 || objParams.RightBorder + GetStep() >= FieldWidth ||
objParams.TopBorder - GetStep() <= 0 || objParams.ObjectMiddleVertical + GetStep() >= FieldHeight;
}
protected override void MoveToTarget()
{
ObjectParameters? objParams = GetObjectParameters;
if (objParams == null)
{
return;
}
int x = objParams.RightBorder;
if (x + GetStep() < FieldWidth) MoveRight();
int y = objParams.DownBorder;
if (y + GetStep() < FieldHeight) MoveDown();
}
}

View File

@ -0,0 +1,52 @@
namespace ProjectStormtrooper.MovementStrategy;
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

@ -0,0 +1,60 @@
using ProjectStormtrooper.Drawnings;
namespace ProjectStormtrooper.MovementStrategy;
/// <summary>
/// Класс-реализации IMoveableObject с использованием DrawingStormtrooperBase
/// </summary>
public class MoveableStormtrooperBase : IMoveableObject
{
/// <summary>
/// Поле-объект класса DrawningStormtrooperBase или его наследников
/// </summary>
private readonly DrawningStormtrooperBase? _stormtrooper = null;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="Stormtrooper">Объект класса DrawningStormtrooperBase</param>
public MoveableStormtrooperBase(DrawningStormtrooperBase Stormtrooper)
{
_stormtrooper = Stormtrooper;
}
public ObjectParameters? GetObjectPosition
{
get
{
if (_stormtrooper == null || _stormtrooper.EntityStormtrooperBase == null || !_stormtrooper.GetPosX.HasValue || !_stormtrooper.GetPosY.HasValue)
{
return null;
}
return new ObjectParameters(_stormtrooper.GetPosX.Value,_stormtrooper.GetPosY.Value,_stormtrooper.GetWidth,_stormtrooper.GetHeight);
}
}
public int GetStep => (int)(_stormtrooper?.EntityStormtrooperBase?.Step ?? 0);
public bool TryMoveObject(MovementDirection direction)
{
if (_stormtrooper == null || _stormtrooper.EntityStormtrooperBase == null)
{
return false;
}
return _stormtrooper.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

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

View File

@ -0,0 +1,61 @@
namespace ProjectStormtrooper.MovementStrategy;
/// <summary>
/// Параметры-координаты объекта
/// </summary>
public class ObjectParameters
{
/// <summary>
/// Координатва х
/// </summary>
private readonly int _x;
/// <summary>
/// Координатва у
/// </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">Координата х</param>
/// <param name="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

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