diff --git a/ProjectBomber/ProjectBomber/DrawningBomber.cs b/ProjectBomber/ProjectBomber/DrawningBomber.cs
index 5594cbc..3cdf655 100644
--- a/ProjectBomber/ProjectBomber/DrawningBomber.cs
+++ b/ProjectBomber/ProjectBomber/DrawningBomber.cs
@@ -1,4 +1,5 @@
using ProjectBomber.Entities;
+using ProjectBomber.MovementStrategy;
using System;
using System.Collections.Generic;
using System.Drawing;
@@ -207,6 +208,11 @@ namespace ProjectBomber.DrawningObjects
break;
}
}
+ ///
+ /// Получение объекта IMoveableObject из объекта DrawningCar
+ ///
+ public IMoveableObject GetMoveableObject => new
+ DrawningObjectBomber(this);
public virtual void DrawTransport(Graphics g)
{
if (EntityBomber == null)
diff --git a/ProjectBomber/ProjectBomber/Form1.Designer.cs b/ProjectBomber/ProjectBomber/Form1.Designer.cs
index 7ac8ffd..4dcd573 100644
--- a/ProjectBomber/ProjectBomber/Form1.Designer.cs
+++ b/ProjectBomber/ProjectBomber/Form1.Designer.cs
@@ -38,6 +38,7 @@
this.comboBox1Strategy = new System.Windows.Forms.ComboBox();
this.ButtonCreatePlane = new System.Windows.Forms.Button();
this.ButtonStep = new System.Windows.Forms.Button();
+ this.ButtonSelectPlane = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxBomber)).BeginInit();
this.SuspendLayout();
//
@@ -142,10 +143,21 @@
this.ButtonStep.UseVisualStyleBackColor = true;
this.ButtonStep.Click += new System.EventHandler(this.ButtonStep_Click);
//
+ // ButtonSelectPlane
+ //
+ this.ButtonSelectPlane.Location = new System.Drawing.Point(295, 421);
+ this.ButtonSelectPlane.Name = "ButtonSelectPlane";
+ this.ButtonSelectPlane.Size = new System.Drawing.Size(101, 28);
+ this.ButtonSelectPlane.TabIndex = 11;
+ this.ButtonSelectPlane.Text = "Выбрать";
+ this.ButtonSelectPlane.UseVisualStyleBackColor = true;
+ this.ButtonSelectPlane.Click += new System.EventHandler(this.ButtonSelectPlane_Click);
+ //
// FormBomber
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
this.ClientSize = new System.Drawing.Size(884, 461);
+ this.Controls.Add(this.ButtonSelectPlane);
this.Controls.Add(this.ButtonStep);
this.Controls.Add(this.ButtonCreatePlane);
this.Controls.Add(this.comboBox1Strategy);
@@ -175,6 +187,7 @@
private System.Windows.Forms.ComboBox comboBox1Strategy;
private System.Windows.Forms.Button ButtonCreatePlane;
private System.Windows.Forms.Button ButtonStep;
+ private System.Windows.Forms.Button ButtonSelectPlane;
}
}
diff --git a/ProjectBomber/ProjectBomber/Form1.cs b/ProjectBomber/ProjectBomber/Form1.cs
index fedb957..736e6a9 100644
--- a/ProjectBomber/ProjectBomber/Form1.cs
+++ b/ProjectBomber/ProjectBomber/Form1.cs
@@ -22,9 +22,15 @@ namespace ProjectBomber
/// Стратегии перемещения
///
private AbstractStrategy _abstractStrategy;
+ ///
+ /// Выбранный автомобиль
+ ///
+ public DrawningBomber SelectedBomber { get; private set; }
public FormBomber()
{
InitializeComponent();
+ _abstractStrategy = null;
+ SelectedBomber = null;
}
private void Draw()
{
@@ -45,11 +51,22 @@ namespace ProjectBomber
private void ButtonCreateBomber_Click(object sender, EventArgs e)
{
Random random = new Random();
+ Color color = Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256));
+ Color dopColor = Color.FromArgb(random.Next(0, 256),
+ random.Next(0, 256), random.Next(0, 256));
+ //выбор основного цвета и дополнительного
+ ColorDialog colorDialog = new ColorDialog();
+ if (colorDialog.ShowDialog() == DialogResult.OK)
+ {
+ color = colorDialog.Color;
+ if (colorDialog.ShowDialog() == DialogResult.OK)
+ {
+ dopColor = colorDialog.Color;
+ }
+ }
_drawningBomber = new DrawningBomberAdvanced(random.Next(100, 300), random.Next(1000, 3000),
- Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
- Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
- Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)),
- pictureBoxBomber.Width, pictureBoxBomber.Height);
+ color, dopColor, Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)),
+ Convert.ToBoolean(random.Next(0, 2)), pictureBoxBomber.Width, pictureBoxBomber.Height);
_drawningBomber.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw();
}
@@ -61,8 +78,13 @@ namespace ProjectBomber
private void ButtonCreatePlane_Click(object sender, EventArgs e)
{
Random random = new Random();
- _drawningBomber = new DrawningBomber(random.Next(100, 300), random.Next(1000, 3000), Color.FromArgb(random.Next(0, 256), random.Next(0, 256),
- random.Next(0, 256)), pictureBoxBomber.Width, pictureBoxBomber.Height);
+ Color color = Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256));
+ ColorDialog colorDialog = new ColorDialog();
+ if (colorDialog.ShowDialog() == DialogResult.OK)
+ {
+ color = colorDialog.Color;
+ }
+ _drawningBomber = new DrawningBomber(random.Next(100, 300), random.Next(1000, 3000), color, pictureBoxBomber.Width, pictureBoxBomber.Height);
_drawningBomber.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw();
}
@@ -132,5 +154,15 @@ namespace ProjectBomber
_abstractStrategy = null;
}
}
+ ///
+ /// Выбор самолета
+ ///
+ ///
+ ///
+ private void ButtonSelectPlane_Click(object sender, EventArgs e)
+ {
+ SelectedBomber = _drawningBomber;
+ DialogResult = DialogResult.OK;
+ }
}
}
\ No newline at end of file
diff --git a/ProjectBomber/ProjectBomber/FormPlaneCollection.Designer.cs b/ProjectBomber/ProjectBomber/FormPlaneCollection.Designer.cs
new file mode 100644
index 0000000..35c32ef
--- /dev/null
+++ b/ProjectBomber/ProjectBomber/FormPlaneCollection.Designer.cs
@@ -0,0 +1,124 @@
+namespace ProjectBomber
+{
+ partial class FormPlaneCollection
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.ButtonRefreshCollection = new System.Windows.Forms.Button();
+ this.ButtonRemovePlane = new System.Windows.Forms.Button();
+ this.maskedTextBoxNumber = new System.Windows.Forms.TextBox();
+ this.ButtonAddPlane = new System.Windows.Forms.Button();
+ this.pictureBoxCollection = new System.Windows.Forms.PictureBox();
+ this.groupBox1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCollection)).BeginInit();
+ this.SuspendLayout();
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.ButtonRefreshCollection);
+ this.groupBox1.Controls.Add(this.ButtonRemovePlane);
+ this.groupBox1.Controls.Add(this.maskedTextBoxNumber);
+ this.groupBox1.Controls.Add(this.ButtonAddPlane);
+ this.groupBox1.Location = new System.Drawing.Point(586, 2);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(216, 453);
+ this.groupBox1.TabIndex = 0;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Инструменты";
+ //
+ // ButtonRefreshCollection
+ //
+ this.ButtonRefreshCollection.Location = new System.Drawing.Point(17, 237);
+ this.ButtonRefreshCollection.Name = "ButtonRefreshCollection";
+ this.ButtonRefreshCollection.Size = new System.Drawing.Size(178, 41);
+ this.ButtonRefreshCollection.TabIndex = 3;
+ this.ButtonRefreshCollection.Text = "Обновить коллекцию";
+ this.ButtonRefreshCollection.UseVisualStyleBackColor = true;
+ this.ButtonRefreshCollection.Click += new System.EventHandler(this.ButtonRefreshCollection_Click);
+ //
+ // ButtonRemovePlane
+ //
+ this.ButtonRemovePlane.Location = new System.Drawing.Point(17, 136);
+ this.ButtonRemovePlane.Name = "ButtonRemovePlane";
+ this.ButtonRemovePlane.Size = new System.Drawing.Size(179, 41);
+ this.ButtonRemovePlane.TabIndex = 2;
+ this.ButtonRemovePlane.Text = "Удалить автомобиль";
+ this.ButtonRemovePlane.UseVisualStyleBackColor = true;
+ this.ButtonRemovePlane.Click += new System.EventHandler(this.ButtonRemovePlane_Click);
+ //
+ // maskedTextBoxNumber
+ //
+ this.maskedTextBoxNumber.Location = new System.Drawing.Point(17, 99);
+ this.maskedTextBoxNumber.Name = "maskedTextBoxNumber";
+ this.maskedTextBoxNumber.Size = new System.Drawing.Size(180, 20);
+ this.maskedTextBoxNumber.TabIndex = 1;
+ //
+ // ButtonAddPlane
+ //
+ this.ButtonAddPlane.Location = new System.Drawing.Point(17, 36);
+ this.ButtonAddPlane.Name = "ButtonAddPlane";
+ this.ButtonAddPlane.Size = new System.Drawing.Size(185, 40);
+ this.ButtonAddPlane.TabIndex = 0;
+ this.ButtonAddPlane.Text = "Добавить самолет";
+ this.ButtonAddPlane.UseVisualStyleBackColor = true;
+ this.ButtonAddPlane.Click += new System.EventHandler(this.ButtonAddPlane_Click);
+ //
+ // pictureBoxCollection
+ //
+ this.pictureBoxCollection.Location = new System.Drawing.Point(-2, 2);
+ this.pictureBoxCollection.Name = "pictureBoxCollection";
+ this.pictureBoxCollection.Size = new System.Drawing.Size(600, 452);
+ this.pictureBoxCollection.TabIndex = 1;
+ this.pictureBoxCollection.TabStop = false;
+ //
+ // FormPlaneCollection
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(800, 450);
+ this.Controls.Add(this.pictureBoxCollection);
+ this.Controls.Add(this.groupBox1);
+ this.Name = "FormPlaneCollection";
+ this.Text = "Набор самолетов";
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCollection)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.Button ButtonRefreshCollection;
+ private System.Windows.Forms.Button ButtonRemovePlane;
+ private System.Windows.Forms.TextBox maskedTextBoxNumber;
+ private System.Windows.Forms.Button ButtonAddPlane;
+ private System.Windows.Forms.PictureBox pictureBoxCollection;
+ }
+}
\ No newline at end of file
diff --git a/ProjectBomber/ProjectBomber/FormPlaneCollection.cs b/ProjectBomber/ProjectBomber/FormPlaneCollection.cs
new file mode 100644
index 0000000..f10fafc
--- /dev/null
+++ b/ProjectBomber/ProjectBomber/FormPlaneCollection.cs
@@ -0,0 +1,89 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using ProjectBomber.MovementStrategy;
+using ProjectBomber.Generics;
+using ProjectBomber.DrawningObjects;
+
+namespace ProjectBomber
+{
+ ///
+ /// Форма для работы с набором объектов класса DrawningCar
+ ///
+ public partial class FormPlaneCollection : Form
+ {
+ ///
+ /// Набор объектов
+ ///
+ private readonly PlanesGenericCollection _planes;
+ ///
+ /// Конструктор
+ ///
+ public FormPlaneCollection()
+ {
+ InitializeComponent();
+ _planes = new PlanesGenericCollection(pictureBoxCollection.Width, pictureBoxCollection.Height);
+ }
+ ///
+ /// Добавление объекта в набор
+ ///
+ ///
+ ///
+ private void ButtonAddPlane_Click(object sender, EventArgs e)
+ {
+ FormBomber form = new FormBomber();
+ if (form.ShowDialog() == DialogResult.OK)
+ {
+ if (_planes + form.SelectedBomber != 1)
+ {
+ MessageBox.Show("Объект добавлен");
+ pictureBoxCollection.Image = _planes.ShowPlanes();
+ }
+ else
+ {
+ MessageBox.Show("Не удалось добавить объект");
+ }
+ }
+ }
+ ///
+ /// Удаление объекта из набора
+ ///
+ ///
+ ///
+ private void ButtonRemovePlane_Click(object sender, EventArgs e)
+ {
+ if (MessageBox.Show("Удалить объект?", "Удаление",
+ MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
+ {
+ return;
+ }
+ int pos = Convert.ToInt32(maskedTextBoxNumber.Text);
+ if (_planes - pos != null)
+ {
+ MessageBox.Show("Объект удален");
+ pictureBoxCollection.Image = _planes.ShowPlanes();
+ }
+ else
+ {
+ MessageBox.Show("Не удалось удалить объект");
+ }
+ }
+ ///
+ /// Обновление рисунка по набору
+ ///
+ ///
+ ///
+ private void ButtonRefreshCollection_Click(object sender, EventArgs e)
+ {
+ pictureBoxCollection.Image = _planes.ShowPlanes();
+ }
+ }
+}
diff --git a/ProjectBomber/ProjectBomber/FormPlaneCollection.resx b/ProjectBomber/ProjectBomber/FormPlaneCollection.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/ProjectBomber/ProjectBomber/FormPlaneCollection.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/ProjectBomber/ProjectBomber/PlanesGenericCollection.cs b/ProjectBomber/ProjectBomber/PlanesGenericCollection.cs
new file mode 100644
index 0000000..a86241d
--- /dev/null
+++ b/ProjectBomber/ProjectBomber/PlanesGenericCollection.cs
@@ -0,0 +1,156 @@
+using ProjectBomber.MovementStrategy;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using ProjectBomber.DrawningObjects;
+
+namespace ProjectBomber.Generics
+{
+ ///
+ /// Параметризованный класс для набора объектов DrawningBomber
+ ///
+ ///
+ ///
+ internal class PlanesGenericCollection
+ where T : DrawningBomber
+ where U : IMoveableObject
+ {
+ ///
+ /// Ширина окна прорисовки
+ ///
+ private readonly int _pictureWidth;
+ ///
+ /// Высота окна прорисовки
+ ///
+ private readonly int _pictureHeight;
+ ///
+ /// Размер занимаемого объектом места (ширина)
+ ///
+ private readonly int _placeSizeWidth = 200;
+ ///
+ /// Размер занимаемого объектом места (высота)
+ ///
+ private readonly int _placeSizeHeight = 90;
+ ///
+ /// Набор объектов
+ ///
+ private readonly SetGeneric _collection;
+ ///
+ /// Конструктор
+ ///
+ ///
+ ///
+ public PlanesGenericCollection(int picWidth, int picHeight)
+ {
+ int width = picWidth / _placeSizeWidth;
+ int height = picHeight / _placeSizeHeight;
+ _pictureWidth = picWidth;
+ _pictureHeight = picHeight;
+ _collection = new SetGeneric(width * height);
+ }
+ ///
+ /// Перегрузка оператора сложения
+ ///
+ ///
+ ///
+ ///
+ public static int? operator +(PlanesGenericCollection collect, T
+ obj)
+ {
+ if (obj == null)
+ {
+ return -1;
+ }
+ return collect?._collection.Insert(obj);
+ }
+ ///
+ /// Перегрузка оператора вычитания
+ ///
+ ///
+ ///
+ ///
+ public static bool operator -(PlanesGenericCollection collect, int
+ pos)
+ {
+ T obj = collect._collection.Get(pos);
+ if (obj == null)
+ {
+ return false;
+ }
+ return collect._collection.Remove(pos);
+ }
+ ///
+ /// Получение объекта IMoveableObject
+ ///
+ ///
+ ///
+ public U GetU(int pos)
+ {
+ return (U)_collection.Get(pos)?.GetMoveableObject;
+ }
+ ///
+ /// Вывод всего набора объектов
+ ///
+ ///
+ public Bitmap ShowPlanes()
+ {
+ Bitmap bmp = new Bitmap(_pictureWidth, _pictureHeight);
+ Graphics gr = Graphics.FromImage(bmp);
+ DrawBackground(gr);
+ DrawObjects(gr);
+ return bmp;
+ }
+ ///
+ /// Метод отрисовки фона
+ ///
+ ///
+ private void DrawBackground(Graphics g)
+ {
+ Pen pen = new Pen(Color.Black, 3);
+ int numColumns = _pictureWidth / _placeSizeWidth;
+ int numRows = _pictureHeight / _placeSizeHeight;
+
+ for (int i = 0; i <= numColumns; i++)
+ {
+ for (int j = 0; j <= numRows; ++j)
+ {
+ // Линии разметки места
+ int x = i * _placeSizeWidth;
+ int y = j * _placeSizeHeight;
+ g.DrawLine(pen, x, y, x + _placeSizeWidth / 2, y);
+ }
+
+ g.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, numRows * _placeSizeHeight);
+ }
+ }
+
+ ///
+ /// Метод прорисовки объектов
+ ///
+ ///
+ private void DrawObjects(Graphics g)
+ {
+ int numColumns = _pictureWidth / _placeSizeWidth;
+ int numRows = _pictureHeight / _placeSizeHeight;
+
+ for (int i = 0; i < _collection.Count; i++)
+ {
+ DrawningBomber plane = _collection.Get(i);
+ if (plane != null)
+ {
+ // Вычисляем позицию объекта
+ int row = i / numColumns; // Номер строки
+ int column = numColumns - 1 - (i % numColumns); // Номер столбца, инвертируем для движения справа налево
+ int x = column * _placeSizeWidth;
+ int y = row * _placeSizeHeight;
+
+ plane.SetPosition(x, y);
+ plane.DrawTransport(g);
+ }
+ }
+ }
+ }
+}
diff --git a/ProjectBomber/ProjectBomber/Program.cs b/ProjectBomber/ProjectBomber/Program.cs
index 53184ea..3093df6 100644
--- a/ProjectBomber/ProjectBomber/Program.cs
+++ b/ProjectBomber/ProjectBomber/Program.cs
@@ -16,7 +16,7 @@ namespace ProjectBomber
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new FormBomber());
+ Application.Run(new FormPlaneCollection());
}
}
}
diff --git a/ProjectBomber/ProjectBomber/ProjectBomber.csproj b/ProjectBomber/ProjectBomber/ProjectBomber.csproj
index 16b6ff0..12e44ab 100644
--- a/ProjectBomber/ProjectBomber/ProjectBomber.csproj
+++ b/ProjectBomber/ProjectBomber/ProjectBomber.csproj
@@ -12,6 +12,21 @@
512
true
true
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 1.0.0.%2a
+ false
+ false
+ true
AnyCPU
@@ -59,16 +74,27 @@
Form1.cs
+
+ Form
+
+
+ FormPlaneCollection.cs
+
+
+
Form1.cs
+
+ FormPlaneCollection.cs
+
ResXFileCodeGenerator
Resources.Designer.cs
@@ -91,5 +117,17 @@
+
+
+ False
+ Microsoft .NET Framework 4.7.2 %28x86 и x64%29
+ true
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
\ No newline at end of file
diff --git a/ProjectBomber/ProjectBomber/SetGeneric.cs b/ProjectBomber/ProjectBomber/SetGeneric.cs
new file mode 100644
index 0000000..dd37436
--- /dev/null
+++ b/ProjectBomber/ProjectBomber/SetGeneric.cs
@@ -0,0 +1,123 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ProjectBomber.Generics
+{
+ ///
+ /// Параметризованный набор объектов
+ ///
+ ///
+ internal class SetGeneric
+ where T : class
+ {
+ ///
+ /// Массив объектов, которые храним
+ ///
+ private readonly T[] _places;
+ ///
+ /// Количество объектов в массиве
+ ///
+ public int Count => _places.Length;
+ ///
+ /// Конструктор
+ ///
+ ///
+ public SetGeneric(int count)
+ {
+ _places = new T[count];
+ }
+ ///
+ /// Добавление объекта в набор
+ ///
+ /// Добавляемый самолет
+ ///
+ public int Insert(T plane)
+ {
+ int index = -1;
+ for (int i = 0; i < _places.Length; i++)
+ {
+ if (_places[i] == null)
+ {
+ index = i; break;
+ }
+ }
+ if (index < 0)
+ {
+ return -1;
+ }
+ for (int i = index; i > 0; i--)
+ {
+ _places[i] = _places[i - 1];
+ }
+ _places[0] = plane;
+ return 0;
+ }
+ ///
+ /// Добавление объекта в набор на конкретную позицию
+ ///
+ /// Добавляемый автомобиль
+ /// Позиция
+ ///
+ public int Insert(T plane, int position)
+ {
+ ///Проверка позиции
+ if (position < 0 || position >= _places.Length)
+ return -1;
+ /// Проверка, что элемент массива по этой позиции пустой, если нет, то проверка,
+ /// что после вставляемого элемента в массиве есть пустой элемент
+ if (_places[position] != null)
+ {
+ /// Проверка, что после вставляемого элемента в массиве есть пустой элемент
+ int firstEmptyPosition = -1;
+ for (int i = position + 1; i < _places.Length; i++)
+ {
+ if (_places[i] == null)
+ {
+ firstEmptyPosition = i;
+ break;
+ }
+ }
+ /// Нет пустой позиции после вставляемой
+ if (firstEmptyPosition == -1)
+ return -1;
+ /// Сдвиг всех объектов, находящихся справа от позиции, до первого пустого элемента
+ for (int i = firstEmptyPosition; i > position; i--)
+ {
+ _places[i] = _places[i - 1];
+ }
+ }
+ /// Вставка по позиции
+ _places[position] = plane;
+ return 0;
+ }
+ ///
+ /// Удаление объекта из набора с конкретной позиции
+ ///
+ ///
+ ///
+ public bool Remove(int position)
+ {
+ /// Проверка позиции
+ if (position < 0 || position >= _places.Length)
+ return false;
+ /// Удаление объекта из массива, присвоив элементу массива значение null
+ _places[position] = null;
+ return true;
+ }
+ ///
+ /// Получение объекта из набора по позиции
+ ///
+ ///
+ ///
+ public T Get(int position)
+ {
+ // Проверка позиции
+ if (position < 0 || position >= _places.Length)
+ return null;
+ return _places[position];
+ }
+ }
+}