This commit is contained in:
Sharosh322 2023-12-09 22:36:48 +04:00
parent c5f197893f
commit 0e2ce08130
19 changed files with 735 additions and 106 deletions

View File

@ -6,14 +6,37 @@ using System.Threading.Tasks;
namespace ProjStormtrooper namespace ProjStormtrooper
{ {
/// <summary>
/// Класс-стратегия перемещения объекта
/// </summary>
public abstract class AbstractStrategy public abstract class AbstractStrategy
{ {
/// <summary>
/// Перемещаемый объект
/// </summary>
private IMoveableObject? _moveableObject; private IMoveableObject? _moveableObject;
/// <summary>
/// Статус перемещения
/// </summary>
private Status _state = Status.NotInit; private Status _state = Status.NotInit;
/// <summary>
/// Ширина поля
/// </summary>
protected int FieldWidth { get; private set; } protected int FieldWidth { get; private set; }
/// <summary>
/// Высота поля
/// </summary>
protected int FieldHeight { get; private set; } protected int FieldHeight { get; private set; }
/// <summary>
/// Статус перемещения
/// </summary>
public Status GetStatus() { return _state; } public Status 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) public void SetData(IMoveableObject moveableObject, int width, int height)
{ {
if (moveableObject == null) if (moveableObject == null)
@ -26,7 +49,9 @@ namespace ProjStormtrooper
FieldWidth = width; FieldWidth = width;
FieldHeight = height; FieldHeight = height;
} }
/// <summary>
/// Шаг перемещения
/// </summary>
public void MakeStep() public void MakeStep()
{ {
if (_state != Status.InProgress) if (_state != Status.InProgress)
@ -40,12 +65,34 @@ namespace ProjStormtrooper
} }
MoveToTarget(); MoveToTarget();
} }
/// <summary>
/// Перемещение влево
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveLeft() => MoveTo(Direction.Left); protected bool MoveLeft() => MoveTo(Direction.Left);
/// <summary>
/// Перемещение вправо
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveRight() => MoveTo(Direction.Right); protected bool MoveRight() => MoveTo(Direction.Right);
/// <summary>
/// Перемещение вверх
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveUp() => MoveTo(Direction.Up); protected bool MoveUp() => MoveTo(Direction.Up);
/// <summary>
/// Перемещение вниз
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveDown() => MoveTo(Direction.Down); protected bool MoveDown() => MoveTo(Direction.Down);
/// <summary>
/// Параметры объекта
/// </summary>
protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition; protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition;
/// <summary>
/// Шаг объекта
/// </summary>
/// <returns></returns>
protected int? GetStep() protected int? GetStep()
{ {
if (_state != Status.InProgress) if (_state != Status.InProgress)
@ -54,8 +101,20 @@ namespace ProjStormtrooper
} }
return _moveableObject?.GetStep; return _moveableObject?.GetStep;
} }
/// <summary>
/// Перемещение к цели
/// </summary>
protected abstract void MoveToTarget(); protected abstract void MoveToTarget();
/// <summary>
/// Достигнута ли цель
/// </summary>
/// <returns></returns>
protected abstract bool IsTargetDestinaion(); protected abstract bool IsTargetDestinaion();
/// <summary>
/// Попытка перемещения в требуемом направлении
/// </summary>
/// <param name="directionType">Направление</param>
/// <returns>Результат попытки (true - удалось переместиться, false - неудача)</returns>
private bool MoveTo(Direction directionType) private bool MoveTo(Direction directionType)
{ {
if (_state != Status.InProgress) if (_state != Status.InProgress)

View File

@ -8,9 +8,21 @@ namespace ProjStormtrooper
{ {
public enum Direction public enum Direction
{ {
/// <summary>
/// Вверх
/// </summary>
Up = 1, Up = 1,
/// <summary>
/// Вниз
/// </summary>
Down = 2, Down = 2,
/// <summary>
/// Влево
/// </summary>
Left = 3, Left = 3,
/// <summary>
/// Вправо
/// </summary>
Right = 4 Right = 4
} }
} }

View File

@ -6,6 +6,9 @@ using System.Threading.Tasks;
namespace ProjStormtrooper namespace ProjStormtrooper
{ {
/// <summary>
/// Реализация интерфейса IDrawningObject для работы с объектом DrawningPlane (паттерн Adapter)
/// </summary>
public class DrawingObjectPlane : IMoveableObject public class DrawingObjectPlane : IMoveableObject
{ {
private readonly DrawingPlane? _drawingPlane = null; private readonly DrawingPlane? _drawingPlane = null;

View File

@ -6,20 +6,63 @@ using System.Threading.Tasks;
namespace ProjStormtrooper namespace ProjStormtrooper
{ {
/// <summary>
/// Класс отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawingPlane public class DrawingPlane
{ {
/// <summary>
/// Класс-сущность
/// </summary>
public EntityPlane? EntityPlane { get; protected set; } public EntityPlane? EntityPlane { get; protected set; }
/// <summary>
/// Ширина окна
/// </summary>
private int _pictureWidth; private int _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int _pictureHeight; private int _pictureHeight;
/// <summary>
/// Левая координата начала прорисовки
/// </summary>
protected int _startPosX; protected int _startPosX;
/// <summary>
/// Верхняя координата начала прорисовки
/// </summary>
protected int _startPosY; protected int _startPosY;
/// <summary>
/// Ширина прорисовки
/// </summary>
protected readonly int _planeWidth = 110; protected readonly int _planeWidth = 110;
/// <summary>
/// Высота прорисовки
/// </summary>
protected readonly int _planeHeight = 110; protected readonly int _planeHeight = 110;
/// <summary>
/// Координата X объекта
/// </summary>
public int GetPosX => _startPosX; public int GetPosX => _startPosX;
/// <summary>
/// Координата Y объекта
/// </summary>
public int GetPosY => _startPosY; public int GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth => _planeWidth; public int GetWidth => _planeWidth;
/// <summary>
/// Высота объекта
/// </summary>
public int GetHeight => _planeHeight; public int GetHeight => _planeHeight;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
public DrawingPlane(int speed, double weight, Color bodyColor, int width, int height) public DrawingPlane(int speed, double weight, Color bodyColor, int width, int height)
{ {
if (width < _planeWidth && height < _planeHeight) if (width < _planeWidth && height < _planeHeight)
@ -30,7 +73,16 @@ namespace ProjStormtrooper
_pictureHeight = height; _pictureHeight = height;
EntityPlane = new EntityPlane(speed, weight, bodyColor); EntityPlane = new EntityPlane(speed, weight, bodyColor);
} }
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="width">Ширина окна</param>
/// <param name="height">Высота окна</param>
/// <param name="planeWidth">Ширина объекта</param>
/// <param name="planeHeight">Высота объекта</param>
protected DrawingPlane(int speed, double weight, Color bodyColor, protected DrawingPlane(int speed, double weight, Color bodyColor,
int width, int height, int planeWidth, int planeHeight) int width, int height, int planeWidth, int planeHeight)
{ {
@ -44,7 +96,11 @@ namespace ProjStormtrooper
_planeHeight = planeHeight; _planeHeight = planeHeight;
EntityPlane = new EntityPlane(speed, weight, bodyColor); EntityPlane = new EntityPlane(speed, weight, bodyColor);
} }
/// <summary>
/// Проверка, что объект может переместится по указанному направлению
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - можно переместится по указанному направлению</returns>
public bool CanMove(Direction direction) public bool CanMove(Direction direction)
{ {
if (EntityPlane == null) if (EntityPlane == null)
@ -53,18 +109,22 @@ namespace ProjStormtrooper
} }
return direction switch return direction switch
{ {
//вверх
Direction.Up => _startPosY - EntityPlane.Step > 0, Direction.Up => _startPosY - EntityPlane.Step > 0,
//вниз
Direction.Down => _startPosY + _planeHeight + EntityPlane.Step < _pictureHeight, Direction.Down => _startPosY + _planeHeight + EntityPlane.Step < _pictureHeight,
//влево
Direction.Left => _startPosX - EntityPlane.Step > 0, Direction.Left => _startPosX - EntityPlane.Step > 0,
//вправо
Direction.Right => _startPosX + _planeWidth + EntityPlane.Step < _pictureWidth, Direction.Right => _startPosX + _planeWidth + EntityPlane.Step < _pictureWidth,
_ => false, _ => false,
}; };
} }
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y) public void SetPosition(int x, int y)
{ {
if (x < 0) if (x < 0)
@ -87,7 +147,10 @@ namespace ProjStormtrooper
} }
_startPosY = y; _startPosY = y;
} }
/// <summary>
/// Перемещение объекта
/// </summary>
/// <param name="direction">Направление перемещения</param>
public void MoveTransport(Direction direction) public void MoveTransport(Direction direction)
{ {
if (!CanMove(direction) || EntityPlane == null) if (!CanMove(direction) || EntityPlane == null)
@ -96,25 +159,28 @@ namespace ProjStormtrooper
} }
switch (direction) switch (direction)
{ {
// Вверх
case Direction.Up: case Direction.Up:
_startPosY -= (int)EntityPlane.Step; _startPosY -= (int)EntityPlane.Step;
break; break;
// Вниз
case Direction.Down: case Direction.Down:
_startPosY += (int)EntityPlane.Step; _startPosY += (int)EntityPlane.Step;
break; break;
// Влево
case Direction.Left: case Direction.Left:
_startPosX -= (int)EntityPlane.Step; _startPosX -= (int)EntityPlane.Step;
break; break;
// Вправо
case Direction.Right: case Direction.Right:
_startPosX += (int)EntityPlane.Step; _startPosX += (int)EntityPlane.Step;
break; break;
} }
} }
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public virtual void DrawTransport(Graphics g) public virtual void DrawTransport(Graphics g)
{ {
if (EntityPlane == null) if (EntityPlane == null)
@ -125,10 +191,10 @@ namespace ProjStormtrooper
Brush brushBlack = new SolidBrush(Color.Black); Brush brushBlack = new SolidBrush(Color.Black);
Brush brushBodyColor = new SolidBrush(EntityPlane.BodyColor); Brush brushBodyColor = new SolidBrush(EntityPlane.BodyColor);
// Высота фюзеляжа
int bodyHeight = _planeHeight / 9; int bodyHeight = _planeHeight / 9;
// Рисуем нос
Point[] pointsCockPit = { Point[] pointsCockPit = {
new Point(_startPosX, _startPosY + _planeHeight / 2), new Point(_startPosX, _startPosY + _planeHeight / 2),
@ -138,7 +204,7 @@ namespace ProjStormtrooper
g.FillPolygon(brushBlack, pointsCockPit); g.FillPolygon(brushBlack, pointsCockPit);
// Рисуем крылья
Point[] pointsWings = { Point[] pointsWings = {
new Point(_startPosX + _planeWidth / 2, _startPosY), new Point(_startPosX + _planeWidth / 2, _startPosY),
@ -151,6 +217,7 @@ namespace ProjStormtrooper
g.FillPolygon(brushBodyColor, pointsWings); g.FillPolygon(brushBodyColor, pointsWings);
g.DrawPolygon(penBlack, pointsWings); g.DrawPolygon(penBlack, pointsWings);
// Рисуем хвост
Point[] pointsTail = { Point[] pointsTail = {
new Point(_startPosX + _planeWidth, _startPosY + _planeHeight / 2 - _planeHeight / 3), new Point(_startPosX + _planeWidth, _startPosY + _planeHeight / 2 - _planeHeight / 3),
@ -161,12 +228,16 @@ namespace ProjStormtrooper
}; };
g.FillPolygon(brushBodyColor, pointsTail); g.FillPolygon(brushBodyColor, pointsTail);
g.DrawPolygon(penBlack, pointsTail); g.DrawPolygon(penBlack, pointsTail);
// Рисуем фюзеляж
g.FillRectangle(brushBodyColor, _startPosX + _planeWidth / 8, _startPosY + _planeHeight / 2 - bodyHeight / 2, _planeWidth - _planeWidth / 8, bodyHeight); g.FillRectangle(brushBodyColor, _startPosX + _planeWidth / 8, _startPosY + _planeHeight / 2 - bodyHeight / 2, _planeWidth - _planeWidth / 8, bodyHeight);
g.DrawRectangle(penBlack, _startPosX + _planeWidth / 8, _startPosY + _planeHeight / 2 - bodyHeight / 2, _planeWidth - _planeWidth / 8, bodyHeight); g.DrawRectangle(penBlack, _startPosX + _planeWidth / 8, _startPosY + _planeHeight / 2 - bodyHeight / 2, _planeWidth - _planeWidth / 8, bodyHeight);
} }
/// <summary>
/// Получение объекта IMoveableObject из объекта DrawingPlane
/// </summary>
public IMoveableObject GetMoveableObject => new DrawingObjectPlane(this); public IMoveableObject GetMoveableObject => new DrawingObjectPlane(this);
} }
} }

View File

@ -8,6 +8,17 @@ namespace ProjStormtrooper
{ {
public class DrawingStormtrooper : DrawingPlane public class DrawingStormtrooper : DrawingPlane
{ {
/// <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>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
public DrawingStormtrooper(int speed, double weight, Color bodyColor, public DrawingStormtrooper(int speed, double weight, Color bodyColor,
Color additionalColor, bool rockets, bool bombs, Color additionalColor, bool rockets, bool bombs,
int width, int height) : base(speed, weight, bodyColor, width, height, 140, 90) int width, int height) : base(speed, weight, bodyColor, width, height, 140, 90)
@ -17,7 +28,10 @@ namespace ProjStormtrooper
EntityPlane = new EntityStormtrooper(speed, weight, bodyColor, additionalColor, rockets, bombs); EntityPlane = new EntityStormtrooper(speed, weight, bodyColor, additionalColor, rockets, bombs);
} }
} }
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public override void DrawTransport(Graphics g) public override void DrawTransport(Graphics g)
{ {
if (EntityPlane is not EntityStormtrooper stormtrooper) if (EntityPlane is not EntityStormtrooper stormtrooper)
@ -28,10 +42,10 @@ namespace ProjStormtrooper
Brush brushBlack = new SolidBrush(Color.Black); Brush brushBlack = new SolidBrush(Color.Black);
Brush brushAdditionalColor = new SolidBrush(stormtrooper.AdditionalColor); Brush brushAdditionalColor = new SolidBrush(stormtrooper.AdditionalColor);
// Высота фюзеляжа
int bodyHeight = _planeHeight / 9; int bodyHeight = _planeHeight / 9;
// Рисуем бомбы
if (stormtrooper.Bombs) if (stormtrooper.Bombs)
{ {
Point[] pointsBombTail = { Point[] pointsBombTail = {
@ -81,7 +95,7 @@ namespace ProjStormtrooper
bodyHeight); bodyHeight);
} }
// Рисуем ракеты
if (stormtrooper.Rockets) if (stormtrooper.Rockets)
{ {
int rocketWidth = bodyHeight * 4; int rocketWidth = bodyHeight * 4;

View File

@ -8,12 +8,33 @@ using static System.Reflection.Metadata.BlobBuilder;
namespace ProjStormtrooper namespace ProjStormtrooper
{ {
/// <summary>
/// Класс-сущность "Самолет"
/// </summary>
public class EntityPlane public class EntityPlane
{ {
/// <summary>
/// Скорость
/// </summary>
public int Speed { get; private set; } public int Speed { get; private set; }
/// <summary>
/// Вес
/// </summary>
public double Weight { get; private set; } public double Weight { get; private set; }
/// <summary>
/// Основной цвет
/// </summary>
public Color BodyColor { get; private set; } public Color BodyColor { get; private set; }
/// <summary>
/// Шаг перемещения
/// </summary>
public double Step => (double)Speed * 250 / Weight; public double Step => (double)Speed * 250 / Weight;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed"></param>
/// <param name="weight"></param>
/// <param name="bodyColor"></param>
public EntityPlane(int speed, double weight, Color bodyColor) public EntityPlane(int speed, double weight, Color bodyColor)
{ {
Speed = speed; Speed = speed;

View File

@ -9,7 +9,13 @@ namespace ProjStormtrooper
public class EntityStormtrooper : EntityPlane public class EntityStormtrooper : EntityPlane
{ {
public Color AdditionalColor { get; private set; } public Color AdditionalColor { get; private set; }
/// <summary>
/// Признак (опция) наличия ракет
/// </summary>
public bool Rockets { get; private set; } public bool Rockets { get; private set; }
/// <summary>
/// Признак (опция) наличия бомб
/// </summary>
public bool Bombs { get; private set; } public bool Bombs { get; private set; }
public EntityStormtrooper(int speed, double weight, Color bodyColor, public EntityStormtrooper(int speed, double weight, Color bodyColor,
Color additionalColor, bool rockets, bool bombs) : base(speed, weight, bodyColor) Color additionalColor, bool rockets, bool bombs) : base(speed, weight, bodyColor)

View File

@ -6,11 +6,29 @@ using System.Threading.Tasks;
namespace ProjStormtrooper namespace ProjStormtrooper
{ {
/// <summary>
/// Интерфейс для работы с перемещаемым объектом
/// </summary>
public interface IMoveableObject public interface IMoveableObject
{ {
/// <summary>
/// Получение координаты X объекта
/// </summary>
ObjectParameters? GetObjectPosition { get; } ObjectParameters? GetObjectPosition { get; }
/// <summary>
/// Шаг объекта
/// </summary>
int GetStep { get; } int GetStep { get; }
/// <summary>
/// Проверка, можно ли переместиться по нужному направлению
/// </summary>
/// <param name="direction"></param>
/// <returns></returns>
bool CheckCanMove(Direction direction); bool CheckCanMove(Direction direction);
/// <summary>
/// Изменение направления перемещения объекта
/// </summary>
/// <param name="direction">Направление</param>
void MoveObject(Direction direction); void MoveObject(Direction direction);
} }
} }

View File

@ -6,6 +6,9 @@ using System.Threading.Tasks;
namespace ProjStormtrooper namespace ProjStormtrooper
{ {
/// <summary>
/// Стратегия перемещения объекта в центр экрана
/// </summary>
public class MoveToCenter : AbstractStrategy public class MoveToCenter : AbstractStrategy
{ {
protected override bool IsTargetDestinaion() protected override bool IsTargetDestinaion()

View File

@ -6,18 +6,46 @@ using System.Threading.Tasks;
namespace ProjStormtrooper namespace ProjStormtrooper
{ {
/// <summary>
/// Параметры-координаты объекта
/// </summary>
public class ObjectParameters public class ObjectParameters
{ {
private readonly int _x; private readonly int _x;
private readonly int _y; private readonly int _y;
private readonly int _width; private readonly int _width;
private readonly int _height; private readonly int _height;
/// <summary>
/// Левая граница
/// </summary>
public int LeftBorder => _x; public int LeftBorder => _x;
/// <summary>
/// Верхняя граница
/// </summary>
public int TopBorder => _y; public int TopBorder => _y;
/// <summary>
/// Правая граница
/// </summary>
public int RightBorder => _x + _width; public int RightBorder => _x + _width;
/// <summary>
/// Нижняя граница
/// </summary>
public int DownBorder => _y + _height; public int DownBorder => _y + _height;
/// <summary>
/// Середина объекта
/// </summary>
public int ObjectMiddleHorizontal => _x + _width / 2; public int ObjectMiddleHorizontal => _x + _width / 2;
/// <summary>
/// Середина объекта
/// </summary>
public int ObjectMiddleVertical => _y + _height / 2; 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) public ObjectParameters(int x, int y, int width, int height)
{ {
_x = x; _x = x;

View File

@ -29,44 +29,106 @@
private void InitializeComponent() private void InitializeComponent()
{ {
groupBoxTools = new GroupBox(); groupBoxTools = new GroupBox();
groupBoxStorages = new GroupBox();
buttonRemoveStorage = new Button();
buttonAddStorage = new Button();
textBoxStorageName = new TextBox();
listBoxStorages = new ListBox();
maskedTextBoxNumber = new MaskedTextBox(); maskedTextBoxNumber = new MaskedTextBox();
buttonRefreshCollection = new Button(); buttonRefreshCollection = new Button();
buttonRemovePlane = new Button(); buttonRemovePlane = new Button();
buttonAddPlane = new Button(); buttonAddPlane = new Button();
pictureBoxCollection = new PictureBox(); pictureBoxCollection = new PictureBox();
groupBoxTools.SuspendLayout(); groupBoxTools.SuspendLayout();
groupBoxStorages.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBoxCollection).BeginInit(); ((System.ComponentModel.ISupportInitialize)pictureBoxCollection).BeginInit();
SuspendLayout(); SuspendLayout();
// //
// groupBoxTools // groupBoxTools
// //
groupBoxTools.Controls.Add(groupBoxStorages);
groupBoxTools.Controls.Add(maskedTextBoxNumber); groupBoxTools.Controls.Add(maskedTextBoxNumber);
groupBoxTools.Controls.Add(buttonRefreshCollection); groupBoxTools.Controls.Add(buttonRefreshCollection);
groupBoxTools.Controls.Add(buttonRemovePlane); groupBoxTools.Controls.Add(buttonRemovePlane);
groupBoxTools.Controls.Add(buttonAddPlane); groupBoxTools.Controls.Add(buttonAddPlane);
groupBoxTools.Dock = DockStyle.Right; groupBoxTools.Dock = DockStyle.Right;
groupBoxTools.Location = new Point(787, 0); groupBoxTools.Location = new Point(689, 0);
groupBoxTools.Margin = new Padding(3, 2, 3, 2);
groupBoxTools.Name = "groupBoxTools"; groupBoxTools.Name = "groupBoxTools";
groupBoxTools.Size = new Size(230, 538); groupBoxTools.Padding = new Padding(3, 2, 3, 2);
groupBoxTools.Size = new Size(201, 404);
groupBoxTools.TabIndex = 0; groupBoxTools.TabIndex = 0;
groupBoxTools.TabStop = false; groupBoxTools.TabStop = false;
groupBoxTools.Text = "Инструменты"; groupBoxTools.Text = "Инструменты";
// //
// groupBoxStorages
//
groupBoxStorages.Controls.Add(buttonRemoveStorage);
groupBoxStorages.Controls.Add(buttonAddStorage);
groupBoxStorages.Controls.Add(textBoxStorageName);
groupBoxStorages.Controls.Add(listBoxStorages);
groupBoxStorages.Location = new Point(6, 21);
groupBoxStorages.Name = "groupBoxStorages";
groupBoxStorages.Size = new Size(189, 204);
groupBoxStorages.TabIndex = 6;
groupBoxStorages.TabStop = false;
groupBoxStorages.Text = "Наборы";
//
// buttonRemoveStorage
//
buttonRemoveStorage.Location = new Point(6, 175);
buttonRemoveStorage.Name = "buttonRemoveStorage";
buttonRemoveStorage.Size = new Size(177, 23);
buttonRemoveStorage.TabIndex = 8;
buttonRemoveStorage.Text = "Удалить набор";
buttonRemoveStorage.UseVisualStyleBackColor = true;
buttonRemoveStorage.Click += buttonRemoveStorage_Click;
//
// buttonAddStorage
//
buttonAddStorage.Location = new Point(6, 51);
buttonAddStorage.Name = "buttonAddStorage";
buttonAddStorage.Size = new Size(177, 23);
buttonAddStorage.TabIndex = 7;
buttonAddStorage.Text = "Добавить набор";
buttonAddStorage.UseVisualStyleBackColor = true;
buttonAddStorage.Click += buttonAddStorage_Click;
//
// textBoxStorageName
//
textBoxStorageName.Location = new Point(6, 22);
textBoxStorageName.Name = "textBoxStorageName";
textBoxStorageName.Size = new Size(177, 23);
textBoxStorageName.TabIndex = 6;
textBoxStorageName.TextChanged += textBoxStorageName_TextChanged;
//
// listBoxStorages
//
listBoxStorages.FormattingEnabled = true;
listBoxStorages.ItemHeight = 15;
listBoxStorages.Location = new Point(6, 79);
listBoxStorages.Name = "listBoxStorages";
listBoxStorages.Size = new Size(177, 94);
listBoxStorages.TabIndex = 5;
listBoxStorages.SelectedIndexChanged += listBoxStorages_SelectedIndexChanged;
//
// maskedTextBoxNumber // maskedTextBoxNumber
// //
maskedTextBoxNumber.Location = new Point(6, 87); maskedTextBoxNumber.Location = new Point(5, 318);
maskedTextBoxNumber.Margin = new Padding(3, 2, 3, 2);
maskedTextBoxNumber.Mask = "00"; maskedTextBoxNumber.Mask = "00";
maskedTextBoxNumber.Name = "maskedTextBoxNumber"; maskedTextBoxNumber.Name = "maskedTextBoxNumber";
maskedTextBoxNumber.Size = new Size(218, 27); maskedTextBoxNumber.Size = new Size(191, 23);
maskedTextBoxNumber.TabIndex = 4; maskedTextBoxNumber.TabIndex = 4;
maskedTextBoxNumber.TextAlign = HorizontalAlignment.Center; maskedTextBoxNumber.TextAlign = HorizontalAlignment.Center;
maskedTextBoxNumber.ValidatingType = typeof(int); maskedTextBoxNumber.ValidatingType = typeof(int);
// //
// buttonRefreshCollection // buttonRefreshCollection
// //
buttonRefreshCollection.Location = new Point(6, 180); buttonRefreshCollection.Location = new Point(5, 371);
buttonRefreshCollection.Margin = new Padding(3, 2, 3, 2);
buttonRefreshCollection.Name = "buttonRefreshCollection"; buttonRefreshCollection.Name = "buttonRefreshCollection";
buttonRefreshCollection.Size = new Size(218, 29); buttonRefreshCollection.Size = new Size(191, 22);
buttonRefreshCollection.TabIndex = 3; buttonRefreshCollection.TabIndex = 3;
buttonRefreshCollection.Text = "Обновить коллекцию"; buttonRefreshCollection.Text = "Обновить коллекцию";
buttonRefreshCollection.UseVisualStyleBackColor = true; buttonRefreshCollection.UseVisualStyleBackColor = true;
@ -74,9 +136,10 @@
// //
// buttonRemovePlane // buttonRemovePlane
// //
buttonRemovePlane.Location = new Point(6, 120); buttonRemovePlane.Location = new Point(5, 345);
buttonRemovePlane.Margin = new Padding(3, 2, 3, 2);
buttonRemovePlane.Name = "buttonRemovePlane"; buttonRemovePlane.Name = "buttonRemovePlane";
buttonRemovePlane.Size = new Size(218, 29); buttonRemovePlane.Size = new Size(191, 22);
buttonRemovePlane.TabIndex = 2; buttonRemovePlane.TabIndex = 2;
buttonRemovePlane.Text = "Удалить самолет"; buttonRemovePlane.Text = "Удалить самолет";
buttonRemovePlane.UseVisualStyleBackColor = true; buttonRemovePlane.UseVisualStyleBackColor = true;
@ -84,9 +147,10 @@
// //
// buttonAddPlane // buttonAddPlane
// //
buttonAddPlane.Location = new Point(6, 26); buttonAddPlane.Location = new Point(4, 292);
buttonAddPlane.Margin = new Padding(3, 2, 3, 2);
buttonAddPlane.Name = "buttonAddPlane"; buttonAddPlane.Name = "buttonAddPlane";
buttonAddPlane.Size = new Size(218, 29); buttonAddPlane.Size = new Size(191, 22);
buttonAddPlane.TabIndex = 0; buttonAddPlane.TabIndex = 0;
buttonAddPlane.Text = "Добавить самолет"; buttonAddPlane.Text = "Добавить самолет";
buttonAddPlane.UseVisualStyleBackColor = true; buttonAddPlane.UseVisualStyleBackColor = true;
@ -96,22 +160,26 @@
// //
pictureBoxCollection.Dock = DockStyle.Fill; pictureBoxCollection.Dock = DockStyle.Fill;
pictureBoxCollection.Location = new Point(0, 0); pictureBoxCollection.Location = new Point(0, 0);
pictureBoxCollection.Margin = new Padding(3, 2, 3, 2);
pictureBoxCollection.Name = "pictureBoxCollection"; pictureBoxCollection.Name = "pictureBoxCollection";
pictureBoxCollection.Size = new Size(787, 538); pictureBoxCollection.Size = new Size(689, 404);
pictureBoxCollection.TabIndex = 1; pictureBoxCollection.TabIndex = 1;
pictureBoxCollection.TabStop = false; pictureBoxCollection.TabStop = false;
// //
// FormPlaneCollection // PlaneCollection
// //
AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1017, 538); ClientSize = new Size(890, 404);
Controls.Add(pictureBoxCollection); Controls.Add(pictureBoxCollection);
Controls.Add(groupBoxTools); Controls.Add(groupBoxTools);
Name = "FormPlaneCollection"; Margin = new Padding(3, 2, 3, 2);
Name = "PlaneCollection";
Text = "Набор самолетов"; Text = "Набор самолетов";
groupBoxTools.ResumeLayout(false); groupBoxTools.ResumeLayout(false);
groupBoxTools.PerformLayout(); groupBoxTools.PerformLayout();
groupBoxStorages.ResumeLayout(false);
groupBoxStorages.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureBoxCollection).EndInit(); ((System.ComponentModel.ISupportInitialize)pictureBoxCollection).EndInit();
ResumeLayout(false); ResumeLayout(false);
} }
@ -124,5 +192,10 @@
private Button buttonAddPlane; private Button buttonAddPlane;
private MaskedTextBox maskedTextBoxNumber; private MaskedTextBox maskedTextBoxNumber;
private PictureBox pictureBoxCollection; private PictureBox pictureBoxCollection;
private GroupBox groupBoxStorages;
private TextBox textBoxStorageName;
private ListBox listBoxStorages;
private Button buttonAddStorage;
private Button buttonRemoveStorage;
} }
} }

View File

@ -10,23 +10,65 @@ using System.Windows.Forms;
namespace ProjStormtrooper namespace ProjStormtrooper
{ {
/// <summary>
/// Форма для работы с набором объектов класса DrawningPlane
/// </summary>
public partial class PlaneCollection : Form public partial class PlaneCollection : Form
{ {
private readonly PlanesGenericCollection<DrawingPlane, DrawingObjectPlane> _planes; /// <summary>
/// Набор объектов
/// </summary>
private readonly PlanesGenericStorage _storage;
/// <summary>
/// Конструктор
/// </summary>
public PlaneCollection() public PlaneCollection()
{ {
InitializeComponent(); InitializeComponent();
_planes = new PlanesGenericCollection<DrawingPlane, DrawingObjectPlane>(pictureBoxCollection.Width, pictureBoxCollection.Height); _storage = new PlanesGenericStorage(pictureBoxCollection.Width, pictureBoxCollection.Height);
} }
private void ReloadObjects()
{
int index = listBoxStorages.SelectedIndex;
listBoxStorages.Items.Clear();
for (int i = 0; i < _storage.Keys.Count; i++)
{
listBoxStorages.Items.Add(_storage.Keys[i]);
}
if (listBoxStorages.Items.Count > 0 && (index == -1 || index >= listBoxStorages.Items.Count))
{
listBoxStorages.SelectedIndex = 0;
}
else if (listBoxStorages.Items.Count > 0 && index > -1 && index < listBoxStorages.Items.Count)
{
listBoxStorages.SelectedIndex = index;
}
}
/// <summary>
/// Добавление объекта в набор
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
///
private void buttonAddPlane_Click(object sender, EventArgs e) private void buttonAddPlane_Click(object sender, EventArgs e)
{ {
if (listBoxStorages.SelectedIndex == -1)
{
return;
}
var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty];
if (obj == null)
{
return;
}
Stormtrooper form = new(); Stormtrooper form = new();
if (form.ShowDialog() == DialogResult.OK) if (form.ShowDialog() == DialogResult.OK)
{ {
if (_planes + form.SelectedPlane > -1) if (obj + form.SelectedPlane > -1)
{ {
MessageBox.Show("Объект добавлен"); MessageBox.Show("Объект добавлен");
pictureBoxCollection.Image = _planes.ShowPlanes(); pictureBoxCollection.Image = obj.ShowPlanes();
} }
else else
{ {
@ -34,26 +76,83 @@ namespace ProjStormtrooper
} }
} }
} }
/// <summary>
/// Удаление объекта из набора
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonRemovePlane_Click(object sender, EventArgs e) private void buttonRemovePlane_Click(object sender, EventArgs e)
{ {
if (listBoxStorages.SelectedIndex == -1)
{
return;
}
var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty];
if (obj == null)
{
return;
}
if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{ {
return; return;
} }
int pos = Convert.ToInt32(maskedTextBoxNumber.Text); int pos = Convert.ToInt32(maskedTextBoxNumber.Text);
if (_planes - pos != null) if (obj - pos != null)
{ {
MessageBox.Show("Объект удален"); MessageBox.Show("Объект удален");
pictureBoxCollection.Image = _planes.ShowPlanes(); pictureBoxCollection.Image = obj.ShowPlanes();
} }
else else
{ {
MessageBox.Show("Не удалось удалить объект"); MessageBox.Show("Не удалось удалить объект");
} }
} }
/// <summary>
/// Обновление рисунка по набору
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonRefreshCollection_Click(object sender, EventArgs e) private void buttonRefreshCollection_Click(object sender, EventArgs e)
{ {
pictureBoxCollection.Image = _planes.ShowPlanes(); if (listBoxStorages.SelectedIndex == -1)
{
return;
}
var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty];
if (obj == null)
{
return;
}
pictureBoxCollection.Image = obj.ShowPlanes();
}
private void buttonAddStorage_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBoxStorageName.Text))
{
MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
_storage.AddSet(textBoxStorageName.Text);
ReloadObjects();
}
private void listBoxStorages_SelectedIndexChanged(object sender, EventArgs e)
{
pictureBoxCollection.Image = _storage[listBoxStorages.SelectedItem?.ToString() ?? string.Empty]?.ShowPlanes();
}
private void buttonRemoveStorage_Click(object sender, EventArgs e)
{
if (listBoxStorages.SelectedIndex == -1)
{
return;
}
if (MessageBox.Show($"Удалить объект {listBoxStorages.SelectedItem}?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
_storage.DelSet(listBoxStorages.SelectedItem.ToString() ?? string.Empty);
ReloadObjects();
}
} }
} }
} }

View File

@ -18,7 +18,7 @@
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing"">Blue</data> <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value> <value>[base64 mime encoded serialized .NET Framework object]</value>
</data> </data>

View File

@ -6,15 +6,40 @@ using System.Threading.Tasks;
namespace ProjStormtrooper namespace ProjStormtrooper
{ {
/// <summary>
/// Параметризованный класс для набора объектов DrawningPlane
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="U"></typeparam>
internal class PlanesGenericCollection<T, U> internal class PlanesGenericCollection<T, U>
where T : DrawingPlane where T : DrawingPlane
where U : IMoveableObject where U : IMoveableObject
{ {
/// <summary>
/// Ширина окна прорисовки
/// </summary>
private readonly int _pictureWidth; private readonly int _pictureWidth;
/// <summary>
/// Высота окна прорисовки
/// </summary>
private readonly int _pictureHeight; private readonly int _pictureHeight;
/// <summary>
/// Размер занимаемого объектом места (ширина)
/// </summary>
private readonly int _placeSizeWidth = 160; private readonly int _placeSizeWidth = 160;
/// <summary>
/// Размер занимаемого объектом места (высота)
/// </summary>
private readonly int _placeSizeHeight = 120; private readonly int _placeSizeHeight = 120;
/// <summary>
/// Набор объектов
/// </summary>
private readonly SetGeneric<T> _collection; private readonly SetGeneric<T> _collection;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="picWidth"></param>
/// <param name="picHeight"></param>
public PlanesGenericCollection(int picWidth, int picHeight) public PlanesGenericCollection(int picWidth, int picHeight)
{ {
int horizontalObjectsCount = picWidth / _placeSizeWidth; int horizontalObjectsCount = picWidth / _placeSizeWidth;
@ -23,7 +48,12 @@ namespace ProjStormtrooper
_pictureHeight = picHeight; _pictureHeight = picHeight;
_collection = new SetGeneric<T>(horizontalObjectsCount * verticalObjectsCount); _collection = new SetGeneric<T>(horizontalObjectsCount * verticalObjectsCount);
} }
/// <summary>
/// Перегрузка оператора сложения
/// </summary>
/// <param name="collect"></param>
/// <param name="obj"></param>
/// <returns></returns>
public static int operator +(PlanesGenericCollection<T, U> collect, T? obj) public static int operator +(PlanesGenericCollection<T, U> collect, T? obj)
{ {
if (obj == null) if (obj == null)
@ -32,22 +62,34 @@ namespace ProjStormtrooper
} }
return collect?._collection.Insert(obj) ?? -1; return collect?._collection.Insert(obj) ?? -1;
} }
/// <summary>
public static bool operator -(PlanesGenericCollection<T, U> collect, int pos) /// Перегрузка оператора вычитания
/// </summary>
/// <param name="collect"></param>
/// <param name="pos"></param>
/// <returns></returns>
public static T? operator -(PlanesGenericCollection<T, U> collect, int pos)
{ {
T? obj = collect._collection.Get(pos); T? obj = collect._collection[pos];
if (obj != null) if (obj != null)
{ {
collect._collection.Remove(pos); collect._collection.Remove(pos);
} }
return false; return obj;
} }
/// <summary>
/// Получение объекта IMoveableObject
/// </summary>
/// <param name="pos"></param>
/// <returns></returns>
public U? GetU(int pos) public U? GetU(int pos)
{ {
return (U?)_collection.Get(pos)?.GetMoveableObject; return (U?)_collection[pos]?.GetMoveableObject;
} }
/// <summary>
/// Вывод всего набора объектов
/// </summary>
/// <returns></returns>
public Bitmap ShowPlanes() public Bitmap ShowPlanes()
{ {
Bitmap bmp = new(_pictureWidth, _pictureHeight); Bitmap bmp = new(_pictureWidth, _pictureHeight);
@ -56,6 +98,10 @@ namespace ProjStormtrooper
DrawObjects(gr); DrawObjects(gr);
return bmp; return bmp;
} }
/// <summary>
/// Метод отрисовки фона
/// </summary>
/// <param name="g"></param>
private void DrawBackground(Graphics g) private void DrawBackground(Graphics g)
{ {
@ -64,7 +110,7 @@ namespace ProjStormtrooper
{ {
for (int j = 0; j < _pictureHeight / _placeSizeHeight + for (int j = 0; j < _pictureHeight / _placeSizeHeight +
1; ++j) 1; ++j)
{ {//линия разметки места
g.DrawLine(pen, i * _placeSizeWidth, j * g.DrawLine(pen, i * _placeSizeWidth, j *
_placeSizeHeight, i * _placeSizeWidth + _placeSizeWidth / 2, j * _placeSizeHeight, i * _placeSizeWidth + _placeSizeWidth / 2, j *
_placeSizeHeight); _placeSizeHeight);
@ -73,18 +119,36 @@ namespace ProjStormtrooper
_placeSizeWidth, _pictureHeight / _placeSizeHeight * _placeSizeHeight); _placeSizeWidth, _pictureHeight / _placeSizeHeight * _placeSizeHeight);
} }
} }
/// Метод прорисовки объектов
/// </summary>
/// <param name="g"></param>
//private void DrawObjects(Graphics g)
//{
// for (int i = 0; i < _collection.Count; i++)
// {
// DrawingPlane plane = _collection.Get(i);
// if (plane != null)
// {
// int inRow = _pictureWidth / _placeSizeWidth;
// plane.SetPosition((_pictureWidth -30- (i % inRow + 1) * _placeSizeWidth), (i / inRow) * _placeSizeHeight);
// plane.DrawTransport(g);
// }
// }
//}
private void DrawObjects(Graphics g) private void DrawObjects(Graphics g)
{ {
int width = _pictureWidth / _placeSizeWidth;
int height = _pictureHeight / _placeSizeHeight;
for (int i = 0; i < _collection.Count; i++) for (int i = 0; i < _collection.Count; i++)
{ {
DrawingPlane plane = _collection.Get(i); var obj = _collection[i];
if (plane != null) obj?.SetPosition(
{ (int)((width - 1) * _placeSizeWidth - (i % width * _placeSizeWidth)),
int inRow = _pictureWidth / _placeSizeWidth; (int)((i / width) * _placeSizeHeight)
plane.SetPosition((_pictureWidth - 30 - (i % inRow + 1) * _placeSizeWidth), (i / inRow) * _placeSizeHeight); );
plane.DrawTransport(g); obj?.DrawTransport(g);
}
} }
} }
} }

View File

@ -0,0 +1,70 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjStormtrooper
{
internal class PlanesGenericStorage
{
/// <summary>
/// Словарь (хранилище)
/// </summary>
readonly Dictionary<string, PlanesGenericCollection<DrawingPlane, DrawingObjectPlane>> _planeStorages;
/// <summary>
/// Возвращение списка названий наборов
/// </summary>
public List<string> Keys => _planeStorages.Keys.ToList();
/// <summary>
/// Ширина окна отрисовки
/// </summary>
private readonly int _pictureWidth;
/// <summary>
/// Высота окна отрисовки
/// </summary>
private readonly int _pictureHeight;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="pictureWidth"></param>
/// <param name="pictureHeight"></param>
public PlanesGenericStorage(int pictureWidth, int pictureHeight)
{
_planeStorages = new Dictionary<string, PlanesGenericCollection<DrawingPlane, DrawingObjectPlane>>();
_pictureWidth = pictureWidth;
_pictureHeight = pictureHeight;
}
/// <summary>
/// Добавление набора
/// </summary>
/// <param name="name">Название набора</param>
public void AddSet(string name)
{
_planeStorages.Add(name, new PlanesGenericCollection<DrawingPlane, DrawingObjectPlane>(_pictureWidth, _pictureHeight));
}
/// <summary>
/// Удаление набора
/// </summary>
/// <param name="name">Название набора</param>
public void DelSet(string name)
{
if (_planeStorages.ContainsKey(name))
_planeStorages.Remove(name);
}
/// <summary>
/// Доступ к набору
/// </summary>
/// <param name="ind"></param>
/// <returns></returns>
public PlanesGenericCollection<DrawingPlane, DrawingObjectPlane>? this[string ind]
{
get
{
if (_planeStorages.ContainsKey(ind))
return _planeStorages[ind];
return null;
}
}
}
}

View File

@ -2,6 +2,9 @@ namespace ProjStormtrooper
{ {
internal static class Program internal static class Program
{ {
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread] [STAThread]
static void Main() static void Main()
{ {

View File

@ -6,71 +6,117 @@ using System.Threading.Tasks;
namespace ProjStormtrooper namespace ProjStormtrooper
{ {
/// <summary>
/// Параметризованный набор объектов
/// </summary>
internal class SetGeneric<T> where T : class internal class SetGeneric<T> where T : class
{ {
private readonly T?[] _places; /// <summary>
public int Count => _places.Length; /// Список объектов, которые храним
/// </summary>
private readonly List<T?> _places;
/// <summary>
/// Количество объектов в массиве
/// </summary>
public int Count => _places.Count;
/// <summary>
/// Максимальное количество объектов в списке
/// </summary>
private readonly int _maxCount;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="count"></param>
public SetGeneric(int count) public SetGeneric(int count)
{ {
_places = new T?[count]; _maxCount = count;
_places = new List<T?>(count);
} }
/// <summary>
/// Добавления объекта в набор
/// </summary>
/// <param name="plane"></param>
/// <returns></returns>
public int Insert(T plane) public int Insert(T plane)
{ {
return Insert(plane, 0); return Insert(plane, 0);
} }
/// <summary>
/// Добавление объекта в набор на конкретную позицию
/// </summary>
/// <param name="plane"></param>
/// <param name="position"></param>
/// <returns></returns>
public int Insert(T plane, int position) public int Insert(T plane, int position)
{ {
if (position < 0 || position >= Count) // Проверка позиции
if (position < 0 || position >= _maxCount)
{ {
return -1; return -1;
} }
// Вставка по позиции
if (_places[position] != null) _places.Insert(position, plane);
{
int nullIndex = -1;
for (int i = position + 1; i < Count; i++)
{
if (_places[i] == null)
{
nullIndex = i;
break;
}
}
if (nullIndex < 0)
{
return -1;
}
int j = nullIndex - 1;
while (j >= position)
{
_places[j + 1] = _places[j];
j--;
}
}
_places[position] = plane;
return position; return position;
} }
/// <summary>
/// Удаление объекта из набора с конкретной позиции
/// </summary>
/// <param name="position"></param>
/// <returns></returns>
public T? Remove(int position) public T? Remove(int position)
{ {
// Проверка позиции
if (position < 0 || position >= Count) if (position < 0 || position >= Count)
{ {
return null; return null;
} }
// Удаление объекта из массива, присвоив элементу массива значение null
T? plane = _places[position]; T? plane = _places[position];
_places[position] = null; _places[position] = null;
return plane; return plane;
} }
/// <summary>
public T? Get(int position) /// Получение объекта из набора по позиции
/// </summary>
/// <param name="position"></param>
/// <returns></returns>
public T? this[int position]
{ {
if (position < 0 || position >= Count) get
{ {
return null; // Проверка позиции
if (position < 0 || position >= Count)
{
return null;
}
return _places[position];
}
set
{
// Проверка позиции
// Проверка свободных мест в списке
if (position < 0 || position >= _maxCount || Count == _maxCount)
{
return;
}
// Вставка в список по позиции
_places.Insert(position, value);
}
}
/// <summary>
/// Проход по списку
/// </summary>
/// <returns></returns>
public IEnumerable<T?> GetPlanes(int? maxPlanes = null)
{
for (int i = 0; i < _places.Count; ++i)
{
yield return _places[i];
if (maxPlanes.HasValue && i == maxPlanes.Value)
{
yield break;
}
} }
return _places[position];
} }
} }
} }

View File

@ -6,6 +6,9 @@ using System.Threading.Tasks;
namespace ProjStormtrooper namespace ProjStormtrooper
{ {
/// <summary>
/// Статус выполнения операции перемещения
/// </summary>
public enum Status public enum Status
{ {
NotInit, NotInit,

View File

@ -6,17 +6,30 @@ namespace ProjStormtrooper
{ {
public partial class Stormtrooper : Form public partial class Stormtrooper : Form
{ {
/// <summary>
/// Ïîëå-îáúåêò äëÿ ïðîðèñîâêè îáúåêòà
/// </summary>
private DrawingPlane? _drawingPlane; private DrawingPlane? _drawingPlane;
/// <summary>
/// Ñòðàòåãèÿ ïåðåìåùåíèÿ
/// </summary>
private AbstractStrategy? _strategy; private AbstractStrategy? _strategy;
/// <summary>
/// Âûáðàííûé àâòîìîáèëü
/// </summary>
public DrawingPlane? SelectedPlane { get; private set; } public DrawingPlane? SelectedPlane { get; private set; }
/// <summary>
/// Èíèöèàëèçàöèÿ ôîðìû
/// </summary>
public Stormtrooper() public Stormtrooper()
{ {
InitializeComponent(); InitializeComponent();
_strategy = null; _strategy = null;
SelectedPlane = null; SelectedPlane = null;
} }
/// <summary>
/// Ìåòîä ïðîðèñîâêè îáúåêòà
/// </summary>
private void Draw() private void Draw()
{ {
if (_drawingPlane == null) if (_drawingPlane == null)
@ -28,7 +41,11 @@ namespace ProjStormtrooper
_drawingPlane.DrawTransport(g); _drawingPlane.DrawTransport(g);
pictureBoxStormtrooper.Image = bmp; pictureBoxStormtrooper.Image = bmp;
} }
/// <summary>
/// Îáðàáîò÷èê íàæàòèÿ êíîïêè "Ñîçäàòü øòóðìîâèê"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonCreateStormtrooper_Click(object sender, EventArgs e) private void buttonCreateStormtrooper_Click(object sender, EventArgs e)
{ {
Random random = new(); Random random = new();
@ -57,7 +74,11 @@ namespace ProjStormtrooper
_drawingPlane.SetPosition(random.Next(10, 100), random.Next(10, 100)); _drawingPlane.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw(); Draw();
} }
/// <summary>
/// Îáðàáîò÷èê íàæàòèÿ êíîïêè "Ñîçäàòü ñàìîëåò"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonCreatePlane_Click(object sender, EventArgs e) private void buttonCreatePlane_Click(object sender, EventArgs e)
{ {
Random random = new(); Random random = new();
@ -77,7 +98,11 @@ namespace ProjStormtrooper
_drawingPlane.SetPosition(random.Next(10, 100), random.Next(10, 100)); _drawingPlane.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw(); Draw();
} }
/// <summary>
/// Îáðàáîò÷èê íàæàòèÿ êíîïîê ïåðåìåùåíèÿ
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonMove_Click(object sender, EventArgs e) private void buttonMove_Click(object sender, EventArgs e)
{ {
if (_drawingPlane == null) if (_drawingPlane == null)
@ -102,7 +127,11 @@ namespace ProjStormtrooper
} }
Draw(); Draw();
} }
/// <summary>
/// Îáðàáîòêà íàæàòèÿ êíîïêè "Øàã"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonStep_Click(object sender, EventArgs e) private void buttonStep_Click(object sender, EventArgs e)
{ {
if (_drawingPlane == null) if (_drawingPlane == null)
@ -142,5 +171,12 @@ namespace ProjStormtrooper
SelectedPlane = _drawingPlane; SelectedPlane = _drawingPlane;
DialogResult = DialogResult.OK; DialogResult = DialogResult.OK;
} }
/// <summary>
/// Âûáîð ñàìîëåòà
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
} }
} }