From 4aafb4c0c5416ed9dd245cf12d13cf6fd4559458 Mon Sep 17 00:00:00 2001 From: Saanechkaa Date: Wed, 7 Dec 2022 14:43:44 +0400 Subject: [PATCH] Lab4 ready --- .../FormMapWithSetRoadTrains.Designer.cs | 138 +++++++++++++----- .../RoadTrain/FormMapWithSetRoadTrains.cs | 136 ++++++++++++----- .../RoadTrain/MapWithSetRoadTrainsGeneric.cs | 22 ++- RoadTrain/RoadTrain/MapsCollection.cs | 82 +++++++++++ RoadTrain/RoadTrain/SetRoadTrainsGeneric.cs | 102 +++++++------ 5 files changed, 348 insertions(+), 132 deletions(-) create mode 100644 RoadTrain/RoadTrain/MapsCollection.cs diff --git a/RoadTrain/RoadTrain/FormMapWithSetRoadTrains.Designer.cs b/RoadTrain/RoadTrain/FormMapWithSetRoadTrains.Designer.cs index 7bcabb9..a63e02d 100644 --- a/RoadTrain/RoadTrain/FormMapWithSetRoadTrains.Designer.cs +++ b/RoadTrain/RoadTrain/FormMapWithSetRoadTrains.Designer.cs @@ -30,18 +30,24 @@ { this.pictureBox = new System.Windows.Forms.PictureBox(); this.groupBox = new System.Windows.Forms.GroupBox(); + this.groupBoxMaps = new System.Windows.Forms.GroupBox(); + this.textBoxNewMapName = new System.Windows.Forms.TextBox(); + this.buttonAddMap = new System.Windows.Forms.Button(); + this.buttonRemoveMap = new System.Windows.Forms.Button(); + this.listBoxMaps = new System.Windows.Forms.ListBox(); + this.comboBoxSelectorMap = new System.Windows.Forms.ComboBox(); this.buttonRight = new System.Windows.Forms.Button(); + this.buttonShowOnMap = new System.Windows.Forms.Button(); this.buttonUp = new System.Windows.Forms.Button(); this.buttonDown = new System.Windows.Forms.Button(); this.buttonLeft = new System.Windows.Forms.Button(); this.maskedTextBoxPosition = new System.Windows.Forms.MaskedTextBox(); - this.buttonShowOnMap = new System.Windows.Forms.Button(); this.buttonShowStorage = new System.Windows.Forms.Button(); this.buttonRemoveRoadTrain = new System.Windows.Forms.Button(); this.buttonAddRoadTrain = new System.Windows.Forms.Button(); - this.comboBoxSelectorMap = new System.Windows.Forms.ComboBox(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit(); this.groupBox.SuspendLayout(); + this.groupBoxMaps.SuspendLayout(); this.SuspendLayout(); // // pictureBox @@ -54,16 +60,16 @@ // // groupBox // + this.groupBox.Controls.Add(this.groupBoxMaps); this.groupBox.Controls.Add(this.buttonRight); + this.groupBox.Controls.Add(this.buttonShowOnMap); this.groupBox.Controls.Add(this.buttonUp); this.groupBox.Controls.Add(this.buttonDown); this.groupBox.Controls.Add(this.buttonLeft); this.groupBox.Controls.Add(this.maskedTextBoxPosition); - this.groupBox.Controls.Add(this.buttonShowOnMap); this.groupBox.Controls.Add(this.buttonShowStorage); this.groupBox.Controls.Add(this.buttonRemoveRoadTrain); this.groupBox.Controls.Add(this.buttonAddRoadTrain); - this.groupBox.Controls.Add(this.comboBoxSelectorMap); this.groupBox.Location = new System.Drawing.Point(653, 3); this.groupBox.Name = "groupBox"; this.groupBox.Size = new System.Drawing.Size(175, 445); @@ -71,12 +77,76 @@ this.groupBox.TabStop = false; this.groupBox.Text = "Инструменты"; // + // groupBoxMaps + // + this.groupBoxMaps.Controls.Add(this.textBoxNewMapName); + this.groupBoxMaps.Controls.Add(this.buttonAddMap); + this.groupBoxMaps.Controls.Add(this.buttonRemoveMap); + this.groupBoxMaps.Controls.Add(this.listBoxMaps); + this.groupBoxMaps.Controls.Add(this.comboBoxSelectorMap); + this.groupBoxMaps.Location = new System.Drawing.Point(6, 22); + this.groupBoxMaps.Name = "groupBoxMaps"; + this.groupBoxMaps.Size = new System.Drawing.Size(163, 211); + this.groupBoxMaps.TabIndex = 14; + this.groupBoxMaps.TabStop = false; + this.groupBoxMaps.Text = "Карты"; + // + // textBoxNewMapName + // + this.textBoxNewMapName.Location = new System.Drawing.Point(6, 22); + this.textBoxNewMapName.Name = "textBoxNewMapName"; + this.textBoxNewMapName.Size = new System.Drawing.Size(151, 23); + this.textBoxNewMapName.TabIndex = 17; + // + // buttonAddMap + // + this.buttonAddMap.Location = new System.Drawing.Point(6, 79); + this.buttonAddMap.Name = "buttonAddMap"; + this.buttonAddMap.Size = new System.Drawing.Size(151, 25); + this.buttonAddMap.TabIndex = 16; + this.buttonAddMap.Text = "Добавить карту"; + this.buttonAddMap.UseVisualStyleBackColor = true; + this.buttonAddMap.Click += new System.EventHandler(this.ButtonAddMap_Click); + // + // buttonRemoveMap + // + this.buttonRemoveMap.Location = new System.Drawing.Point(6, 180); + this.buttonRemoveMap.Name = "buttonRemoveMap"; + this.buttonRemoveMap.Size = new System.Drawing.Size(151, 25); + this.buttonRemoveMap.TabIndex = 15; + this.buttonRemoveMap.Text = "Удалить карту"; + this.buttonRemoveMap.UseVisualStyleBackColor = true; + this.buttonRemoveMap.Click += new System.EventHandler(this.ButtonDeleteMap_Click); + // + // listBoxMaps + // + this.listBoxMaps.FormattingEnabled = true; + this.listBoxMaps.ItemHeight = 15; + this.listBoxMaps.Location = new System.Drawing.Point(6, 110); + this.listBoxMaps.Name = "listBoxMaps"; + this.listBoxMaps.Size = new System.Drawing.Size(151, 64); + this.listBoxMaps.TabIndex = 1; + this.listBoxMaps.Click += new System.EventHandler(this.ListBoxMaps_SelectedIndexChanged); + // + // comboBoxSelectorMap + // + this.comboBoxSelectorMap.BackColor = System.Drawing.SystemColors.HighlightText; + this.comboBoxSelectorMap.ForeColor = System.Drawing.SystemColors.WindowText; + this.comboBoxSelectorMap.FormattingEnabled = true; + this.comboBoxSelectorMap.Items.AddRange(new object[] { + "Простая карта", + "Дорога"}); + this.comboBoxSelectorMap.Location = new System.Drawing.Point(6, 50); + this.comboBoxSelectorMap.Name = "comboBoxSelectorMap"; + this.comboBoxSelectorMap.Size = new System.Drawing.Size(151, 23); + this.comboBoxSelectorMap.TabIndex = 0; + // // buttonRight // this.buttonRight.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonRight.BackgroundImage = global::RoadTrain.Properties.Resources.arrowRight; this.buttonRight.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; - this.buttonRight.Location = new System.Drawing.Point(103, 415); + this.buttonRight.Location = new System.Drawing.Point(103, 418); this.buttonRight.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); this.buttonRight.Name = "buttonRight"; this.buttonRight.Size = new System.Drawing.Size(26, 22); @@ -84,12 +154,22 @@ this.buttonRight.UseVisualStyleBackColor = true; this.buttonRight.Click += new System.EventHandler(this.ButtonMove_Click); // + // buttonShowOnMap + // + this.buttonShowOnMap.Location = new System.Drawing.Point(6, 357); + this.buttonShowOnMap.Name = "buttonShowOnMap"; + this.buttonShowOnMap.Size = new System.Drawing.Size(160, 25); + this.buttonShowOnMap.TabIndex = 4; + this.buttonShowOnMap.Text = "Посмотреть карту"; + this.buttonShowOnMap.UseVisualStyleBackColor = true; + this.buttonShowOnMap.Click += new System.EventHandler(this.ButtonShowOnMap_Click); + // // buttonUp // this.buttonUp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonUp.BackgroundImage = global::RoadTrain.Properties.Resources.arrowUp; this.buttonUp.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; - this.buttonUp.Location = new System.Drawing.Point(74, 387); + this.buttonUp.Location = new System.Drawing.Point(74, 390); this.buttonUp.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); this.buttonUp.Name = "buttonUp"; this.buttonUp.Size = new System.Drawing.Size(26, 22); @@ -102,7 +182,7 @@ this.buttonDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonDown.BackgroundImage = global::RoadTrain.Properties.Resources.arrowDown; this.buttonDown.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; - this.buttonDown.Location = new System.Drawing.Point(74, 414); + this.buttonDown.Location = new System.Drawing.Point(74, 417); this.buttonDown.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); this.buttonDown.Name = "buttonDown"; this.buttonDown.Size = new System.Drawing.Size(26, 22); @@ -115,7 +195,7 @@ this.buttonLeft.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.buttonLeft.BackgroundImage = global::RoadTrain.Properties.Resources.arrowLeft; this.buttonLeft.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; - this.buttonLeft.Location = new System.Drawing.Point(43, 414); + this.buttonLeft.Location = new System.Drawing.Point(43, 417); this.buttonLeft.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); this.buttonLeft.Name = "buttonLeft"; this.buttonLeft.Size = new System.Drawing.Size(26, 22); @@ -125,26 +205,16 @@ // // maskedTextBoxPosition // - this.maskedTextBoxPosition.Location = new System.Drawing.Point(6, 159); + this.maskedTextBoxPosition.Location = new System.Drawing.Point(6, 268); this.maskedTextBoxPosition.Name = "maskedTextBoxPosition"; this.maskedTextBoxPosition.Size = new System.Drawing.Size(160, 23); this.maskedTextBoxPosition.TabIndex = 5; // - // buttonShowOnMap - // - this.buttonShowOnMap.Location = new System.Drawing.Point(6, 318); - this.buttonShowOnMap.Name = "buttonShowOnMap"; - this.buttonShowOnMap.Size = new System.Drawing.Size(160, 23); - this.buttonShowOnMap.TabIndex = 4; - this.buttonShowOnMap.Text = "Посмотреть карту"; - this.buttonShowOnMap.UseVisualStyleBackColor = true; - this.buttonShowOnMap.Click += new System.EventHandler(this.ButtonShowOnMap_Click); - // // buttonShowStorage // - this.buttonShowStorage.Location = new System.Drawing.Point(6, 253); + this.buttonShowStorage.Location = new System.Drawing.Point(6, 330); this.buttonShowStorage.Name = "buttonShowStorage"; - this.buttonShowStorage.Size = new System.Drawing.Size(160, 32); + this.buttonShowStorage.Size = new System.Drawing.Size(160, 25); this.buttonShowStorage.TabIndex = 3; this.buttonShowStorage.Text = "Посмотреть хранилище"; this.buttonShowStorage.UseVisualStyleBackColor = true; @@ -152,7 +222,7 @@ // // buttonRemoveRoadTrain // - this.buttonRemoveRoadTrain.Location = new System.Drawing.Point(6, 188); + this.buttonRemoveRoadTrain.Location = new System.Drawing.Point(6, 295); this.buttonRemoveRoadTrain.Name = "buttonRemoveRoadTrain"; this.buttonRemoveRoadTrain.Size = new System.Drawing.Size(160, 27); this.buttonRemoveRoadTrain.TabIndex = 2; @@ -162,26 +232,14 @@ // // buttonAddRoadTrain // - this.buttonAddRoadTrain.Location = new System.Drawing.Point(6, 89); + this.buttonAddRoadTrain.Location = new System.Drawing.Point(6, 239); this.buttonAddRoadTrain.Name = "buttonAddRoadTrain"; - this.buttonAddRoadTrain.Size = new System.Drawing.Size(160, 32); + this.buttonAddRoadTrain.Size = new System.Drawing.Size(160, 25); this.buttonAddRoadTrain.TabIndex = 1; this.buttonAddRoadTrain.Text = "Добавить грузовик"; this.buttonAddRoadTrain.UseVisualStyleBackColor = true; this.buttonAddRoadTrain.Click += new System.EventHandler(this.ButtonAddRoadTrain_Click); // - // comboBoxSelectorMap - // - this.comboBoxSelectorMap.FormattingEnabled = true; - this.comboBoxSelectorMap.Items.AddRange(new object[] { - "Простая карта", - "Дорога"}); - this.comboBoxSelectorMap.Location = new System.Drawing.Point(6, 31); - this.comboBoxSelectorMap.Name = "comboBoxSelectorMap"; - this.comboBoxSelectorMap.Size = new System.Drawing.Size(160, 23); - this.comboBoxSelectorMap.TabIndex = 0; - this.comboBoxSelectorMap.SelectedIndexChanged += new System.EventHandler(this.ComboBoxSelectorMap_SelectedIndexChanged); - // // FormMapWithSetRoadTrains // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); @@ -194,8 +252,9 @@ ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit(); this.groupBox.ResumeLayout(false); this.groupBox.PerformLayout(); + this.groupBoxMaps.ResumeLayout(false); + this.groupBoxMaps.PerformLayout(); this.ResumeLayout(false); - } #endregion @@ -212,5 +271,10 @@ private Button buttonUp; private Button buttonDown; private Button buttonLeft; + private GroupBox groupBoxMaps; + private Button buttonAddMap; + private Button buttonRemoveMap; + private ListBox listBoxMaps; + private TextBox textBoxNewMapName; } } \ No newline at end of file diff --git a/RoadTrain/RoadTrain/FormMapWithSetRoadTrains.cs b/RoadTrain/RoadTrain/FormMapWithSetRoadTrains.cs index eab0328..529fa1d 100644 --- a/RoadTrain/RoadTrain/FormMapWithSetRoadTrains.cs +++ b/RoadTrain/RoadTrain/FormMapWithSetRoadTrains.cs @@ -2,10 +2,19 @@ { public partial class FormMapWithSetRoadTrains : Form { + /// + /// Словарь для выпадающего списка + /// + private readonly Dictionary _mapsDict = new() + { + { "Простая карта", new SimpleMap() }, + { "Дорога", new RoadMap() } + }; + /// - /// Объект от класса карты с набором объектов - /// - private MapWithSetRoadTrainsGeneric _mapRoadTrainsCollectionGeneric; + /// Объект от коллекции карт + /// + private readonly MapsCollection _mapsCollection; /// /// Конструктор @@ -13,33 +22,87 @@ public FormMapWithSetRoadTrains() { InitializeComponent(); + _mapsCollection = new MapsCollection(pictureBox.Width, pictureBox.Height); + comboBoxSelectorMap.Items.Clear(); + foreach (var elem in _mapsDict) + { + comboBoxSelectorMap.Items.Add(elem.Key); + } + } + + /// + /// Заполнение listBoxMaps + /// + private void ReloadMaps() + { + int index = listBoxMaps.SelectedIndex; + + listBoxMaps.Items.Clear(); + for (int i = 0; i < _mapsCollection.Keys.Count; i++) + { + listBoxMaps.Items.Add(_mapsCollection.Keys[i]); + } + + if (listBoxMaps.Items.Count > 0 && (index == -1 || index >= listBoxMaps.Items.Count)) + { + listBoxMaps.SelectedIndex = 0; + } + else if (listBoxMaps.Items.Count > 0 && index > -1 && index < listBoxMaps.Items.Count) + { + listBoxMaps.SelectedIndex = index; + } } /// /// Выбор карты /// /// - /// - private void ComboBoxSelectorMap_SelectedIndexChanged(object sender, EventArgs e) + /// + private void ListBoxMaps_SelectedIndexChanged(object sender, EventArgs e) { - AbstractMap map = null; - switch (comboBoxSelectorMap.Text) + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + } + + /// + /// Добавление карты + /// + /// + /// + private void ButtonAddMap_Click(object sender, EventArgs e) + { + if (comboBoxSelectorMap.SelectedIndex == -1 || string.IsNullOrEmpty(textBoxNewMapName.Text)) { - case "Простая карта": - map = new SimpleMap(); - break; - case "Дорога": - map = new RoadMap(); - break; + MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; } - if (map != null) + if (!_mapsDict.ContainsKey(comboBoxSelectorMap.Text)) { - _mapRoadTrainsCollectionGeneric = new MapWithSetRoadTrainsGeneric( - pictureBox.Width, pictureBox.Height, map); + MessageBox.Show("Нет такой карты", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; } - else + _mapsCollection.AddMap(textBoxNewMapName.Text, _mapsDict[comboBoxSelectorMap.Text]); + ReloadMaps(); + } + + /// + /// Удаление карты + /// + /// + /// + private void ButtonDeleteMap_Click(object sender, EventArgs e) + { + if (listBoxMaps.SelectedIndex == -1) { - _mapRoadTrainsCollectionGeneric = null; + return; + } + + if (MessageBox.Show($"Удалить карту {listBoxMaps.SelectedItem}?", + "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + _mapsCollection.DelMap(listBoxMaps.SelectedItem?.ToString() ?? string.Empty); + ReloadMaps(); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); } } @@ -50,7 +113,7 @@ /// private void ButtonAddRoadTrain_Click(object sender, EventArgs e) { - if (_mapRoadTrainsCollectionGeneric == null) + if (listBoxMaps.SelectedIndex == -1) { return; } @@ -58,16 +121,16 @@ if (form.ShowDialog() == DialogResult.OK) { DrawningObjectRoadTrain roadTrain = new(form.SelectedRoadTrain); - if (_mapRoadTrainsCollectionGeneric + roadTrain >= 0) + if (_mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty] + roadTrain != -1) { MessageBox.Show("Объект добавлен"); - pictureBox.Image = _mapRoadTrainsCollectionGeneric.ShowSet(); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); } else { MessageBox.Show("Не удалось добавить объект"); } - pictureBox.Image = _mapRoadTrainsCollectionGeneric.ShowSet(); } } @@ -78,6 +141,10 @@ /// private void ButtonRemoveRoadTrain_Click(object sender, EventArgs e) { + if (listBoxMaps.SelectedIndex == -1) + { + return; + } if (string.IsNullOrEmpty(maskedTextBoxPosition.Text)) { return; @@ -87,16 +154,13 @@ return; } int pos = Convert.ToInt32(maskedTextBoxPosition.Text); - if (_mapRoadTrainsCollectionGeneric - pos != null) + if (_mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty] - pos != null) { MessageBox.Show("Объект удален"); - pictureBox.Image = _mapRoadTrainsCollectionGeneric.ShowSet(); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); } - else - { - MessageBox.Show("Не удалось удалить объект"); - } - pictureBox.Image = _mapRoadTrainsCollectionGeneric.ShowSet(); + else { MessageBox.Show("Не удалось удалить объект"); } } /// @@ -106,12 +170,12 @@ /// private void ButtonShowStorage_Click(object sender, EventArgs e) { - if (_mapRoadTrainsCollectionGeneric == null) + if (listBoxMaps.SelectedIndex == -1) { return; } - pictureBox.Image = _mapRoadTrainsCollectionGeneric.ShowSet(); - pictureBox.Image = _mapRoadTrainsCollectionGeneric.ShowSet(); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); } /// @@ -121,11 +185,11 @@ /// private void ButtonShowOnMap_Click(object sender, EventArgs e) { - if (_mapRoadTrainsCollectionGeneric == null) + if (listBoxMaps.SelectedIndex == -1) { return; } - pictureBox.Image = _mapRoadTrainsCollectionGeneric.ShowOnMap(); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowOnMap(); } /// @@ -135,7 +199,7 @@ /// private void ButtonMove_Click(object sender, EventArgs e) { - if (_mapRoadTrainsCollectionGeneric == null) + if (listBoxMaps.SelectedIndex == -1) { return; } @@ -157,7 +221,7 @@ dir = Direction.Right; break; } - pictureBox.Image = _mapRoadTrainsCollectionGeneric.MoveObject(dir); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].MoveObject(dir); } } } diff --git a/RoadTrain/RoadTrain/MapWithSetRoadTrainsGeneric.cs b/RoadTrain/RoadTrain/MapWithSetRoadTrainsGeneric.cs index 079bcc7..a0fb24f 100644 --- a/RoadTrain/RoadTrain/MapWithSetRoadTrainsGeneric.cs +++ b/RoadTrain/RoadTrain/MapWithSetRoadTrainsGeneric.cs @@ -97,13 +97,9 @@ public Bitmap ShowOnMap() { Shaking(); - for (int i = 0; i < _setRoadTrains.Count; i++) + foreach (var roadTrain in _setRoadTrains.GetRoadTrains()) { - var roadTrain = _setRoadTrains.Get(i); - if (roadTrain != null) - { - return _map.CreateMap(_pictureWidth, _pictureHeight, roadTrain); - } + return _map.CreateMap(_pictureWidth, _pictureHeight, roadTrain); } return new(_pictureWidth, _pictureHeight); } @@ -130,14 +126,14 @@ int j = _setRoadTrains.Count - 1; for (int i = 0; i < _setRoadTrains.Count; i++) { - if (_setRoadTrains.Get(i) == null) + if (_setRoadTrains[i] == null) { for (; j > i; j--) { - var roadTrain = _setRoadTrains.Get(j); - if (roadTrain != null) + var car = _setRoadTrains[j]; + if (car != null) { - _setRoadTrains.Insert(roadTrain, i); + _setRoadTrains.Insert(car, i); _setRoadTrains.Remove(j); break; } @@ -178,7 +174,7 @@ int y = 0; int j = 0; - for (int i = 0; i < _setRoadTrains.Count; i++) + foreach (var roadTrain in _setRoadTrains.GetRoadTrains()) { if (j >= _pictureWidth / _placeSizeWidth - 1) { @@ -186,8 +182,8 @@ y += _placeSizeHeight; j = 0; } - _setRoadTrains.Get(i)?.SetObject(x, y + 2 * _pictureWidth / _placeSizeWidth, _pictureWidth, _pictureHeight); - _setRoadTrains.Get(i)?.DrawningObject(g); + roadTrain.SetObject(x, y + 2 * _pictureWidth / _placeSizeWidth, _pictureWidth, _pictureHeight); + roadTrain.DrawningObject(g); x += _placeSizeWidth + 120; j++; } diff --git a/RoadTrain/RoadTrain/MapsCollection.cs b/RoadTrain/RoadTrain/MapsCollection.cs new file mode 100644 index 0000000..72243da --- /dev/null +++ b/RoadTrain/RoadTrain/MapsCollection.cs @@ -0,0 +1,82 @@ +namespace RoadTrain +{ + /// + /// Класс для хранения коллекции карт + /// + internal class MapsCollection + { + /// + /// Словарь (хранилище) с картами + /// + readonly Dictionary> _mapStorages; + + /// + /// Возвращение списка названий карт + /// + public List Keys => _mapStorages.Keys.ToList(); + + /// + /// Ширина окна отрисовки + /// + private readonly int _pictureWidth; + + /// + /// Высота окна отрисовки + /// + private readonly int _pictureHeight; + + /// + /// Конструктор + /// + /// + /// + public MapsCollection(int pictureWidth, int pictureHeight) + { + _mapStorages = new Dictionary>(); + _pictureWidth = pictureWidth; + _pictureHeight = pictureHeight; + } + + /// + /// Добавление карты + /// + /// Название карты + /// Карта + public void AddMap(string name, AbstractMap map) + { + if (_mapStorages.ContainsKey(name)) + { + MessageBox.Show("Карта уже существует"); + return; + } + else + { + _mapStorages.Add(name, new MapWithSetRoadTrainsGeneric(_pictureWidth, _pictureHeight, map)); + } + } + + /// + /// Удаление карты + /// + /// Название карты + public void DelMap(string name) + { + _mapStorages.Remove(name); + } + + /// + /// Доступ к парковке + /// + /// + /// + public MapWithSetRoadTrainsGeneric this[string ind] + { + get + { + if (_mapStorages.ContainsKey(ind)) + return _mapStorages[ind]; + return null; + } + } + } +} diff --git a/RoadTrain/RoadTrain/SetRoadTrainsGeneric.cs b/RoadTrain/RoadTrain/SetRoadTrainsGeneric.cs index 0b9ae87..5abcb3f 100644 --- a/RoadTrain/RoadTrain/SetRoadTrainsGeneric.cs +++ b/RoadTrain/RoadTrain/SetRoadTrainsGeneric.cs @@ -10,12 +10,14 @@ /// /// Массив объектов, которые храним /// - private readonly T[] _places; + private readonly List _places; /// /// Количество объектов в массиве /// - public int Count => _places.Length; + public int Count => _places.Count; + + private readonly int _maxCount; /// /// Конструктор @@ -23,7 +25,8 @@ /// public SetRoadTrainsGeneric(int count) { - _places = new T[count]; + _maxCount = count; + _places = new List(); } /// @@ -33,7 +36,11 @@ /// public int Insert(T roadTrain) { - return Insert(roadTrain, 0); + // проверка на _maxCount + if (_places.Count + 1 >= _maxCount) + return -1; + _places.Insert(0, roadTrain); + return 0; } /// @@ -45,44 +52,15 @@ public int Insert(T roadTrain, int position) { // проверка позиции - if (position < 0 || position >= _places.Length) - { + if (position < 0 || position >= _maxCount) return -1; - } - // проверка, что элемент массива по этой позиции пустой - if (_places[position] == null) - { - _places[position] = roadTrain; - return position; - } - - int emptyIndex = -1; - - // проверка, что после вставляемого элемента в массиве есть пустой элемент - for (int i = position + 1; i < Count; i++) - { - if (_places[i] == null) - { - emptyIndex = i; - break; - } - } - - if (emptyIndex == -1) - { + // проверка на _maxCount + if (_places.Count + 1 >= _maxCount) return -1; - } - // сдвиг всех объектов, находящихся справа от позиции до первого пустого элемента - for (int i = emptyIndex; i > position; i--) - { - _places[i] = _places[i - 1]; - } - - // вставка по позиции + // вставка по позиции _places[position] = roadTrain; - return position; } @@ -94,27 +72,59 @@ public T Remove(int position) { // проверка позиции - if (position >= _places.Length || position < 0) + if (position < 0 || position >= _maxCount) return null; T delObj = _places[position]; // удаление объекта из массива - _places[position] = null; + _places.RemoveAt(position); return delObj; } /// /// Получение объекта из набора по позиции /// - /// - /// - public T Get(int position) + /// + /// + public T this[int position] { - // проверка позиции - if (position >= _places.Length || position < 0) + get { - return null; + // проверка позиции + if (position < 0 || position >= _maxCount) + { + return null; + } + return _places[position]; + } + set + { + // проверка позиции + if (position < 0 || position >= _maxCount) + { + return; + } + // вставка в список по позиции + Insert(value, position); + } + } + + /// + /// Проход по набору до первого пустого + /// + /// + public IEnumerable GetRoadTrains() + { + foreach (var roadTrain in _places) + { + if (roadTrain != null) + { + yield return roadTrain; + } + else + { + yield break; + } } - return _places[position]; } } } -- 2.25.1