diff --git a/ElectricLocomotive/ElectricLocomotive/DrawningElectricLocomotive.cs b/ElectricLocomotive/ElectricLocomotive/DrawingElectricLocomotive.cs similarity index 100% rename from ElectricLocomotive/ElectricLocomotive/DrawningElectricLocomotive.cs rename to ElectricLocomotive/ElectricLocomotive/DrawingElectricLocomotive.cs diff --git a/ElectricLocomotive/ElectricLocomotive/DrawningLocomotive.cs b/ElectricLocomotive/ElectricLocomotive/DrawingLocomotive.cs similarity index 96% rename from ElectricLocomotive/ElectricLocomotive/DrawningLocomotive.cs rename to ElectricLocomotive/ElectricLocomotive/DrawingLocomotive.cs index 49bcf18..cb7949e 100644 --- a/ElectricLocomotive/ElectricLocomotive/DrawningLocomotive.cs +++ b/ElectricLocomotive/ElectricLocomotive/DrawingLocomotive.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using ElectricLocomotive; using ProjectElectricLocomotive.Entities; +using ProjectElectricLocomotive.MovementStrategy; using ProjectElectricLocomotive.Properties; using static System.Windows.Forms.VisualStyles.VisualStyleElement; @@ -180,5 +181,10 @@ namespace ProjectElectricLocomotive.DrawingObjects Direction.Down => _startPosY + EntityLocomotive.Step < _pictureHeight, }; } + /// + /// Получение объекта IMoveableObject из объекта DrawningCar + /// + public IMoveableObject GetMoveableObject => new + DrawingObjectLocomotive(this); } } diff --git a/ElectricLocomotive/ElectricLocomotive/DrawningObjectLocomotive.cs b/ElectricLocomotive/ElectricLocomotive/DrawingObjectLocomotive.cs similarity index 100% rename from ElectricLocomotive/ElectricLocomotive/DrawningObjectLocomotive.cs rename to ElectricLocomotive/ElectricLocomotive/DrawingObjectLocomotive.cs diff --git a/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.Designer.cs b/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.Designer.cs index a828c5b..a44ff89 100644 --- a/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.Designer.cs +++ b/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.Designer.cs @@ -2,7 +2,7 @@ namespace ElectricLocomotive { - partial class ElectricLocomotive + partial class FormElectricLocomotive { /// /// Required designer variable. @@ -39,6 +39,7 @@ namespace ElectricLocomotive comboBoxStrategy = new ComboBox(); buttonCreateLocomotive = new Button(); buttonStep = new Button(); + button1 = new Button(); ((System.ComponentModel.ISupportInitialize)pictureBoxElectricLocomotive).BeginInit(); SuspendLayout(); // @@ -157,13 +158,24 @@ namespace ElectricLocomotive buttonStep.TabIndex = 8; buttonStep.Text = "Шаг"; buttonStep.UseVisualStyleBackColor = true; - buttonStep.Click += buttonStep_Click; + buttonStep.Click += buttonStrategyStep_Click; // - // ElectricLocomotive + // button1 + // + button1.Location = new Point(256, 365); + button1.Name = "button1"; + button1.Size = new Size(206, 64); + button1.TabIndex = 9; + button1.Text = "Выбрать локомотив"; + button1.UseVisualStyleBackColor = true; + button1.Click += ButtonSelectLocomotive_Click; + // + // FormElectricLocomotive // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(847, 441); + Controls.Add(button1); Controls.Add(buttonStep); Controls.Add(buttonCreateLocomotive); Controls.Add(comboBoxStrategy); @@ -174,9 +186,10 @@ namespace ElectricLocomotive Controls.Add(buttonCreateElectricLocomotive); Controls.Add(pictureBoxElectricLocomotive); Margin = new Padding(2); - Name = "ElectricLocomotive"; + Name = "FormElectricLocomotive"; StartPosition = FormStartPosition.CenterScreen; Text = "ElectricLocomotive"; + Load += ElectricLocomotive_Load; ((System.ComponentModel.ISupportInitialize)pictureBoxElectricLocomotive).EndInit(); ResumeLayout(false); PerformLayout(); @@ -193,5 +206,6 @@ namespace ElectricLocomotive private ComboBox comboBoxStrategy; private Button buttonCreateLocomotive; private Button buttonStep; + private Button button1; } } \ No newline at end of file diff --git a/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.cs b/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.cs index a7d53ce..c869db9 100644 --- a/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.cs +++ b/ElectricLocomotive/ElectricLocomotive/FormElectricLocomotive.cs @@ -1,24 +1,22 @@ - -using ProjectElectricLocomotive; using ProjectElectricLocomotive.DrawingObjects; using ProjectElectricLocomotive.MovementStrategy; +using ProjectElectricLocomotive; using System; namespace ElectricLocomotive { - public partial class ElectricLocomotive : Form + public partial class FormElectricLocomotive : Form { - private DrawingLocomotive? _drawningLocomotive; - private AbstractStrategy? _abstractStrategy; - - public ElectricLocomotive() + public DrawingLocomotive? SelectedLocomotive { get; private set; } + public FormElectricLocomotive() { InitializeComponent(); + _abstractStrategy = null; + SelectedLocomotive = null; } - private void Draw() { if (_drawningLocomotive == null) @@ -30,29 +28,44 @@ namespace ElectricLocomotive _drawningLocomotive.DrawTransport(gr); pictureBoxElectricLocomotive.Image = bmp; } - private void buttonCreateElectricLocomotive_Click(object sender, EventArgs e) { Random random = new Random(); - _drawningLocomotive = new DrawingElectricLocomotive(random.Next(100, 300), random.Next(1000, 3000), - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), - Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + Color 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; + } + Color dopColor = Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)); + if (colorDialog.ShowDialog() == DialogResult.OK) + { + dopColor = colorDialog.Color; + } + _drawningLocomotive = new DrawingElectricLocomotive(random.Next(100, 300), random.Next(1000, 3000), color, dopColor, Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)), pictureBoxElectricLocomotive.Width, pictureBoxElectricLocomotive.Height); _drawningLocomotive.SetPosition(random.Next(10, 100), random.Next(10, 100)); Draw(); } - private void buttonCreateLocomotive_Click(object sender, EventArgs e) { - Random rnd = new Random(); - _drawningLocomotive = new DrawingLocomotive(rnd.Next(100, 300), rnd.Next(1000, 3000), - Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)), - pictureBoxElectricLocomotive.Width, pictureBoxElectricLocomotive.Height); - _drawningLocomotive.SetPosition(rnd.Next(10, 100), rnd.Next(10, 100)); + Random random = new(); + Color color = Color.FromArgb(random.Next(0, 256), + random.Next(0, 256), random.Next(0, 256)); + ColorDialog dialog = new(); + if (dialog.ShowDialog() == DialogResult.OK) + { + color = dialog.Color; + } + _drawningLocomotive = new DrawingLocomotive(random.Next(100, 300), + random.Next(1000, 3000), color, + pictureBoxElectricLocomotive.Width, pictureBoxElectricLocomotive.Height); + _drawningLocomotive.SetPosition(random.Next(10, 100), random.Next(10, + 100)); Draw(); - } + } private void buttonMove_Click(object sender, EventArgs e) { if (_drawningLocomotive == null) @@ -77,8 +90,7 @@ namespace ElectricLocomotive } Draw(); } - - private void buttonStep_Click(object sender, EventArgs e) + private void buttonStrategyStep_Click(object sender, EventArgs e) { if (_drawningLocomotive == null) { @@ -96,9 +108,7 @@ namespace ElectricLocomotive { return; } - _abstractStrategy.SetData(new - DrawingObjectLocomotive(_drawningLocomotive), pictureBoxElectricLocomotive.Width, - pictureBoxElectricLocomotive.Height); + _abstractStrategy.SetData(new DrawingObjectLocomotive(_drawningLocomotive), pictureBoxElectricLocomotive.Width, pictureBoxElectricLocomotive.Height); comboBoxStrategy.Enabled = false; } if (_abstractStrategy == null) @@ -113,15 +123,22 @@ namespace ElectricLocomotive _abstractStrategy = null; } } - private void comboBoxStrategy_SelectedIndexChanged(object sender, EventArgs e) { } - private void pictureBoxElectricLocomotive_Click(object sender, EventArgs e) { } + private void ElectricLocomotive_Load(object sender, EventArgs e) + { + + } + private void ButtonSelectLocomotive_Click(object sender, EventArgs e) + { + SelectedLocomotive = _drawningLocomotive; + DialogResult = DialogResult.OK; + } } } \ No newline at end of file diff --git a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.Designer.cs b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.Designer.cs new file mode 100644 index 0000000..e829010 --- /dev/null +++ b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.Designer.cs @@ -0,0 +1,140 @@ +namespace ProjectElectricLocomotive +{ + partial class FormLocomotiveCollection + { + /// + /// 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() + { + panelLocomotiveCollection = new Panel(); + maskedTextBoxNumber = new MaskedTextBox(); + ButtonRefreshCollection = new Button(); + ButtonRemoveLocomotive = new Button(); + ButtonAddLocomotive = new Button(); + pictureBoxCollection = new PictureBox(); + LabelOnPanel = new Label(); + panelLocomotiveCollection.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)pictureBoxCollection).BeginInit(); + SuspendLayout(); + // + // panelLocomotiveCollection + // + panelLocomotiveCollection.AccessibleDescription = ""; + panelLocomotiveCollection.AccessibleName = ""; + panelLocomotiveCollection.Controls.Add(LabelOnPanel); + panelLocomotiveCollection.Controls.Add(maskedTextBoxNumber); + panelLocomotiveCollection.Controls.Add(ButtonRefreshCollection); + panelLocomotiveCollection.Controls.Add(ButtonRemoveLocomotive); + panelLocomotiveCollection.Controls.Add(ButtonAddLocomotive); + panelLocomotiveCollection.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point); + panelLocomotiveCollection.Location = new Point(594, 2); + panelLocomotiveCollection.Name = "panelLocomotiveCollection"; + panelLocomotiveCollection.Size = new Size(208, 448); + panelLocomotiveCollection.TabIndex = 0; + panelLocomotiveCollection.Tag = "Инструменты"; + panelLocomotiveCollection.Paint += panelLocomotiveCollection_Paint; + // + // maskedTextBoxNumber + // + maskedTextBoxNumber.Location = new Point(40, 74); + maskedTextBoxNumber.Name = "maskedTextBoxNumber"; + maskedTextBoxNumber.Size = new Size(123, 23); + maskedTextBoxNumber.TabIndex = 3; + // + // ButtonRefreshCollection + // + ButtonRefreshCollection.Location = new Point(3, 194); + ButtonRefreshCollection.Name = "ButtonRefreshCollection"; + ButtonRefreshCollection.Size = new Size(194, 43); + ButtonRefreshCollection.TabIndex = 2; + ButtonRefreshCollection.Text = " Обновить коллекцию"; + ButtonRefreshCollection.UseVisualStyleBackColor = true; + ButtonRefreshCollection.Click += ButtonRefreshCollection_Click; + // + // ButtonRemoveLocomotive + // + ButtonRemoveLocomotive.Location = new Point(3, 138); + ButtonRemoveLocomotive.Name = "ButtonRemoveLocomotive"; + ButtonRemoveLocomotive.Size = new Size(194, 39); + ButtonRemoveLocomotive.TabIndex = 1; + ButtonRemoveLocomotive.Text = "Удалить локомотив"; + ButtonRemoveLocomotive.UseVisualStyleBackColor = true; + ButtonRemoveLocomotive.Click += ButtonRemoveLocomotive_Click; + // + // ButtonAddLocomotive + // + ButtonAddLocomotive.Location = new Point(3, 15); + ButtonAddLocomotive.Name = "ButtonAddLocomotive"; + ButtonAddLocomotive.Size = new Size(194, 39); + ButtonAddLocomotive.TabIndex = 0; + ButtonAddLocomotive.Text = "Добавить локомотив"; + ButtonAddLocomotive.UseVisualStyleBackColor = true; + ButtonAddLocomotive.Click += ButtonAddLocomotive_Click; + // + // pictureBoxCollection + // + pictureBoxCollection.Location = new Point(2, 2); + pictureBoxCollection.Name = "pictureBoxCollection"; + pictureBoxCollection.Size = new Size(589, 448); + pictureBoxCollection.TabIndex = 1; + pictureBoxCollection.TabStop = false; + // + // LabelOnPanel + // + LabelOnPanel.AutoSize = true; + LabelOnPanel.Location = new Point(3, -3); + LabelOnPanel.Name = "LabelOnPanel"; + LabelOnPanel.Size = new Size(83, 15); + LabelOnPanel.TabIndex = 4; + LabelOnPanel.Text = "Инструменты"; + LabelOnPanel.Click += LabelOnPanel_Click; + // + // FormLocomotiveCollection + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(pictureBoxCollection); + Controls.Add(panelLocomotiveCollection); + Name = "FormLocomotiveCollection"; + Text = "Набор локомотивов"; + Load += FormLocomotiveCollection_Load; + panelLocomotiveCollection.ResumeLayout(false); + panelLocomotiveCollection.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)pictureBoxCollection).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panelLocomotiveCollection; + private Button ButtonAddLocomotive; + private Button ButtonRemoveLocomotive; + private Button ButtonRefreshCollection; + private PictureBox pictureBoxCollection; + private MaskedTextBox maskedTextBoxNumber; + private Label LabelOnPanel; + } +} \ No newline at end of file diff --git a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.cs b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.cs new file mode 100644 index 0000000..cda95cd --- /dev/null +++ b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.cs @@ -0,0 +1,75 @@ +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 ElectricLocomotive; +using ProjectElectricLocomotive.DrawingObjects; +using ProjectElectricLocomotive.Generics; +using ProjectElectricLocomotive.MovementStrategy; + +namespace ProjectElectricLocomotive +{ + public partial class FormLocomotiveCollection : Form + { + private readonly LocomotivesGenericCollection _locomotives; + public FormLocomotiveCollection() + { + InitializeComponent(); + _locomotives = new LocomotivesGenericCollection(pictureBoxCollection.Width, pictureBoxCollection.Height); + } + private void ButtonAddLocomotive_Click(object sender, EventArgs e) + { + FormElectricLocomotive form = new(); + if (form.ShowDialog() == DialogResult.OK) + { + if (_locomotives + form.SelectedLocomotive != -1) + { + MessageBox.Show("Объект добавлен"); + pictureBoxCollection.Image = _locomotives.ShowLocomotives(); + } + else + { + MessageBox.Show("Не удалось добавить объект"); + } + } + } + private void ButtonRemoveLocomotive_Click(object sender, EventArgs e) + { + if (MessageBox.Show("Удалить объект?", "Удаление", + MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + { + return; + } + int pos = Convert.ToInt32(maskedTextBoxNumber.Text); + if (_locomotives - pos != null) + { + MessageBox.Show("Объект удален"); + pictureBoxCollection.Image = _locomotives.ShowLocomotives(); + } + else + { + MessageBox.Show("Не удалось удалить объект"); + } + } + private void ButtonRefreshCollection_Click(object sender, EventArgs e) + { + pictureBoxCollection.Image = _locomotives.ShowLocomotives(); + } + private void FormLocomotiveCollection_Load(object sender, EventArgs e) + { + } + private void LabelOnPanel_Click(object sender, EventArgs e) + { + + } + private void panelLocomotiveCollection_Paint(object sender, PaintEventArgs e) + { + + } + } +} diff --git a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.resx b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.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/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericCollection.cs b/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericCollection.cs index 509f7a3..2e3ee3e 100644 --- a/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericCollection.cs +++ b/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericCollection.cs @@ -8,40 +8,15 @@ using ProjectElectricLocomotive.MovementStrategy; namespace ProjectElectricLocomotive.Generics { - /// - /// Параметризованный класс для набора объектов DrawningCar - /// - /// - /// internal class LocomotivesGenericCollection - where T : DrawingObjects + where T : DrawingLocomotive where U : IMoveableObject { - /// - /// Ширина окна прорисовки - /// private readonly int _pictureWidth; - /// - /// Высота окна прорисовки - /// private readonly int _pictureHeight; - /// - /// Размер занимаемого объектом места (ширина) - /// - private readonly int _placeSizeWidth = 210; - /// - /// Размер занимаемого объектом места (высота) - /// + private readonly int _placeSizeWidth = 200; private readonly int _placeSizeHeight = 90; - /// - /// Набор объектов - /// private readonly SetGeneric _collection; - /// - /// Конструктор - /// - /// - /// public LocomotivesGenericCollection(int picWidth, int picHeight) { int width = picWidth / _placeSizeWidth; @@ -50,51 +25,26 @@ namespace ProjectElectricLocomotive.Generics _pictureHeight = picHeight; _collection = new SetGeneric(width * height); } - /// - /// Перегрузка оператора сложения - /// - /// - /// - /// - public static bool operator +(LocomotivesGenericCollection collect, T? - obj) + public static int operator + (LocomotivesGenericCollection collect, T? locomotive) { - if (obj == null) + if (locomotive == null) { - return false; + return -1; } - return collect?._collection.Insert(obj) ?? false; + return collect?._collection.Insert(locomotive) ?? -1; } - /// - /// Перегрузка оператора вычитания - /// - /// - /// - /// - public static T? operator -(LocomotivesGenericCollection collect, int - pos) + public static bool operator - (LocomotivesGenericCollection collect, int pos) { - T? obj = collect._collection.Get(pos); - if (obj != null) - { - collect._collection.Remove(pos); - } - return obj; + T? locomotive = collect._collection.Get(pos); + if (locomotive != null) + return collect._collection.Remove(pos); + return false; } - /// - /// Получение объекта IMoveableObject - /// - /// - /// public U? GetU(int pos) { return (U?)_collection.Get(pos)?.GetMoveableObject; } - /// - /// Вывод всего набора объектов - /// - /// - public Bitmap ShowCars() + public Bitmap ShowLocomotives() { Bitmap bmp = new(_pictureWidth, _pictureHeight); Graphics gr = Graphics.FromImage(bmp); @@ -102,10 +52,6 @@ namespace ProjectElectricLocomotive.Generics DrawObjects(gr); return bmp; } - /// - /// Метод отрисовки фона - /// - /// private void DrawBackground(Graphics g) { Pen pen = new(Color.Black, 3); @@ -122,17 +68,21 @@ namespace ProjectElectricLocomotive.Generics _placeSizeWidth, _pictureHeight / _placeSizeHeight * _placeSizeHeight); } } - /// - /// Метод прорисовки объектов - /// - /// private void DrawObjects(Graphics g) { + int HLoco = _pictureHeight / _placeSizeHeight; + int Wloco = _pictureWidth / _placeSizeWidth; for (int i = 0; i < _collection.Count; i++) { - // TODO получение объекта - // TODO установка позиции - // TODO прорисовка объекта + T? type = _collection.Get(i); + if (type != null) + { + type.SetPosition( + (int)(i / HLoco * _placeSizeWidth), + (HLoco - 1) * _placeSizeHeight - (int)(i % HLoco * _placeSizeHeight) + ); + type?.DrawTransport(g); + } } } } diff --git a/ElectricLocomotive/ElectricLocomotive/ObjectParameters.cs b/ElectricLocomotive/ElectricLocomotive/ObjectParameters.cs index 8fca35b..b0f4d6b 100644 --- a/ElectricLocomotive/ElectricLocomotive/ObjectParameters.cs +++ b/ElectricLocomotive/ElectricLocomotive/ObjectParameters.cs @@ -12,9 +12,6 @@ namespace ProjectElectricLocomotive.MovementStrategy private readonly int _y; private readonly int _width; private readonly int _height; - /// - /// Левая граница - /// public int LeftBorder => _x; /// /// Верхняя граница diff --git a/ElectricLocomotive/ElectricLocomotive/Program.cs b/ElectricLocomotive/ElectricLocomotive/Program.cs index cfc9721..e7d6cc3 100644 --- a/ElectricLocomotive/ElectricLocomotive/Program.cs +++ b/ElectricLocomotive/ElectricLocomotive/Program.cs @@ -1,17 +1,15 @@ +using ProjectElectricLocomotive; +using System.Drawing; + namespace ElectricLocomotive { internal static class Program { - /// - /// The main entry point for the application. - /// [STAThread] static void Main() { - // To customize application configuration such as set high DPI settings or default font, - // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new ElectricLocomotive()); + Application.Run(new FormLocomotiveCollection()); } } } \ No newline at end of file diff --git a/ElectricLocomotive/ElectricLocomotive/SetGeneric.cs b/ElectricLocomotive/ElectricLocomotive/SetGeneric.cs index 7b9b45b..9d02fdc 100644 --- a/ElectricLocomotive/ElectricLocomotive/SetGeneric.cs +++ b/ElectricLocomotive/ElectricLocomotive/SetGeneric.cs @@ -6,74 +6,59 @@ using System.Threading.Tasks; namespace ProjectElectricLocomotive.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 bool Insert(T car) + public int Insert(T locomotive) { - // TODO вставка в начало набора - return true; + return Insert(locomotive, 0); } - /// - /// Добавление объекта в набор на конкретную позицию - /// - /// Добавляемый автомобиль - /// Позиция - /// - public bool Insert(T car, int position) + public int Insert(T locomotive, int position) { - // TODO проверка позиции - // TODO проверка, что элемент массива по этой позиции пустой, если нет, то - // проверка, что после вставляемого элемента в массиве есть пустой элемент - // сдвиг всех объектов, находящихся справа от позиции до первого пустого элемента - // TODO вставка по позиции - _places[position] = car; - return true; + int Full = 0; + int temp = 0; + for (int i = position; i < Count; i++) + { + if (_places[i] != null) Full++; + } + if (Full == Count - position - 1) + return -1; + if (position < Count && position >= 0) + { + for (int j = position; j < Count; j++) + { + if (_places[j] == null) + { + temp = j; + break; + } + } + for (int i = temp; i > position; i--) + { + _places[i] = _places[i - 1]; + } + _places[position] = locomotive; + return position; + } + return -1; } - /// - /// Удаление объекта из набора с конкретной позиции - /// - /// - /// public bool Remove(int position) { - // TODO проверка позиции - // TODO удаление объекта из массива, присвоив элементу массива значение null + if (position >= Count || position < 0) + if (!(position >= 0 && position < Count) || _places[position] == null) + return false; + _places[position] = null; return true; } - /// - /// Получение объекта из набора по позиции - /// - /// - /// - public T? Get(int position) + public T Get(int position) { - // TODO проверка позиции + if (position < 0 || position >= Count) return null; return _places[position]; } }