From 9bba0b1a346419e5f9effc7e5533c732aae820ae Mon Sep 17 00:00:00 2001 From: Programmist73 Date: Thu, 6 Oct 2022 14:36:55 +0400 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=D0=B0=D1=80=D1=82=D1=8B=20?= =?UTF-8?q?=D0=BD=D0=B0=20FormMapWithSetPlannes=20=D0=B8=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=87=D0=B0=D0=BB=D0=BE=20=D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=89?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Airbus/FormMapWithSetPlanes.Designer.cs | 11 +- Airbus/Airbus/FormMapWithSetPlanes.cs | 11 +- Airbus/Airbus/MapWithSetPlanesGeneric.cs | 105 ++++++++++++++++-- Airbus/Airbus/SetPlanesGeneric.cs | 71 +++++++++--- 4 files changed, 172 insertions(+), 26 deletions(-) diff --git a/Airbus/Airbus/FormMapWithSetPlanes.Designer.cs b/Airbus/Airbus/FormMapWithSetPlanes.Designer.cs index d92608e..cd80382 100644 --- a/Airbus/Airbus/FormMapWithSetPlanes.Designer.cs +++ b/Airbus/Airbus/FormMapWithSetPlanes.Designer.cs @@ -73,6 +73,7 @@ this.buttonRight.Size = new System.Drawing.Size(45, 45); this.buttonRight.TabIndex = 9; this.buttonRight.UseVisualStyleBackColor = true; + this.buttonRight.Click += new System.EventHandler(this.ButtonMove_Click); // // buttonDown // @@ -83,6 +84,7 @@ this.buttonDown.Size = new System.Drawing.Size(45, 45); this.buttonDown.TabIndex = 8; this.buttonDown.UseVisualStyleBackColor = true; + this.buttonDown.Click += new System.EventHandler(this.ButtonMove_Click); // // buttonLeft // @@ -93,6 +95,7 @@ this.buttonLeft.Size = new System.Drawing.Size(45, 45); this.buttonLeft.TabIndex = 7; this.buttonLeft.UseVisualStyleBackColor = true; + this.buttonLeft.Click += new System.EventHandler(this.ButtonMove_Click); // // buttonUp // @@ -113,7 +116,7 @@ this.buttonShowOnMap.TabIndex = 5; this.buttonShowOnMap.Text = "Посмотреть карту"; this.buttonShowOnMap.UseVisualStyleBackColor = true; - this.buttonShowOnMap.Click += new System.EventHandler(this.buttonShowOnMap_Click); + this.buttonShowOnMap.Click += new System.EventHandler(this.ButtonShowOnMap_Click); // // buttonShowStorage // @@ -123,7 +126,7 @@ this.buttonShowStorage.TabIndex = 4; this.buttonShowStorage.Text = "Посмотреть хранилище"; this.buttonShowStorage.UseVisualStyleBackColor = true; - this.buttonShowStorage.Click += new System.EventHandler(this.buttonShowStorage_Click); + this.buttonShowStorage.Click += new System.EventHandler(this.ButtonShowStorage_Click); // // buttonRemovePlane // @@ -156,6 +159,10 @@ // comboBoxSelectorMap // this.comboBoxSelectorMap.FormattingEnabled = true; + this.comboBoxSelectorMap.Items.AddRange(new object[] { + "Простая карта", + "Буря в пустыне", + "Звёздные войны"}); this.comboBoxSelectorMap.Location = new System.Drawing.Point(20, 37); this.comboBoxSelectorMap.Name = "comboBoxSelectorMap"; this.comboBoxSelectorMap.Size = new System.Drawing.Size(218, 28); diff --git a/Airbus/Airbus/FormMapWithSetPlanes.cs b/Airbus/Airbus/FormMapWithSetPlanes.cs index 52ee4c8..0977f9d 100644 --- a/Airbus/Airbus/FormMapWithSetPlanes.cs +++ b/Airbus/Airbus/FormMapWithSetPlanes.cs @@ -30,6 +30,12 @@ namespace Airbus case "Простая карта": map = new SimpleMap(); break; + case "Буря в пустыне": + map = new DesertStormMap(); + break; + case "Звёздные войны": + map = new StarWarsMap(); + break; } if(map != null) @@ -69,6 +75,7 @@ namespace Airbus } } + //удаление объекта private void ButtonRemovePlane_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(maskedTextBoxPosition.Text)) @@ -96,7 +103,7 @@ namespace Airbus } //вывод набора - private void buttonShowStorage_Click(object sender, EventArgs e) + private void ButtonShowStorage_Click(object sender, EventArgs e) { if(_mapPlanesCollectionGeneric == null) { @@ -107,7 +114,7 @@ namespace Airbus } //вывод карты - private void buttonShowOnMap_Click(object sender, EventArgs e) + private void ButtonShowOnMap_Click(object sender, EventArgs e) { if (_mapPlanesCollectionGeneric == null) { diff --git a/Airbus/Airbus/MapWithSetPlanesGeneric.cs b/Airbus/Airbus/MapWithSetPlanesGeneric.cs index 07b52c6..909a633 100644 --- a/Airbus/Airbus/MapWithSetPlanesGeneric.cs +++ b/Airbus/Airbus/MapWithSetPlanesGeneric.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Numerics; +using System.Runtime.Intrinsics.Arm; using System.Text; using System.Threading.Tasks; @@ -43,13 +45,30 @@ namespace Airbus //пеергрузка оператора сложения public static bool operator +(MapWithSetPlanesGeneric map, T plane) { - return map._setPlanes.Insert(plane); + if (map._setPlanes.Insert(plane) != -1) + { + return true; + } + else + { + return false; + } + //return map._setPlanes.Insert(plane); } //перегрузка оператора вычитания public static bool operator -(MapWithSetPlanesGeneric map, int position) { - return map._setPlanes.Remove(position); + if (map._setPlanes.Remove(position) != null) + { + return true; + } + else + { + return false; + } + + //return map._setPlanes.Remove(position); } //вывод всего набора объектов @@ -124,25 +143,97 @@ namespace Airbus public void DrawBackground(Graphics g) { Pen pen = new(Color.Black, 3); + Pen marcupPen = new(Color.White, 5); + Pen signalFirePen = new(Color.OrangeRed, 5); + Brush concreteBrush = new SolidBrush(Color.LightGray); + Brush asphaltBrush = new SolidBrush(Color.DarkGray); + Brush marcupBrush = new SolidBrush(Color.White); - for(int i = 0; i < _pictureWidth / _placeSizeWidth; i++) + g.FillRectangle(concreteBrush, 0, 0, _pictureWidth, _pictureHeight); //заливаем область в цвет бетона + + for(int i = 0; i < _pictureWidth / _placeSizeWidth - 1; i++) { - for(int j = 0; j < _pictureHeight / _placeSizeHeight + 1; ++j) + for(int j = 2; j < _pictureHeight / _placeSizeHeight + 1; ++j) {//линия разметки места - g.DrawLine(pen, i * _placeSizeWidth, j * _placeSizeHeight, i * _placeSizeWidth + _placeSizeWidth / 2, j * _placeSizeHeight); + g.DrawLine(pen, i * _placeSizeWidth + 5, j * _placeSizeHeight, i * _placeSizeWidth + _placeSizeWidth / 2 + 5, j * _placeSizeHeight); } - g.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, (_pictureHeight / _placeSizeHeight) * _placeSizeHeight); + g.DrawLine(pen, i * _placeSizeWidth + 5, _placeSizeHeight * 2, i * _placeSizeWidth + 5, (_pictureHeight / _placeSizeHeight) * _placeSizeHeight); + } + + //отрисовка разметки взлётной полосы + g.FillRectangle(marcupBrush, _placeSizeWidth * 2 + 30, 0, 185, _pictureHeight); + g.FillRectangle(asphaltBrush, _placeSizeWidth * 2 + 35, 0, 175, _pictureHeight); + g.DrawLine(marcupPen, _placeSizeWidth * 2 + 210, 0, _placeSizeWidth * 2 + 210, _pictureHeight); + g.DrawLine(marcupPen, _placeSizeWidth * 2 + 35, 0, _placeSizeWidth * 2 + 35, _pictureHeight); + g.DrawLine(marcupPen, _placeSizeWidth * 2 + 215, 0, _placeSizeWidth * 2 + 215, _pictureHeight); + g.DrawLine(marcupPen, _placeSizeWidth * 2 + 30, 0, _placeSizeWidth * 2 + 30, _pictureHeight); + + for (int i = 0; i < _pictureHeight / _placeSizeHeight; ++i) + { + g.DrawLine(marcupPen, _placeSizeWidth * 2 + 125, 20 + i * _placeSizeHeight, _placeSizeWidth * 2 + 125, (i + 1) * _placeSizeHeight - 20); + } + + for(int i = 0; i < _pictureHeight / 20; i++) + { + g.DrawLine(signalFirePen, _placeSizeWidth * 2 + 15, 20 + i * _placeSizeHeight / 2, _placeSizeWidth * 2 + 15, (i + 1) * _placeSizeHeight / 2 - 20); + g.DrawLine(signalFirePen, _placeSizeWidth * 3 + 20, 20 + i * _placeSizeHeight / 2, _placeSizeWidth * 3 + 20, (i + 1) * _placeSizeHeight / 2 - 20); + } + + //отрисовка сочков + Brush pinkBrush = new SolidBrush(Color.LightPink); + for(int i = 1; i < 6; i++) + { + Point[] point = new Point[] + { + new Point((i * 70 - 10) + 45, 30), + new Point(i * 70 - 10, 50), + new Point( i * 70 - 10 , 10) + }; + g.FillPolygon(pinkBrush, point); + + g.DrawLine(pen, i * 70 - 10, 10, i * 70 - 10, 80); + g.DrawLine(pen, i * 70 - 10, 10, (i * 70 - 10) + 45, 30); + g.DrawLine(pen, i * 70 - 10, 50, (i * 70 - 10) + 45, 30); + } } //метод прорисовки объеков public void DrawPlanes(Graphics g) { + int width = _pictureWidth / _placeSizeWidth; + int height = _pictureHeight / _placeSizeHeight; + + int currentWidth = 0; + int currentHeight = 0; + for(int i = 0; i < _setPlanes.Count; i++) { - //TODO установка позиции + int bias = 0; //величина смещения + + if (currentWidth > 0 && currentHeight > 0) + { + bias = width; + } + + _setPlanes.Get(i)?.SetObject(_pictureWidth - currentWidth, _pictureHeight - height * currentHeight, _pictureWidth, _pictureHeight); _setPlanes.Get(i)?.DrawningObject(g); + + if (currentWidth < width - 1) + { + currentWidth++; + } + else + { + currentWidth = 0; + currentHeight++; + } + + if (currentHeight > height) + { + return; + } } } } diff --git a/Airbus/Airbus/SetPlanesGeneric.cs b/Airbus/Airbus/SetPlanesGeneric.cs index 2f20084..59935f1 100644 --- a/Airbus/Airbus/SetPlanesGeneric.cs +++ b/Airbus/Airbus/SetPlanesGeneric.cs @@ -22,38 +22,79 @@ namespace Airbus } //добавление объекта в набор - public bool Insert(T plane) + public int Insert(T plane) { - //TODO вставка в начало набора - return true; + return Insert(plane, 0); } //добавление объекта в набор на конкретную позицию - public bool Insert(T plane, int position) + public int Insert(T plane, int position) { - //TODO проверка позиции - //TODO проверка, что элемент массива на этой позиции пустой, если нет, то - // проверка, что после вставляемого элемента в массиве есть пустой элемент - // сдвиг всех элементов, находящихся справа от позиции до первого пустого элемента - //TODO втсавка по позиции + // проверка позиции + if (position >= _places.Length || position < 0) + { + return -1; + } + //проверка, что элемент массива по этой позиции пустой, если нет, то + if (_places[position] == null) + { + _places[position] = plane; + return position; + } + + //проверка, что после вставляемого элемента в массиве есть пустой элемент + int findEmptyPos = -1; + + for (int i = position + 1; i < Count; i++) + { + if (_places[i] == null) + { + findEmptyPos = i; + break; + } + } + + if (findEmptyPos < 0) + { + return -1; + } + + //сдвиг всех объектов, находящихся справа от позиции до первого пустого элемента + for (int i = findEmptyPos; i > position; i--) + { + _places[i] = _places[i - 1]; + } + + // вставка по позиции _places[position] = plane; - return true; + + return position; } //удаление объекта из набора с конкретной позиции - public bool Remove(int position) + public T Remove(int position) { - //TODO проверка позиции - //TODO удаление объекта из массива, присвоив элементу массива значение null + // проверка позиции + if (position >= _places.Length || position < 0) + { + return null; + } - return true; + // удаление объекта из массива, присовив элементу массива значение null + T temp = _places[position]; + _places[position] = null; + + return temp; } //получение объекта из набора по позиции public T Get(int position) { - //TODO проверка позиции + if (position >= _places.Length || position < 0) + { + return null; + } return _places[position]; }