From 1260b0dc88cf0fd53f7d6bf74cb5ec34f67eb3fc Mon Sep 17 00:00:00 2001 From: MaxKarme <91691525+MaxKarme@users.noreply.github.com> Date: Wed, 19 Oct 2022 08:11:37 +0300 Subject: [PATCH 1/2] fix bug --- AirFighter/AirFighter/AbstractMap.cs | 48 +++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/AirFighter/AirFighter/AbstractMap.cs b/AirFighter/AirFighter/AbstractMap.cs index 35e2ad6..0dd466d 100644 --- a/AirFighter/AirFighter/AbstractMap.cs +++ b/AirFighter/AirFighter/AbstractMap.cs @@ -32,17 +32,29 @@ namespace AirFighter private (int mapI, int mapJ) checkBarrier((float Left, float Right, float Top, float Bottom) rect) { + return checkBarrier(rect, false, false, true, false); + } + private (int mapI, int mapJ) checkBarrier((float Left, float Right, float Top, float Bottom) rect, bool minLeft, bool maxLeft, bool isTop, bool isBottom) + { + (int mapI, int mapJ) res = (-1, -1); + for (int i = (int)(rect.Top / _size_y); i <= (int)(rect.Bottom / _size_y) && i < _map.GetLength(0); ++i) { for (int j = (int)(rect.Left / _size_x); j <= (int)(rect.Right / _size_x) && j < _map.GetLength(1); ++j) { if (j < 0) j = 0; if (i < 0) i = 0; - if (_map[i, j] == _barrier) return (i, j); + if (_map[i, j] != _barrier) continue; + + if (res.mapI == -1) res = (i, j); + if (minLeft && res.mapJ > j) res = (i, j); + if (maxLeft && res.mapJ < j) res = (i, j); + if(isBottom) res = (i, j); + if (isTop) return (i, j); } } - return (-1, -1); + return res; } public Bitmap MoveObject(Direction direction) { @@ -53,17 +65,37 @@ namespace AirFighter float drawningWidth = position.Right - position.Left; float drawningHeight = position.Bottom - position.Top; - if (direction == Direction.Left) position.Left -= _drawningObject.Step; - if (direction == Direction.Right) position.Left += _drawningObject.Step; - if (direction == Direction.Up) position.Top -= _drawningObject.Step; - if (direction == Direction.Down) position.Top += _drawningObject.Step; + bool minLeft = false; + bool maxLeft = false; + bool isTop = false; + bool isBottom = false; + + if (direction == Direction.Left) + { + position.Left -= _drawningObject.Step; + maxLeft = true; + } + if (direction == Direction.Right) + { + position.Left += _drawningObject.Step; + minLeft = true; + } + if (direction == Direction.Up) { + position.Top -= _drawningObject.Step; + isTop = true; + } + if (direction == Direction.Down) + { + position.Top += _drawningObject.Step; + isBottom = true; + } position.Right = position.Left + drawningWidth; position.Bottom = position.Top + drawningHeight; - var currentBarrier = checkBarrier(position); + var currentBarrier = checkBarrier(position, minLeft, maxLeft, isTop, isBottom); if (currentBarrier.mapI == -1) { @@ -114,7 +146,7 @@ namespace AirFighter if(position.Right > _width) { - position.Top = (minRowIndex + 1) * _size_y; + position.Top = (minRowIndex + 1) * _size_y + 1; position.Bottom = position.Top + drawningHeight; position.Left = 0; -- 2.25.1 From dfdc51e414a4a2c7228f17cbcc3e106a24024c1d Mon Sep 17 00:00:00 2001 From: MaxKarme <91691525+MaxKarme@users.noreply.github.com> Date: Wed, 26 Oct 2022 16:37:29 +0300 Subject: [PATCH 2/2] end commit --- .../AirFighter/FormMapWithSetCars.Designer.cs | 129 ++++++++++++----- AirFighter/AirFighter/FormMapWithSetCars.cs | 132 +++++++++++++----- .../AirFighter/MapWithSetCarsGeneric.cs | 23 +-- AirFighter/AirFighter/MapsCollection.cs | 77 ++++++++++ AirFighter/AirFighter/SetCarsGeneric.cs | 72 ++++++---- 5 files changed, 326 insertions(+), 107 deletions(-) create mode 100644 AirFighter/AirFighter/MapsCollection.cs diff --git a/AirFighter/AirFighter/FormMapWithSetCars.Designer.cs b/AirFighter/AirFighter/FormMapWithSetCars.Designer.cs index 1cade31..895120c 100644 --- a/AirFighter/AirFighter/FormMapWithSetCars.Designer.cs +++ b/AirFighter/AirFighter/FormMapWithSetCars.Designer.cs @@ -29,6 +29,12 @@ private void InitializeComponent() { this.tools = new System.Windows.Forms.GroupBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.buttonDeleteMap = new System.Windows.Forms.Button(); + this.listBoxMaps = new System.Windows.Forms.ListBox(); + this.comboBoxSelectorMap = new System.Windows.Forms.ComboBox(); + this.buttonAddMap = new System.Windows.Forms.Button(); + this.textBoxNewMapName = new System.Windows.Forms.TextBox(); this.RightButton = new System.Windows.Forms.Button(); this.LeftButton = new System.Windows.Forms.Button(); this.UpButton = new System.Windows.Forms.Button(); @@ -38,14 +44,15 @@ this.ButtonShowOnMap = new System.Windows.Forms.Button(); this.ButtonShowStorage = new System.Windows.Forms.Button(); this.buttonAdd = new System.Windows.Forms.Button(); - this.comboBoxSelectorMap = new System.Windows.Forms.ComboBox(); this.pictureBox = new System.Windows.Forms.PictureBox(); this.tools.SuspendLayout(); + this.groupBox1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit(); this.SuspendLayout(); // // tools // + this.tools.Controls.Add(this.groupBox1); this.tools.Controls.Add(this.RightButton); this.tools.Controls.Add(this.LeftButton); this.tools.Controls.Add(this.UpButton); @@ -55,21 +62,83 @@ this.tools.Controls.Add(this.ButtonShowOnMap); this.tools.Controls.Add(this.ButtonShowStorage); this.tools.Controls.Add(this.buttonAdd); - this.tools.Controls.Add(this.comboBoxSelectorMap); this.tools.Dock = System.Windows.Forms.DockStyle.Right; - this.tools.Location = new System.Drawing.Point(839, 0); + this.tools.Location = new System.Drawing.Point(940, 0); this.tools.Name = "tools"; - this.tools.Size = new System.Drawing.Size(250, 597); + this.tools.Size = new System.Drawing.Size(250, 725); this.tools.TabIndex = 0; this.tools.TabStop = false; this.tools.Text = "Инструменты"; // + // groupBox1 + // + this.groupBox1.Controls.Add(this.buttonDeleteMap); + this.groupBox1.Controls.Add(this.listBoxMaps); + this.groupBox1.Controls.Add(this.comboBoxSelectorMap); + this.groupBox1.Controls.Add(this.buttonAddMap); + this.groupBox1.Controls.Add(this.textBoxNewMapName); + this.groupBox1.Location = new System.Drawing.Point(12, 33); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(226, 286); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "карты"; + // + // buttonDeleteMap + // + this.buttonDeleteMap.Location = new System.Drawing.Point(12, 243); + this.buttonDeleteMap.Name = "buttonDeleteMap"; + this.buttonDeleteMap.Size = new System.Drawing.Size(196, 29); + this.buttonDeleteMap.TabIndex = 13; + this.buttonDeleteMap.Text = "Удалить карту"; + this.buttonDeleteMap.UseVisualStyleBackColor = true; + this.buttonDeleteMap.Click += new System.EventHandler(this.ButtonDeleteMap_Click); + // + // listBoxMaps + // + this.listBoxMaps.FormattingEnabled = true; + this.listBoxMaps.ItemHeight = 20; + this.listBoxMaps.Location = new System.Drawing.Point(12, 133); + this.listBoxMaps.Name = "listBoxMaps"; + this.listBoxMaps.Size = new System.Drawing.Size(196, 104); + this.listBoxMaps.TabIndex = 12; + this.listBoxMaps.SelectedIndexChanged += new System.EventHandler(this.ListBoxMaps_SelectedIndexChanged); + // + // comboBoxSelectorMap + // + this.comboBoxSelectorMap.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSelectorMap.FormattingEnabled = true; + this.comboBoxSelectorMap.Items.AddRange(new object[] { + "Простая карта", + "Моя карта"}); + this.comboBoxSelectorMap.Location = new System.Drawing.Point(12, 59); + this.comboBoxSelectorMap.Name = "comboBoxSelectorMap"; + this.comboBoxSelectorMap.Size = new System.Drawing.Size(196, 28); + this.comboBoxSelectorMap.TabIndex = 0; + // + // buttonAddMap + // + this.buttonAddMap.Location = new System.Drawing.Point(12, 93); + this.buttonAddMap.Name = "buttonAddMap"; + this.buttonAddMap.Size = new System.Drawing.Size(196, 29); + this.buttonAddMap.TabIndex = 11; + this.buttonAddMap.Text = "Добавить карту"; + this.buttonAddMap.UseVisualStyleBackColor = true; + this.buttonAddMap.Click += new System.EventHandler(this.ButtonAddMap_Click); + // + // textBoxNewMapName + // + this.textBoxNewMapName.Location = new System.Drawing.Point(12, 26); + this.textBoxNewMapName.Name = "textBoxNewMapName"; + this.textBoxNewMapName.Size = new System.Drawing.Size(196, 27); + this.textBoxNewMapName.TabIndex = 0; + // // RightButton // this.RightButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.RightButton.BackgroundImage = global::AirFighter.Properties.Resources.right; this.RightButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.RightButton.Location = new System.Drawing.Point(148, 555); + this.RightButton.Location = new System.Drawing.Point(148, 683); this.RightButton.Name = "RightButton"; this.RightButton.RightToLeft = System.Windows.Forms.RightToLeft.No; this.RightButton.Size = new System.Drawing.Size(30, 30); @@ -82,7 +151,7 @@ this.LeftButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.LeftButton.BackgroundImage = global::AirFighter.Properties.Resources.left; this.LeftButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.LeftButton.Location = new System.Drawing.Point(76, 555); + this.LeftButton.Location = new System.Drawing.Point(76, 683); this.LeftButton.Name = "LeftButton"; this.LeftButton.RightToLeft = System.Windows.Forms.RightToLeft.No; this.LeftButton.Size = new System.Drawing.Size(30, 30); @@ -95,7 +164,7 @@ this.UpButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.UpButton.BackgroundImage = global::AirFighter.Properties.Resources.up; this.UpButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.UpButton.Location = new System.Drawing.Point(112, 520); + this.UpButton.Location = new System.Drawing.Point(112, 648); this.UpButton.Name = "UpButton"; this.UpButton.RightToLeft = System.Windows.Forms.RightToLeft.No; this.UpButton.Size = new System.Drawing.Size(30, 30); @@ -108,7 +177,7 @@ this.DownButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.DownButton.BackgroundImage = global::AirFighter.Properties.Resources.down; this.DownButton.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.DownButton.Location = new System.Drawing.Point(112, 555); + this.DownButton.Location = new System.Drawing.Point(112, 683); this.DownButton.Name = "DownButton"; this.DownButton.RightToLeft = System.Windows.Forms.RightToLeft.No; this.DownButton.Size = new System.Drawing.Size(30, 30); @@ -118,17 +187,17 @@ // // maskedTextBoxPosition // - this.maskedTextBoxPosition.Location = new System.Drawing.Point(3, 145); + this.maskedTextBoxPosition.Location = new System.Drawing.Point(24, 392); this.maskedTextBoxPosition.Mask = "00"; this.maskedTextBoxPosition.Name = "maskedTextBoxPosition"; - this.maskedTextBoxPosition.Size = new System.Drawing.Size(235, 27); + this.maskedTextBoxPosition.Size = new System.Drawing.Size(196, 27); this.maskedTextBoxPosition.TabIndex = 5; // // buttonRemove // - this.buttonRemove.Location = new System.Drawing.Point(3, 178); + this.buttonRemove.Location = new System.Drawing.Point(24, 425); this.buttonRemove.Name = "buttonRemove"; - this.buttonRemove.Size = new System.Drawing.Size(235, 29); + this.buttonRemove.Size = new System.Drawing.Size(196, 29); this.buttonRemove.TabIndex = 4; this.buttonRemove.Text = "Удалить"; this.buttonRemove.UseVisualStyleBackColor = true; @@ -136,9 +205,9 @@ // // ButtonShowOnMap // - this.ButtonShowOnMap.Location = new System.Drawing.Point(3, 313); + this.ButtonShowOnMap.Location = new System.Drawing.Point(24, 520); this.ButtonShowOnMap.Name = "ButtonShowOnMap"; - this.ButtonShowOnMap.Size = new System.Drawing.Size(235, 29); + this.ButtonShowOnMap.Size = new System.Drawing.Size(196, 29); this.ButtonShowOnMap.TabIndex = 3; this.ButtonShowOnMap.Text = "Посмотреть карту"; this.ButtonShowOnMap.UseVisualStyleBackColor = true; @@ -146,9 +215,9 @@ // // ButtonShowStorage // - this.ButtonShowStorage.Location = new System.Drawing.Point(3, 244); + this.ButtonShowStorage.Location = new System.Drawing.Point(24, 472); this.ButtonShowStorage.Name = "ButtonShowStorage"; - this.ButtonShowStorage.Size = new System.Drawing.Size(235, 29); + this.ButtonShowStorage.Size = new System.Drawing.Size(196, 29); this.ButtonShowStorage.TabIndex = 2; this.ButtonShowStorage.Text = "Посмотреть хранилище"; this.ButtonShowStorage.UseVisualStyleBackColor = true; @@ -156,33 +225,20 @@ // // buttonAdd // - this.buttonAdd.Location = new System.Drawing.Point(3, 91); + this.buttonAdd.Location = new System.Drawing.Point(24, 357); this.buttonAdd.Name = "buttonAdd"; - this.buttonAdd.Size = new System.Drawing.Size(235, 29); + this.buttonAdd.Size = new System.Drawing.Size(196, 29); this.buttonAdd.TabIndex = 1; this.buttonAdd.Text = "Добавить"; this.buttonAdd.UseVisualStyleBackColor = true; this.buttonAdd.Click += new System.EventHandler(this.ButtonAddCar_Click); // - // comboBoxSelectorMap - // - this.comboBoxSelectorMap.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBoxSelectorMap.FormattingEnabled = true; - this.comboBoxSelectorMap.Items.AddRange(new object[] { - "Простая карта", - "Моя карта"}); - this.comboBoxSelectorMap.Location = new System.Drawing.Point(3, 23); - this.comboBoxSelectorMap.Name = "comboBoxSelectorMap"; - this.comboBoxSelectorMap.Size = new System.Drawing.Size(235, 28); - this.comboBoxSelectorMap.TabIndex = 0; - this.comboBoxSelectorMap.SelectedIndexChanged += new System.EventHandler(this.ComboBoxSelectorMap_SelectedIndexChanged); - // // pictureBox // this.pictureBox.Dock = System.Windows.Forms.DockStyle.Fill; this.pictureBox.Location = new System.Drawing.Point(0, 0); this.pictureBox.Name = "pictureBox"; - this.pictureBox.Size = new System.Drawing.Size(839, 597); + this.pictureBox.Size = new System.Drawing.Size(940, 725); this.pictureBox.TabIndex = 1; this.pictureBox.TabStop = false; // @@ -190,13 +246,15 @@ // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1089, 597); + this.ClientSize = new System.Drawing.Size(1190, 725); this.Controls.Add(this.pictureBox); this.Controls.Add(this.tools); this.Name = "FormMapWithSetCars"; this.Text = "FormMapWithSetCars"; this.tools.ResumeLayout(false); this.tools.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit(); this.ResumeLayout(false); @@ -216,5 +274,10 @@ private Button LeftButton; private Button UpButton; private Button DownButton; + private GroupBox groupBox1; + private Button buttonDeleteMap; + private ListBox listBoxMaps; + private Button buttonAddMap; + private TextBox textBoxNewMapName; } } \ No newline at end of file diff --git a/AirFighter/AirFighter/FormMapWithSetCars.cs b/AirFighter/AirFighter/FormMapWithSetCars.cs index f4b3b4d..f7e9144 100644 --- a/AirFighter/AirFighter/FormMapWithSetCars.cs +++ b/AirFighter/AirFighter/FormMapWithSetCars.cs @@ -12,50 +12,103 @@ namespace AirFighter { public partial class FormMapWithSetCars : Form { - private MapWithSetCarsGeneric _mapCarsCollectionGeneric; + private readonly Dictionary _mapsDict = new() + { + { "Простая карта", new SimpleMap() }, + { "Моя карта", new MyMap() } + }; + /// + /// Объект от коллекции карт + /// + private readonly MapsCollection _mapsCollection; /// /// Конструктор /// public FormMapWithSetCars() { InitializeComponent(); + _mapsCollection = new MapsCollection(pictureBox.Width, + pictureBox.Height); + comboBoxSelectorMap.Items.Clear(); + foreach (var elem in _mapsDict) + { + comboBoxSelectorMap.Items.Add(elem.Key); + } } + /// /// Выбор карты /// /// /// - private void ComboBoxSelectorMap_SelectedIndexChanged(object sender, EventArgs e) - { - AbstractMap map = null; - switch (comboBoxSelectorMap.Text) - { - case "Простая карта": - map = new SimpleMap(); - break; - case "Моя карта": - map = new MyMap(); - break; - } - if (map != null) - { - _mapCarsCollectionGeneric = new - MapWithSetCarsGeneric( - pictureBox.Width, pictureBox.Height, map); - } - else - { - _mapCarsCollectionGeneric = null; - } - } /// /// Добавление объекта /// /// /// + /// + + 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 ButtonAddMap_Click(object sender, EventArgs e) + { + if (comboBoxSelectorMap.SelectedIndex == -1 || string.IsNullOrEmpty(textBoxNewMapName.Text)) + { + MessageBox.Show("Не все данные заполнены", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (!_mapsDict.ContainsKey(comboBoxSelectorMap.Text)) + { + MessageBox.Show("Нет такой карты", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _mapsCollection.AddMap(textBoxNewMapName.Text, + _mapsDict[comboBoxSelectorMap.Text]); + ReloadMaps(); + } + + private void ListBoxMaps_SelectedIndexChanged(object sender, EventArgs e) + { + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + } + + private void ButtonDeleteMap_Click(object sender, EventArgs e) + { + if (listBoxMaps.SelectedIndex == -1) + { + return; + } + + if (MessageBox.Show($"Удалить карту {listBoxMaps.SelectedItem}?", "Удаление", + MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + _mapsCollection.DelMap(listBoxMaps.SelectedItem?.ToString() ?? + string.Empty); + ReloadMaps(); + } + } + + private void ButtonAddCar_Click(object sender, EventArgs e) { - if (_mapCarsCollectionGeneric == null) + if (listBoxMaps.SelectedIndex == -1) { return; } @@ -63,10 +116,11 @@ namespace AirFighter if (form.ShowDialog() == DialogResult.OK) { DrawingObjectAirFighter car = new(form.SelectedAirFighter); - if (_mapCarsCollectionGeneric + car != -1) + if (_mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty] + car != -1) { MessageBox.Show("Объект добавлен"); - pictureBox.Image = _mapCarsCollectionGeneric.ShowSet(); + pictureBox.Image = + _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); } else { @@ -81,6 +135,10 @@ namespace AirFighter /// private void ButtonRemoveCar_Click(object sender, EventArgs e) { + if (listBoxMaps.SelectedIndex == -1) + { + return; + } if (string.IsNullOrEmpty(maskedTextBoxPosition.Text)) { return; @@ -91,15 +149,17 @@ namespace AirFighter return; } int pos = Convert.ToInt32(maskedTextBoxPosition.Text); - if (_mapCarsCollectionGeneric - pos != null) + if (_mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty] - pos != null) { MessageBox.Show("Объект удален"); - pictureBox.Image = _mapCarsCollectionGeneric.ShowSet(); + pictureBox.Image = + _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); } else { MessageBox.Show("Не удалось удалить объект"); } + } /// /// Вывод набора @@ -108,11 +168,12 @@ namespace AirFighter /// private void ButtonShowStorage_Click(object sender, EventArgs e) { - if (_mapCarsCollectionGeneric == null) + if (listBoxMaps.SelectedIndex == -1) { return; } - pictureBox.Image = _mapCarsCollectionGeneric.ShowSet(); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowSet(); + } /// /// Вывод карты @@ -121,11 +182,11 @@ namespace AirFighter /// private void ButtonShowOnMap_Click(object sender, EventArgs e) { - if (_mapCarsCollectionGeneric == null) + if (listBoxMaps.SelectedIndex == -1) { return; } - pictureBox.Image = _mapCarsCollectionGeneric.ShowOnMap(); + pictureBox.Image =_mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].ShowOnMap(); } /// /// Перемещение @@ -134,7 +195,7 @@ namespace AirFighter /// private void ButtonMove_Click(object sender, EventArgs e) { - if (_mapCarsCollectionGeneric == null) + if (listBoxMaps.SelectedIndex == -1) { return; } @@ -156,7 +217,8 @@ namespace AirFighter dir = Direction.Right; break; } - pictureBox.Image = _mapCarsCollectionGeneric.MoveObject(dir); + pictureBox.Image = _mapsCollection[listBoxMaps.SelectedItem?.ToString() ?? string.Empty].MoveObject(dir); + } } } diff --git a/AirFighter/AirFighter/MapWithSetCarsGeneric.cs b/AirFighter/AirFighter/MapWithSetCarsGeneric.cs index 6999f07..cf70b17 100644 --- a/AirFighter/AirFighter/MapWithSetCarsGeneric.cs +++ b/AirFighter/AirFighter/MapWithSetCarsGeneric.cs @@ -89,13 +89,10 @@ namespace AirFighter public Bitmap ShowOnMap() { Shaking(); - for (int i = 0; i < _setCars.Count; i++) + + foreach(var car in _setCars.GetCars()) { - var car = _setCars.Get(i); - if (car != null) - { - return _map.CreateMap(_pictureWidth, _pictureHeight, car); - } + return _map.CreateMap(_pictureWidth, _pictureHeight, car); } return new(_pictureWidth, _pictureHeight); } @@ -120,11 +117,11 @@ namespace AirFighter int j = _setCars.Count - 1; for (int i = 0; i < _setCars.Count; i++) { - if (_setCars.Get(i) == null) + if (_setCars[i] == null) { for (; j > i; j--) { - var car = _setCars.Get(j); + var car = _setCars[j]; if (car != null) { _setCars.Insert(car, i); @@ -181,13 +178,17 @@ namespace AirFighter int width = _pictureWidth / _placeSizeWidth; int height = _pictureHeight / _placeSizeHeight; - for (int i = 0; i < _setCars.Count; i++) + int i = 0; + + foreach(var car in _setCars.GetCars()) { int x = i % width; int y = i / width; - _setCars.Get(i)?.SetObject(x * _placeSizeWidth, y * _placeSizeHeight, _pictureWidth, _pictureHeight); - _setCars.Get(i)?.DrawningObject(g); + car.SetObject((width - x - 1) * _placeSizeWidth, (height - y - 1) * _placeSizeHeight, _pictureWidth, _pictureHeight); + car.DrawningObject(g); + + i++; } } } diff --git a/AirFighter/AirFighter/MapsCollection.cs b/AirFighter/AirFighter/MapsCollection.cs new file mode 100644 index 0000000..5e541cf --- /dev/null +++ b/AirFighter/AirFighter/MapsCollection.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AirFighter +{ + 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) + { + // TODO Прописать логику для добавления + bool check = _mapStorages.TryGetValue(name, out var value); + if (check) return; + + _mapStorages[name] = new(_pictureWidth, _pictureHeight, map); + } + /// + /// Удаление карты + /// + /// Название карты + public void DelMap(string name) + { + // TODO Прописать логику для удаления + _mapStorages.Remove(name); + } + /// + /// Доступ к парковке + /// + /// + /// + public MapWithSetCarsGeneric this[string ind] + { + get + { + // TODO Продумать логику получения объекта + bool check = _mapStorages.TryGetValue(ind, out var mapWithSet); + return mapWithSet; + } + } + } + +} diff --git a/AirFighter/AirFighter/SetCarsGeneric.cs b/AirFighter/AirFighter/SetCarsGeneric.cs index 7031a28..8ac840a 100644 --- a/AirFighter/AirFighter/SetCarsGeneric.cs +++ b/AirFighter/AirFighter/SetCarsGeneric.cs @@ -10,33 +10,29 @@ namespace AirFighter where T : class { /// - /// Массив объектов, которые храним + /// Список объектов, которые храним /// - private readonly T[] _places; + private readonly List _places; /// - /// Количество объектов в массиве + /// Количество объектов в списке /// - public int Count => _places.Length; + public int Count => _places.Count; + private readonly int _maxCount; /// /// Конструктор /// /// public SetCarsGeneric(int count) { - _places = new T[count]; + _maxCount = count; + _places = new List(); } public int Insert(T car) { // TODO вставка в начало набора - for(int i = 0; i < _places.Length; i++) - { - if (_places[i] == null) - { - _places[i] = car; - return i; - } - } - return -1; + if (_places.Count == _maxCount) return -1; + _places.Insert(0, car); + return 0; } public int Insert(T car, int position) { @@ -45,15 +41,8 @@ namespace AirFighter // проверка, что после вставляемого элемента в массиве есть пустой элемент // сдвиг всех объектов, находящихся справа от позиции до первого пустого элемента // TODO вставка по позиции - - int index = position; - - while (_places[index] != null && index < _places.Length) index++; - - if (index == _places.Length) return -1; - for (int i = index; i > position; --i) _places[i] = _places[i - 1]; - - _places[position] = car; + if (_places.Count == _maxCount) return -1; + _places.Insert(position, car); return position; } /// @@ -66,7 +55,7 @@ namespace AirFighter // TODO проверка позиции // TODO удаление объекта из массива, присовив элементу массива значение null T res = _places[position]; - _places[position] = null; + _places.Remove(res); return res; } /// @@ -74,11 +63,38 @@ namespace AirFighter /// /// /// - public T Get(int position) + public T this[int position] { - // TODO проверка позиции - return _places[position]; + get + { + // TODO проверка позиции + if(position < 0) return null; + if(position >= _places.Count) return null; + return _places[position]; + } + set + { + // TODO проверка позиции + if (position < 0) return; + if (position >= _places.Count) return; + // TODO вставка в список по позиции + Insert(value, position); + } + } + + public IEnumerable GetCars() + { + foreach (var car in _places) + { + if (car != null) + { + yield return car; + } + else + { + yield break; + } + } } } - } -- 2.25.1