WIP: PIbd-23.RazinA.A.Fourthlab #4

Closed
Sasylika4598 wants to merge 1 commits from Fourthlab into Thirdlab
19 changed files with 735 additions and 106 deletions
Showing only changes of commit 0e2ce08130 - Show all commits

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -6,18 +6,46 @@ using System.Threading.Tasks;
namespace ProjStormtrooper
{
/// <summary>
/// Параметры-координаты объекта
/// </summary>
public class ObjectParameters
{
private readonly int _x;
private readonly int _y;
private readonly int _width;
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;

View File

@ -29,44 +29,106 @@
private void InitializeComponent()
{
groupBoxTools = new GroupBox();
groupBoxStorages = new GroupBox();
buttonRemoveStorage = new Button();
buttonAddStorage = new Button();
textBoxStorageName = new TextBox();
listBoxStorages = new ListBox();
maskedTextBoxNumber = new MaskedTextBox();
buttonRefreshCollection = new Button();
buttonRemovePlane = new Button();
buttonAddPlane = new Button();
pictureBoxCollection = new PictureBox();
groupBoxTools.SuspendLayout();
groupBoxStorages.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBoxCollection).BeginInit();
SuspendLayout();
//
// groupBoxTools
//
groupBoxTools.Controls.Add(groupBoxStorages);
groupBoxTools.Controls.Add(maskedTextBoxNumber);
groupBoxTools.Controls.Add(buttonRefreshCollection);
groupBoxTools.Controls.Add(buttonRemovePlane);
groupBoxTools.Controls.Add(buttonAddPlane);
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.Size = new Size(230, 538);
groupBoxTools.Padding = new Padding(3, 2, 3, 2);
groupBoxTools.Size = new Size(201, 404);
groupBoxTools.TabIndex = 0;
groupBoxTools.TabStop = false;
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.Location = new Point(6, 87);
maskedTextBoxNumber.Location = new Point(5, 318);
maskedTextBoxNumber.Margin = new Padding(3, 2, 3, 2);
maskedTextBoxNumber.Mask = "00";
maskedTextBoxNumber.Name = "maskedTextBoxNumber";
maskedTextBoxNumber.Size = new Size(218, 27);
maskedTextBoxNumber.Size = new Size(191, 23);
maskedTextBoxNumber.TabIndex = 4;
maskedTextBoxNumber.TextAlign = HorizontalAlignment.Center;
maskedTextBoxNumber.ValidatingType = typeof(int);
//
// 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.Size = new Size(218, 29);
buttonRefreshCollection.Size = new Size(191, 22);
buttonRefreshCollection.TabIndex = 3;
buttonRefreshCollection.Text = "Обновить коллекцию";
buttonRefreshCollection.UseVisualStyleBackColor = true;
@ -74,9 +136,10 @@
//
// 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.Size = new Size(218, 29);
buttonRemovePlane.Size = new Size(191, 22);
buttonRemovePlane.TabIndex = 2;
buttonRemovePlane.Text = "Удалить самолет";
buttonRemovePlane.UseVisualStyleBackColor = true;
@ -84,9 +147,10 @@
//
// 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.Size = new Size(218, 29);
buttonAddPlane.Size = new Size(191, 22);
buttonAddPlane.TabIndex = 0;
buttonAddPlane.Text = "Добавить самолет";
buttonAddPlane.UseVisualStyleBackColor = true;
@ -96,22 +160,26 @@
//
pictureBoxCollection.Dock = DockStyle.Fill;
pictureBoxCollection.Location = new Point(0, 0);
pictureBoxCollection.Margin = new Padding(3, 2, 3, 2);
pictureBoxCollection.Name = "pictureBoxCollection";
pictureBoxCollection.Size = new Size(787, 538);
pictureBoxCollection.Size = new Size(689, 404);
pictureBoxCollection.TabIndex = 1;
pictureBoxCollection.TabStop = false;
//
// FormPlaneCollection
// PlaneCollection
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1017, 538);
ClientSize = new Size(890, 404);
Controls.Add(pictureBoxCollection);
Controls.Add(groupBoxTools);
Name = "FormPlaneCollection";
Margin = new Padding(3, 2, 3, 2);
Name = "PlaneCollection";
Text = "Набор самолетов";
groupBoxTools.ResumeLayout(false);
groupBoxTools.PerformLayout();
groupBoxStorages.ResumeLayout(false);
groupBoxStorages.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureBoxCollection).EndInit();
ResumeLayout(false);
}
@ -124,5 +192,10 @@
private Button buttonAddPlane;
private MaskedTextBox maskedTextBoxNumber;
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
{
/// <summary>
/// Форма для работы с набором объектов класса DrawningPlane
/// </summary>
public partial class PlaneCollection : Form
{
private readonly PlanesGenericCollection<DrawingPlane, DrawingObjectPlane> _planes;
/// <summary>
/// Набор объектов
/// </summary>
private readonly PlanesGenericStorage _storage;
/// <summary>
/// Конструктор
/// </summary>
public PlaneCollection()
{
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)
{
if (listBoxStorages.SelectedIndex == -1)
{
return;
}
var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty];
if (obj == null)
{
return;
}
Stormtrooper form = new();
if (form.ShowDialog() == DialogResult.OK)
{
if (_planes + form.SelectedPlane > -1)
if (obj + form.SelectedPlane > -1)
{
MessageBox.Show("Объект добавлен");
pictureBoxCollection.Image = _planes.ShowPlanes();
pictureBoxCollection.Image = obj.ShowPlanes();
}
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)
{
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)
{
return;
}
int pos = Convert.ToInt32(maskedTextBoxNumber.Text);
if (_planes - pos != null)
if (obj - pos != null)
{
MessageBox.Show("Объект удален");
pictureBoxCollection.Image = _planes.ShowPlanes();
pictureBoxCollection.Image = obj.ShowPlanes();
}
else
{
MessageBox.Show("Не удалось удалить объект");
}
}
/// <summary>
/// Обновление рисунка по набору
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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="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="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">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>

View File

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

View File

@ -6,71 +6,117 @@ using System.Threading.Tasks;
namespace ProjStormtrooper
{
/// <summary>
/// Параметризованный набор объектов
/// </summary>
internal class SetGeneric<T> where T : class
{
private readonly T?[] _places;
public int Count => _places.Length;
/// <summary>
/// Список объектов, которые храним
/// </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)
{
_places = new T?[count];
_maxCount = count;
_places = new List<T?>(count);
}
/// <summary>
/// Добавления объекта в набор
/// </summary>
/// <param name="plane"></param>
/// <returns></returns>
public int Insert(T plane)
{
return Insert(plane, 0);
}
/// <summary>
/// Добавление объекта в набор на конкретную позицию
/// </summary>
/// <param name="plane"></param>
/// <param name="position"></param>
/// <returns></returns>
public int Insert(T plane, int position)
{
if (position < 0 || position >= Count)
// Проверка позиции
if (position < 0 || position >= _maxCount)
{
return -1;
}
if (_places[position] != null)
{
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;
// Вставка по позиции
_places.Insert(position, plane);
return position;
}
/// <summary>
/// Удаление объекта из набора с конкретной позиции
/// </summary>
/// <param name="position"></param>
/// <returns></returns>
public T? Remove(int position)
{
// Проверка позиции
if (position < 0 || position >= Count)
{
return null;
}
// Удаление объекта из массива, присвоив элементу массива значение null
T? plane = _places[position];
_places[position] = null;
return plane;
}
public T? Get(int position)
/// <summary>
/// Получение объекта из набора по позиции
/// </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
{
/// <summary>
/// Статус выполнения операции перемещения
/// </summary>
public enum Status
{
NotInit,

View File

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