diff --git a/Stormtrooper/Stormtrooper/AbstractMap.cs b/Stormtrooper/Stormtrooper/AbstractMap.cs index 28d28ad..6ecfaa1 100644 --- a/Stormtrooper/Stormtrooper/AbstractMap.cs +++ b/Stormtrooper/Stormtrooper/AbstractMap.cs @@ -103,9 +103,9 @@ namespace Cars break; } - for (int i = left; i < right; i++) + for (int i = left; i < right && i < _map.GetLength(0); i++) { - for (int j = top; j < bottom; j++) + for (int j = top; j < bottom && j < _map.GetLength(1); j++) { if (_map[i, j] == _barrier) { diff --git a/Stormtrooper/Stormtrooper/FormMapWithSetAirplane.cs b/Stormtrooper/Stormtrooper/FormMapWithSetAirplane.cs index 2af4f62..fc10273 100644 --- a/Stormtrooper/Stormtrooper/FormMapWithSetAirplane.cs +++ b/Stormtrooper/Stormtrooper/FormMapWithSetAirplane.cs @@ -32,6 +32,12 @@ namespace Stormtrooper case "Простая карта": map = new SimpleMap(); break; + case "Опасная карта": + map = new DangerMap(); + break; + case "Облачная карта": + map = new CloudMap(); + break; } if (map != null) { @@ -57,16 +63,24 @@ namespace Stormtrooper MainForm form = new(); if (form.ShowDialog() == DialogResult.OK) { - DrawningObject airplane = new(form.SelectedAirplane); - if (_mapAirsCollectionGeneric + airplane) + if(form.SelectedAirplane != null) { - MessageBox.Show("Объект добавлен"); - pictureBox.Image = _mapAirsCollectionGeneric.ShowSet(); + DrawningObject airplane = new (form.SelectedAirplane); + if (_mapAirsCollectionGeneric + airplane != -1) + { + MessageBox.Show("Объект добавлен"); + pictureBox.Image = _mapAirsCollectionGeneric.ShowSet(); + } + else + { + MessageBox.Show("Не удалось добавить объект"); + } } else { - MessageBox.Show("Не удалось добавить объект"); + MessageBox.Show("Объект не создан"); } + } } /// @@ -85,7 +99,7 @@ namespace Stormtrooper return; } int pos = Convert.ToInt32(maskedTextBoxPosition.Text); - if (_mapAirsCollectionGeneric - pos) + if (_mapAirsCollectionGeneric - pos != null) { MessageBox.Show("Объект удален"); pictureBox.Image = _mapAirsCollectionGeneric.ShowSet(); diff --git a/Stormtrooper/Stormtrooper/MainForm.cs b/Stormtrooper/Stormtrooper/MainForm.cs index 9b1ad61..76af6d6 100644 --- a/Stormtrooper/Stormtrooper/MainForm.cs +++ b/Stormtrooper/Stormtrooper/MainForm.cs @@ -29,9 +29,10 @@ namespace Stormtrooper } private void buttonCreate_Click(object sender, EventArgs e) { - Random random = new Random(); + Random rnd = new Random(); + _airplane = new DrawningMilitaryAirplane(10, 50); - _airplane.SetPosition(random.Next(100,150), random.Next(100,150), pictureBoxAirplane.Width, pictureBoxAirplane.Height); + _airplane.SetPosition(rnd.Next(100,150), rnd.Next(100,150), pictureBoxAirplane.Width, pictureBoxAirplane.Height); SetData(); Draw(); } @@ -74,8 +75,14 @@ namespace Stormtrooper { Random random = new Random(); + 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; + } _airplane = new DrawningStormtrooper(random.Next(10,100),random.Next(50,250),random.Next(1,100), - Color.FromArgb(random.Next(0,256), random.Next(0, 256), random.Next(0, 256)), + color, Convert.ToBoolean(random.Next(0,2)), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2))); _airplane.SetPosition(random.Next(100, 150), random.Next(100, 150), pictureBoxAirplane.Width, pictureBoxAirplane.Height); SetData(); diff --git a/Stormtrooper/Stormtrooper/MapWithSetAirplaneGeneric.cs b/Stormtrooper/Stormtrooper/MapWithSetAirplaneGeneric.cs index 18d580b..732696b 100644 --- a/Stormtrooper/Stormtrooper/MapWithSetAirplaneGeneric.cs +++ b/Stormtrooper/Stormtrooper/MapWithSetAirplaneGeneric.cs @@ -26,7 +26,7 @@ namespace Stormtrooper /// /// Размер занимаемого объектом места (высота) /// - private readonly int _placeSizeHeight = 90; + private readonly int _placeSizeHeight = 110; /// /// Набор объектов /// @@ -56,9 +56,9 @@ namespace Stormtrooper /// /// /// - public static bool operator +(MapWithSetAirplaneGeneric map, T car) + public static int operator +(MapWithSetAirplaneGeneric map, T air) { - return map._setAirs.Insert(car); + return map._setAirs.Insert(air); } /// /// Перегрузка оператора вычитания @@ -66,7 +66,7 @@ namespace Stormtrooper /// /// /// - public static bool operator -(MapWithSetAirplaneGeneric map, int position) + public static T operator -(MapWithSetAirplaneGeneric map, int position) { return map._setAirs.Remove(position); } @@ -147,10 +147,14 @@ namespace Stormtrooper private void DrawBackground(Graphics g) { Pen pen = new(Color.Black, 3); + g.FillRectangle(new SolidBrush(Color.DarkGray),0,0,_pictureWidth, _pictureHeight); + for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++) { - for (int j = 0; j < _pictureHeight / _placeSizeHeight + 1; ++j) - {//линия рамзетки места + g.FillRectangle(new SolidBrush(Color.Gray), i * _placeSizeWidth, 0, _placeSizeWidth / 2, _placeSizeHeight * (_pictureHeight / _placeSizeHeight)); + for (int j = 0; j < _pictureHeight / _placeSizeHeight+1; ++j) + { + g.DrawLine(pen, i * _placeSizeWidth, j * _placeSizeHeight, i * _placeSizeWidth + _placeSizeWidth / 2, j * _placeSizeHeight); } g.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, (_pictureHeight / _placeSizeHeight) * _placeSizeHeight); @@ -162,10 +166,28 @@ namespace Stormtrooper /// private void DrawAirs(Graphics g) { + int width = _pictureWidth / _placeSizeWidth; + int height = _pictureHeight / _placeSizeHeight; + + int currentWidth = width - 1; + int currentHeight = 0; + for (int i = 0; i < _setAirs.Count; i++) { - // TODO установка позиции + + _setAirs.Get(i)?.SetObject(currentWidth * _placeSizeWidth, + currentHeight * _placeSizeHeight, + _pictureWidth, _pictureHeight); _setAirs.Get(i)?.DrawningObject(g); + + if (currentWidth > 0) + currentWidth--; + else + { + currentWidth = width - 1; + currentHeight++; + } + if (currentHeight > height) return; } } } diff --git a/Stormtrooper/Stormtrooper/SetAirplaneGeneric.cs b/Stormtrooper/Stormtrooper/SetAirplaneGeneric.cs index dedf2a0..719eccc 100644 --- a/Stormtrooper/Stormtrooper/SetAirplaneGeneric.cs +++ b/Stormtrooper/Stormtrooper/SetAirplaneGeneric.cs @@ -30,11 +30,10 @@ namespace Stormtrooper /// /// Добавляемый самолёт /// - public bool Insert(T airplane) + public int Insert(T airplane) { - _places[0] = airplane; - // TODO вставка в начало набора - return true; + Insert(airplane, 0); + return 0; } /// /// Добавление объекта в набор на конкретную позицию @@ -42,26 +41,60 @@ namespace Stormtrooper /// Добавляемый самолёт /// Позиция /// - public bool Insert(T airplane, int position) + public int Insert(T airplane, int position) { - // TODO проверка позиции - // TODO проверка, что элемент массива по этой позиции пустой, если нет, то - // проверка, что после вставляемого элемента в массиве есть пустой элемент - // сдвиг всех объектов, находящихся справа от позиции до первого пустого элемента - // TODO вставка по позиции - _places[position] = airplane; - return true; + if (position < 0 || position >= Count) + { + return -1; + } + if (_places[position] == null || _places[position] == default(T)) + { + _places[position] = airplane; + return position; + } + else + { + bool hasEmptySpace = false; + int indexOfEmptyPlace = 0; + for (int i = position + 1; i < Count; ++i) + { + if (_places[i] == null || _places[i] == default(T)) + { + hasEmptySpace = true; + indexOfEmptyPlace = i; + break; + } + } + if (hasEmptySpace) + { + for (int i = indexOfEmptyPlace; i > position; --i) + { + _places[i] = _places[i - 1]; + } + _places[position] = airplane; + return position; + } + else + { + return -1; + } + } + } /// /// Удаление объекта из набора с конкретной позиции /// /// /// - public bool Remove(int position) + public T Remove(int position) { - // TODO проверка позиции - // TODO удаление объекта из массива, присовив элементу массива значение null - return true; + if (position < 0 || position >= Count) + { + return null; + } + T memoryObj = _places[position]; + _places[position] = null; + return memoryObj; } /// /// Получение объекта из набора по позиции @@ -70,7 +103,10 @@ namespace Stormtrooper /// public T Get(int position) { - // TODO проверка позиции + if (position < 0 || position >= Count) + { + return null; + } return _places[position]; } }