From 667ad79f76e0ac4c9bf18736b6786e5258dc113c Mon Sep 17 00:00:00 2001 From: Vladislave Date: Wed, 15 May 2024 11:54:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=207?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractCompany.cs | 5 +- .../ICollectionGenericObject.cs | 31 +- .../ListGenericObjects.cs | 75 ++-- .../MassiveGenericObject.cs | 105 ++--- .../CollectionGenericObject/PlaneHangar.cs | 53 +-- .../StorageCollection.cs | 37 +- .../Drawnings/DrawningAirBomber.cs | 16 +- .../ProjectBomber/Drawnings/DrawningPlane.cs | 40 +- .../Exceptions/CollectionOverflowException.cs | 18 + .../Exceptions/ObjectNotFoundException.cs | 21 + .../PositionOutOfCollectionException.cs | 21 + .../ProjectBomber/FormPlaneCollection.cs | 401 +++++++++++------- ProjectBomber/ProjectBomber/Program.cs | 28 +- .../ProjectBomber/ProjectAirBomber.csproj | 13 + ProjectBomber/ProjectBomber/serilog.json | 15 + 15 files changed, 547 insertions(+), 332 deletions(-) create mode 100644 ProjectBomber/ProjectBomber/Exceptions/CollectionOverflowException.cs create mode 100644 ProjectBomber/ProjectBomber/Exceptions/ObjectNotFoundException.cs create mode 100644 ProjectBomber/ProjectBomber/Exceptions/PositionOutOfCollectionException.cs create mode 100644 ProjectBomber/ProjectBomber/serilog.json diff --git a/ProjectBomber/ProjectBomber/CollectionGenericObject/AbstractCompany.cs b/ProjectBomber/ProjectBomber/CollectionGenericObject/AbstractCompany.cs index 7f93b0b..26831f1 100644 --- a/ProjectBomber/ProjectBomber/CollectionGenericObject/AbstractCompany.cs +++ b/ProjectBomber/ProjectBomber/CollectionGenericObject/AbstractCompany.cs @@ -13,7 +13,7 @@ public abstract class AbstractCompany /// /// Размер места (ширина) /// - protected readonly int _placeSizeWidth = 180; + protected readonly int _placeSizeWidth = 220; /// /// Размер места (высота) /// @@ -33,7 +33,8 @@ public abstract class AbstractCompany /// /// Вычисление максимального количества элементов, который можно разместить в окне /// - private int GetMaxCount => _pictureWidth * _pictureHeight / (_placeSizeWidth * _placeSizeHeight); + + private int GetMaxCount => (_pictureWidth * _pictureHeight / (_placeSizeWidth * _placeSizeHeight)); /// /// Конструктор /// diff --git a/ProjectBomber/ProjectBomber/CollectionGenericObject/ICollectionGenericObject.cs b/ProjectBomber/ProjectBomber/CollectionGenericObject/ICollectionGenericObject.cs index c2a378a..7313cfd 100644 --- a/ProjectBomber/ProjectBomber/CollectionGenericObject/ICollectionGenericObject.cs +++ b/ProjectBomber/ProjectBomber/CollectionGenericObject/ICollectionGenericObject.cs @@ -10,27 +10,37 @@ public interface ICollectionGenericObject where T : class { /// - /// Количество объектов в коллекции + /// колличество объектов в коллекции /// int Count { get; } - /// - /// Установка максимального количества элементов - int MaxCount { get; set; } + /// + /// Установка максимального количества элементов + /// + int MaxCount { get; set; } + + /// + /// Добавление объекта в коллекцию + /// + /// Добавляемый объект + /// true - вставка прошла удачно, false - вставка не удалась int Insert(T obj); + /// /// Добавление объекта в коллекцию на конкретную позицию /// /// Добавляемый объект /// Позиция /// true - вставка прошла удачно, false - вставка не удалась - bool? Insert(T obj, int position); + int Insert(T obj, int position); + /// /// Удаление объекта из коллекции с конкретной позиции /// /// Позиция - /// true - удаление прошло удачно, false - удаление не удалось - T? Remove(int position); + /// true - удаление прошло удачно, false - удаление не удалось + T Remove(int position); + /// /// Получение объекта по позиции /// @@ -39,9 +49,10 @@ where T : class T? Get(int position); /// - /// Получение типа коллекции - /// - CollectionType GetCollectionType { get; } + /// Получение типа коллекции + /// + CollectionType GetCollectionType { get; } + /// /// Получение объектов коллекции по одному /// diff --git a/ProjectBomber/ProjectBomber/CollectionGenericObject/ListGenericObjects.cs b/ProjectBomber/ProjectBomber/CollectionGenericObject/ListGenericObjects.cs index 7568b48..f6ba753 100644 --- a/ProjectBomber/ProjectBomber/CollectionGenericObject/ListGenericObjects.cs +++ b/ProjectBomber/ProjectBomber/CollectionGenericObject/ListGenericObjects.cs @@ -1,4 +1,5 @@ using ProjectAirBomber.CollectionGenericObject; +using ProjectAirBomber.Exceptions; using System; using System.Collections.Generic; using System.Linq; @@ -10,22 +11,23 @@ namespace ProjectAirBomber.CollectionGenericObject; public class ListGenericObjects : ICollectionGenericObject where T : class { - private readonly List _collection; - private int _maxCount; - public int Count => _collection.Count; - public CollectionType GetCollectionType => CollectionType.List; - public int MaxCount - { - get - { - return _maxCount; - } - set - { - if (value > 0) _maxCount = value; - } - } + /// + /// Список объектов, которые храним + /// + private readonly List _collection; + + /// + /// Максимально допустимое число объектов в списке + /// + private int _maxCount; + + public int Count => _collection.Count; + + public int MaxCount { set { if (value > 0) { _maxCount = value; } } get { return Count; } } + + + public CollectionType GetCollectionType => CollectionType.List; /// /// Конструктор @@ -37,53 +39,46 @@ public class ListGenericObjects : ICollectionGenericObject public T? Get(int position) { - if (position >= 0 && position < Count) - { - return _collection[position]; - } - else - { - return null; - } - + // TODO проверка позиции + if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position); + return _collection[position]; } public int Insert(T obj) { - if (Count == _maxCount) { return -1; } + // TODO проверка, что не превышено максимальное количество элементов + // TODO вставка в конец набора + if (Count == _maxCount) throw new CollectionOverflowException(Count); _collection.Add(obj); return Count; } public int Insert(T obj, int position) { - if (position < 0 || position >= Count || Count == _maxCount) - { - return -1; - } + // TODO проверка, что не превышено максимальное количество элементов + // TODO проверка позиции + // TODO вставка по позиции + if (Count == _maxCount) throw new CollectionOverflowException(Count); + if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position); _collection.Insert(position, obj); return position; - } - public T? Remove(int position) + public T Remove(int position) { - if (position >= Count || position < 0) return null; - T? obj = _collection[position]; - _collection?.RemoveAt(position); + // TODO проверка позиции + // TODO удаление объекта из списка + if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position); + T obj = _collection[position]; + _collection.RemoveAt(position); return obj; } public IEnumerable GetItems() { - for (int i = 0; i < _collection.Count; i++) + for (int i = 0; i < Count; ++i) { yield return _collection[i]; } } - - bool? ICollectionGenericObject.Insert(T obj, int position) - { - throw new NotImplementedException(); - } } diff --git a/ProjectBomber/ProjectBomber/CollectionGenericObject/MassiveGenericObject.cs b/ProjectBomber/ProjectBomber/CollectionGenericObject/MassiveGenericObject.cs index 9638e16..4427190 100644 --- a/ProjectBomber/ProjectBomber/CollectionGenericObject/MassiveGenericObject.cs +++ b/ProjectBomber/ProjectBomber/CollectionGenericObject/MassiveGenericObject.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using ProjectAirBomber.Exceptions; namespace ProjectAirBomber.CollectionGenericObject; @@ -10,10 +6,11 @@ public class MassiveGenericObject : ICollectionGenericObject where T : class { /// - /// Массив объектов, которые храним + /// массив объектов, которые храним /// private T?[] _collection; public int Count => _collection.Length; + public int MaxCount { get @@ -36,9 +33,7 @@ where T : class } } - public CollectionType GetCollectionType => CollectionType.Massive; - /// /// Конструктор /// @@ -46,73 +41,87 @@ where T : class { _collection = Array.Empty(); } - public T? Get(int position) // получение с позиции + + public T? Get(int position) { - if (position < 0 || position >= _collection.Length) // если позиция передано неправильно - return null; + // TODO проверка позиции + if (position >= _collection.Length || position < 0) + { return null; } return _collection[position]; } - public int Insert(T obj) // вставка объекта на свободное место + + public int Insert(T obj) { - for (int i = 0; i < _collection.Length; ++i) + // TODO вставка в свободное место набора + int index = 0; + while (index < _collection.Length) { - if (_collection[i] == null) + if (_collection[index] == null) { - _collection[i] = obj; - return i; + _collection[index] = obj; + return index; } + + index++; } - return -1; + throw new CollectionOverflowException(Count); } - public int Insert(T obj, int position) // вставка объекта на место + + public int Insert(T obj, int position) { - if (position < 0 || position >= _collection.Length) // если позиция переданна неправильно - return -1; - if (_collection[position] == null)//если позиция пуста + // TODO проверка позиции + // TODO проверка, что элемент массива по этой позиции пустой, если нет, то + // ищется свободное место после этой позиции и идет вставка туда + // если нет после, ищем до + // TODO вставка + if (position >= _collection.Length || position < 0) + { throw new PositionOutOfCollectionException(position); } + + if (_collection[position] == null) { _collection[position] = obj; return position; } - else + int index; + + for (index = position + 1; index < _collection.Length; ++index) { - for (int i = position; i < _collection.Length; ++i) //ищем свободное место справа + if (_collection[index] == null) { - if (_collection[i] == null) - { - _collection[i] = obj; - return i; - } - } - for (int i = 0; i < position; ++i) // иначе слева - { - if (_collection[i] == null) - { - _collection[i] = obj; - return i; - } + _collection[position] = obj; + return position; } } - return -1; + + for (index = position - 1; index >= 0; --index) + { + if (_collection[index] == null) + { + _collection[position] = obj; + return position; + } + } + throw new CollectionOverflowException(Count); } - public T? Remove(int position) // удаление объекта, зануляя его + + public T Remove(int position) { - if (position < 0 || position >= _collection.Length || _collection[position] == null) - return null; - T? temp = _collection[position]; + // TODO проверка позиции + // TODO удаление объекта из массива, присвоив элементу массива значение null + if (position >= _collection.Length || position < 0) + { throw new PositionOutOfCollectionException(position); } + if (_collection[position] == null) + { throw new ObjectNotFoundException(position); } + T obj = _collection[position]; _collection[position] = null; - return temp; + return obj; } public IEnumerable GetItems() { - for (int i = 0; i < _collection.Length; i++) + for (int i = 0; i < _collection.Length; ++i) { yield return _collection[i]; } } - - bool? ICollectionGenericObject.Insert(T obj, int position) - { - throw new NotImplementedException(); - } } \ No newline at end of file diff --git a/ProjectBomber/ProjectBomber/CollectionGenericObject/PlaneHangar.cs b/ProjectBomber/ProjectBomber/CollectionGenericObject/PlaneHangar.cs index 6fa38b6..7e9c8e5 100644 --- a/ProjectBomber/ProjectBomber/CollectionGenericObject/PlaneHangar.cs +++ b/ProjectBomber/ProjectBomber/CollectionGenericObject/PlaneHangar.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using ProjectAirBomber.Drawnings; +using ProjectAirBomber.Exceptions; namespace ProjectAirBomber.CollectionGenericObject; @@ -15,45 +16,45 @@ public class PlaneHangar : AbstractCompany /// /// /// - public PlaneHangar(int picWidth, int picHeight, ICollectionGenericObject collection) : base(picWidth, picHeight, collection) { } + public PlaneHangar(int picWidth, int picHeight, ICollectionGenericObject collection) : base(picWidth, picHeight, collection) + { + } protected override void DrawBackgound(Graphics g) { + int width = _pictureWidth / _placeSizeWidth; + int height = _pictureHeight / _placeSizeHeight; Pen pen = new(Color.Black, 3); - int posX = 0; - for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++) + for (int i = 0; i < width; i++) { - int posY = 0; - g.DrawLine(pen, posX, posY, posX, posY + _placeSizeHeight * (_pictureHeight / _placeSizeHeight)); - for (int j = 0; j <= _pictureHeight / _placeSizeHeight; j++) + for (int j = 0; j < height + 1; ++j) { - g.DrawLine(pen, posX, posY, posX + _placeSizeWidth - 30, posY); - posY += _placeSizeHeight; + g.DrawLine(pen, i * _placeSizeWidth, j * _placeSizeHeight, i * _placeSizeWidth + _placeSizeWidth - 15, j * _placeSizeHeight); } - posX += _placeSizeWidth; - } } + protected override void SetObjectsPosition() { - int posX = _pictureWidth / _placeSizeWidth - 1; - int posY = 0; - for (int i = 0; i < _collection?.Count; i++) + int count = 0; + for (int y = 5; y + 50 < _pictureHeight; y += 170) { - if (_collection.Get(i) != null) + for (int x = 5; x + 200 < _pictureWidth; x += _placeSizeHeight + 50) { - _collection?.Get(i)?.SetPictureSize(_pictureWidth, _pictureHeight); - _collection?.Get(i)?.SetPosition(posX * _placeSizeWidth + 5, posY * _placeSizeHeight + 5); + //_collection?.Get(count)?.SetPictureSize(_pictureWidth, _pictureHeight); + //_collection?.Get(count)?.SetPosition(x, y); + //count++; + if (count < _collection?.Count) + { + try + { + _collection?.Get(count)?.SetPictureSize(_pictureWidth, _pictureHeight); + _collection?.Get(count)?.SetPosition(x, y); + } + catch (ObjectNotFoundException) { } + } + + count++; } - if (posX > 0) - { - posX--; - } - else - { - posY++; - posX = _pictureWidth / _placeSizeWidth - 1; - } - if (posX < 0) { return; } } } } \ No newline at end of file diff --git a/ProjectBomber/ProjectBomber/CollectionGenericObject/StorageCollection.cs b/ProjectBomber/ProjectBomber/CollectionGenericObject/StorageCollection.cs index 6aaab55..e7a16ce 100644 --- a/ProjectBomber/ProjectBomber/CollectionGenericObject/StorageCollection.cs +++ b/ProjectBomber/ProjectBomber/CollectionGenericObject/StorageCollection.cs @@ -1,6 +1,7 @@ using ProjectAirBomber.Drawnings; using ProjectAirBomber.CollectionGenericObject; using System.Text; +using ProjectAirBomber.Exceptions; namespace ProjectAirBomber.CollectionGenericObject; @@ -99,11 +100,11 @@ public class StorageCollection /// /// Путь и имя файла /// true - сохранение прошло успешно, false - ошибка при сохранении данных - public bool SaveData(string filename) + public void SaveData(string filename) { if (_storages.Count == 0) { - return false; + throw new Exception("В хранилище отсутствуют коллекции для сохранения"); } if (File.Exists(filename)) { @@ -141,8 +142,6 @@ public class StorageCollection } } - - return true; } /// @@ -155,32 +154,27 @@ public class StorageCollection /// /// Путь и имя файла /// true - загрузка прошла успешно, false - ошибка при загрузке данных - public bool LoadData(string filename) + public void LoadData(string filename) { if (!File.Exists(filename)) { - return false; + throw new Exception("Файл не существует"); } using (StreamReader fs = File.OpenText(filename)) { string str = fs.ReadLine(); if (str == null || str.Length == 0) { - return false; + throw new Exception("В файле нет данных"); } if (!str.StartsWith(_collectionKey)) { - return false; + throw new Exception("В файле неверные данные"); } _storages.Clear(); string strs = ""; while ((strs = fs.ReadLine()) != null) { - //по идее этого произойти не должно - //if (strs == null) - //{ - // return false; - //} string[] record = strs.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries); if (record.Length != 4) { @@ -190,24 +184,29 @@ public class StorageCollection ICollectionGenericObject? collection = StorageCollection.CreateCollection(collectionType); if (collection == null) { - return false; + throw new Exception("Не удалось создать коллекцию"); } collection.MaxCount = Convert.ToInt32(record[2]); string[] set = record[3].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries); foreach (string elem in set) { - if (elem?.CreateDrawningPlane() is T Plane) + if (elem?.CreateDrawningPlane() is T ship) { - if (collection.Insert(Plane) == -1) + try { - return false; + if (collection.Insert(ship) == -1) + { + throw new Exception("Объект не удалось добавить в коллекцию: " + record[3]); + } + } + catch (CollectionOverflowException ex) + { + throw new Exception("Коллекция переполнена", ex); } } } _storages.Add(record[0], collection); } - return true; - } } diff --git a/ProjectBomber/ProjectBomber/Drawnings/DrawningAirBomber.cs b/ProjectBomber/ProjectBomber/Drawnings/DrawningAirBomber.cs index 026639f..72a2ebe 100644 --- a/ProjectBomber/ProjectBomber/Drawnings/DrawningAirBomber.cs +++ b/ProjectBomber/ProjectBomber/Drawnings/DrawningAirBomber.cs @@ -19,8 +19,8 @@ public class DrawingAirBomber : DrawningPlane /// Вес /// Основной цвет /// Дополнительный цвет - /// Признак наличия стёкол - /// /// Признак наличия гармошки + /// Признак наличия стёкол + /// /// Признак наличия гармошки public DrawingAirBomber(EntityAirBomber plane) : base(200, 40) { @@ -45,9 +45,13 @@ public class DrawingAirBomber : DrawningPlane public override void DrawPlane(Graphics g) { if (EntityPlane == null || EntityPlane is not EntityAirBomber airBomber || !_startPosX.HasValue || !_startPosY.HasValue) + { return; + } + base.DrawPlane(g); + Brush AdditionalBrush = new SolidBrush(airBomber.AdditionalColor); Pen pen = new(Color.Black); //наличие топливных баков @@ -56,8 +60,8 @@ public class DrawingAirBomber : DrawningPlane Brush brBrown = new SolidBrush(Color.Brown); g.DrawRectangle(pen, _startPosX.Value + 90, _startPosY.Value + 60, 20, 5); g.DrawRectangle(pen, _startPosX.Value + 90, _startPosY.Value + 95, 20, 5); - g.FillRectangle(brBrown, _startPosX.Value + 90, _startPosY.Value + 60, 20, 5); - g.FillRectangle(brBrown, _startPosX.Value + 90, _startPosY.Value + 95, 20, 5); + g.FillRectangle(AdditionalBrush, _startPosX.Value + 90, _startPosY.Value + 60, 20, 5); + g.FillRectangle(AdditionalBrush, _startPosX.Value + 90, _startPosY.Value + 95, 20, 5); } //наличие дополнительных бомб @@ -66,8 +70,8 @@ public class DrawingAirBomber : DrawningPlane Brush brGreen = new SolidBrush(Color.Green); g.DrawRectangle(pen, _startPosX.Value + 55, _startPosY.Value + 35, 20, 8); g.DrawRectangle(pen, _startPosX.Value + 55, _startPosY.Value + 115, 20, 8); - g.FillRectangle(brGreen, _startPosX.Value + 55, _startPosY.Value + 35, 20, 8); - g.FillRectangle(brGreen, _startPosX.Value + 55, _startPosY.Value + 115, 20, 8); + g.FillRectangle(AdditionalBrush, _startPosX.Value + 55, _startPosY.Value + 35, 20, 8); + g.FillRectangle(AdditionalBrush, _startPosX.Value + 55, _startPosY.Value + 115, 20, 8); } } } \ No newline at end of file diff --git a/ProjectBomber/ProjectBomber/Drawnings/DrawningPlane.cs b/ProjectBomber/ProjectBomber/Drawnings/DrawningPlane.cs index 47745c6..0107821 100644 --- a/ProjectBomber/ProjectBomber/Drawnings/DrawningPlane.cs +++ b/ProjectBomber/ProjectBomber/Drawnings/DrawningPlane.cs @@ -70,6 +70,8 @@ public class DrawningPlane _startPosX = null; _startPosY = null; } + + /// /// Конструктор /// @@ -80,6 +82,7 @@ public class DrawningPlane { EntityPlane = new EntityPlane(speed, weight, bodyColor); } + /// /// Конструктор для наследования /// @@ -91,6 +94,7 @@ public class DrawningPlane _drawningPlaneHeight = drawningPlaneHeight; } + /// /// Установка границ поля /// @@ -99,26 +103,23 @@ public class DrawningPlane /// true - границы заданы, false - проверка не пройдена, нельзя public bool SetPictureSize(int width, int height) { - if (_drawningPlaneWidth <= width && _drawningPlaneHeight <= height) + // TODO проверка, что объект "влезает" в размеры поля + // если влезает, сохраняем границы и корректируем позицию объекта, если она была уже установлена + if (_drawningPlaneWidth <= width || _drawningPlaneHeight <= height) { _pictureWidth = width; _pictureHeight = height; - if (_startPosX.HasValue && _startPosY.HasValue) - { + if (_startPosX != null && _startPosY != null) if (_startPosX + _drawningPlaneWidth > _pictureWidth) - { _startPosX = _pictureWidth - _drawningPlaneWidth; - } - - if (_startPosY + _drawningPlaneHeight > _pictureHeight) - { - _startPosY = _pictureHeight - _drawningPlaneHeight; - } - } + if (_startPosY + _drawningPlaneHeight > _pictureHeight) + _startPosY = _pictureHeight - _drawningPlaneHeight; return true; } - return false; + else + return false; } + /// /// Установка позиции /// @@ -130,14 +131,21 @@ public class DrawningPlane { return; } - if (x < 0) x = 0; - else if (x + _drawningPlaneWidth > _pictureWidth) x = _pictureWidth.Value - _drawningPlaneWidth; + // TODO если при установке объекта в эти координаты, он будет "выходить" за границы формы + // то надо изменить координаты, чтобы он оставался в этих границах + if (x < 0) + x = 0; + else if (x + _drawningPlaneWidth > _pictureWidth) + x = _pictureWidth.Value - _drawningPlaneWidth; + if (y < 0) + x = 0; + else if (y + _drawningPlaneHeight > _pictureHeight) + y = _pictureHeight.Value - _drawningPlaneHeight; - if (y < 0) y = 0; - else if (y + _drawningPlaneHeight > _pictureHeight) y = _pictureHeight.Value - _drawningPlaneHeight; _startPosX = x; _startPosY = y; } + public bool MoveTransport(DirectionType direction) { if (EntityPlane == null || !_startPosX.HasValue || !_startPosY.HasValue) diff --git a/ProjectBomber/ProjectBomber/Exceptions/CollectionOverflowException.cs b/ProjectBomber/ProjectBomber/Exceptions/CollectionOverflowException.cs new file mode 100644 index 0000000..a4a0e34 --- /dev/null +++ b/ProjectBomber/ProjectBomber/Exceptions/CollectionOverflowException.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectAirBomber.Exceptions; + +[Serializable] +internal class CollectionOverflowException : ApplicationException +{ + public CollectionOverflowException(int count) : base("В коллекции превышено допустимое количество: " + count) { } + public CollectionOverflowException() : base() { } + public CollectionOverflowException(string message) : base(message) { } + public CollectionOverflowException(string message, Exception exception) : base(message, exception) { } + protected CollectionOverflowException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} diff --git a/ProjectBomber/ProjectBomber/Exceptions/ObjectNotFoundException.cs b/ProjectBomber/ProjectBomber/Exceptions/ObjectNotFoundException.cs new file mode 100644 index 0000000..0fdcaf5 --- /dev/null +++ b/ProjectBomber/ProjectBomber/Exceptions/ObjectNotFoundException.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectAirBomber.Exceptions; + +/// +/// Класс, описывающий ошибку, что по указанной позиции нет элемента +/// +[Serializable] +internal class ObjectNotFoundException : ApplicationException +{ + public ObjectNotFoundException(int i) : base("Не найден объект по позиции " + i) { } + public ObjectNotFoundException() : base() { } + public ObjectNotFoundException(string message) : base(message) { } + public ObjectNotFoundException(string message, Exception exception) : base(message, exception) { } + protected ObjectNotFoundException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} \ No newline at end of file diff --git a/ProjectBomber/ProjectBomber/Exceptions/PositionOutOfCollectionException.cs b/ProjectBomber/ProjectBomber/Exceptions/PositionOutOfCollectionException.cs new file mode 100644 index 0000000..1556b69 --- /dev/null +++ b/ProjectBomber/ProjectBomber/Exceptions/PositionOutOfCollectionException.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectAirBomber.Exceptions; + +/// +/// Класс, описывающий ошибку выхода за границы коллекции +/// +[Serializable] +internal class PositionOutOfCollectionException : ApplicationException +{ + public PositionOutOfCollectionException(int i) : base("Выход за границы коллекции.Позиция " + i) { } + public PositionOutOfCollectionException() : base() { } + public PositionOutOfCollectionException(string message) : base(message) { } + public PositionOutOfCollectionException(string message, Exception exception) : base(message, exception) { } + protected PositionOutOfCollectionException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} \ No newline at end of file diff --git a/ProjectBomber/ProjectBomber/FormPlaneCollection.cs b/ProjectBomber/ProjectBomber/FormPlaneCollection.cs index 37d3e1a..ca10ea5 100644 --- a/ProjectBomber/ProjectBomber/FormPlaneCollection.cs +++ b/ProjectBomber/ProjectBomber/FormPlaneCollection.cs @@ -11,100 +11,123 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using Microsoft.Extensions.Logging; +using ProjectAirBomber.Exceptions; namespace ProjectAirBomber; - public partial class FormPlaneCollection : Form +public partial class FormPlaneCollection : Form +{ + private readonly StorageCollection _storageCollection; + + private AbstractCompany? _company = null; + + private readonly ILogger _logger; + + public FormPlaneCollection(ILogger logger) { - private readonly StorageCollection _storageCollection; + InitializeComponent(); + _storageCollection = new(); + _logger = logger; + _logger.LogInformation("Форма загрузилась"); + } - /// - /// Стратегия перемещения - /// - private AbstractCompany? _company = null; + /// + /// Выбор компании + /// + /// + /// + private void ComboBoxSelectionCompany_SelectedIndexChanged(object sender, EventArgs e) + { + panelCompanyTools.Enabled = false; + } - public FormPlaneCollection() + /// + /// кнопка добавления самолета + /// + /// + /// + private void ButtonAddPlane_Click(object sender, EventArgs e) + { + FormCarConfig form = new(); + form.Show(); + form.AddEvent(SetPlane); + } + + /// + /// + /// + /// + private void SetPlane(DrawningPlane? plane) + { + try { - InitializeComponent(); - _storageCollection = new(); - } - - private void SetPlane(DrawningPlane plane) - { - { - if (_company == null || plane == null) - { - return; - } - if (_company + plane != -1) - { - MessageBox.Show("Объект добавлен"); - pictureBox.Image = _company.Show(); - } - else - { - MessageBox.Show("Не удалось добавить объект"); - } - } - } - - /// - /// Выбор компании - /// - /// - /// - private void comboBoxSelectionCompany_SelectedIndexChanged(object sender, EventArgs e) - { - panelCompanyTools.Enabled = false; - } - - /// - /// кнопка добавления самолета - /// - /// - /// - private void ButtonAddPlane_Click(object sender, EventArgs e) - { - FormCarConfig form = new(); - // TODO передать метод - - form.Show(); - form.AddEvent(SetPlane); - } - /// - /// кнопка удаления - /// - /// - /// - private void ButtonDelPlane_Click(object sender, EventArgs e) - { - if (string.IsNullOrEmpty(maskedTextBox.Text) || _company == null) + if (_company == null || plane == null) { return; } - if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) + if (_company + plane != -1) { - return; + MessageBox.Show("Объект добавлен"); + pictureBox.Image = _company.Show(); + _logger.LogInformation("Добавлен объект: " + plane.GetDataForSave()); } - int pos = Convert.ToInt32(maskedTextBox.Text); + } + catch (ObjectNotFoundException) { } + catch (CollectionOverflowException ex) + { + MessageBox.Show("Не удалось добавить объект"); + _logger.LogError("Ошибка: {Message}", ex.Message); + } + } + + /// + /// кнопка удаления + /// + /// + /// + private void ButtonDelPlane_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(maskedTextBox.Text) || _company == null) + { + return; + } + if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + { + return; + } + int pos = Convert.ToInt32(maskedTextBox.Text); + try + { if (_company - pos != null) { MessageBox.Show("Объект удален"); pictureBox.Image = _company.Show(); - } - else - { - MessageBox.Show("Не удалось удалить объект"); + _logger.LogInformation("Удален объект по позиции " + pos); } } - - private void ButtonGoToCheck_Click(object sender, EventArgs e) + catch (Exception ex) + { + MessageBox.Show("Не удалось удалить объект"); + _logger.LogError("Ошибка: {Message}", ex.Message); + } + } + + /// + /// + /// + /// + /// + private void ButtonGoToCheck_Click(object sender, EventArgs e) + { + + if (_company == null) + { + return; + } + DrawningPlane? plane = null; + int counter = 100; + try { - if (_company == null) - { - return; - } - DrawningPlane? plane = null; - int counter = 100; while (plane == null) { plane = _company.GetRandomObject(); @@ -114,46 +137,63 @@ namespace ProjectAirBomber; break; } } - if (plane == null) - { - return; - } ProjectAirBomber form = new() { SetPlane = plane }; form.ShowDialog(); } - private void ButtonRefresh_Click(object sender, EventArgs e) + catch (Exception ex) { - if (_company == null) - { - return; - } - pictureBox.Image = _company.Show(); + MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); } + } - private void RefreshListBoxItems() + /// + /// + /// + /// + /// + private void ButtonRefresh_Click(object sender, EventArgs e) + { + if (_company == null) { - listBoxCollection.Items.Clear(); - for (int i = 0; i < _storageCollection.Keys?.Count; ++i) - { - string? colName = _storageCollection.Keys?[i]; - if (!string.IsNullOrEmpty(colName)) - { - listBoxCollection.Items.Add(colName); - } - } - + return; } + pictureBox.Image = _company.Show(); + } - private void buttonCollectionAdd_Click(object sender, EventArgs e) + /// + /// + /// + private void RefreshListBoxItems() + { + listBoxCollection.Items.Clear(); + for (int i = 0; i < _storageCollection.Keys?.Count; ++i) { - if (string.IsNullOrEmpty(textBoxCollectionName.Text) || (!radioButtonList.Checked && !radioButtonMassive.Checked)) + string? colName = _storageCollection.Keys?[i]; + if (!string.IsNullOrEmpty(colName)) { - MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; + listBoxCollection.Items.Add(colName); } + } + } + + /// + /// Добавление компании + /// + /// + /// + private void buttonCollectionAdd_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxCollectionName.Text) || (!radioButtonList.Checked && !radioButtonMassive.Checked)) + { + MessageBox.Show("Не все данные заполнены", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + try + { CollectionType collectionType = CollectionType.None; if (radioButtonMassive.Checked) { @@ -163,87 +203,120 @@ namespace ProjectAirBomber; { collectionType = CollectionType.List; } - _storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); RefreshListBoxItems(); + _logger.LogInformation("Коллекция добавлена " + textBoxCollectionName.Text); } - private void buttonCollectionDel_Click(object sender, EventArgs e) + catch (Exception ex) + { + _logger.LogError("Ошибка: {Message}", ex.Message); + } + } + + /// + /// Удаление компании + /// + /// + /// + private void buttonCollectionDel_Click(object sender, EventArgs e) + { + if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null) + { + MessageBox.Show("Коллекция не выбрана"); + return; + } + try { - if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItems == null) - { - MessageBox.Show("Коллекция не выбрана"); - return; - } if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) { return; } _storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString()); RefreshListBoxItems(); + _logger.LogInformation("Коллекция: " + listBoxCollection.SelectedItem.ToString() + " удалена"); } - private void buttonCreateCompany_Click(object sender, EventArgs e) + catch (Exception ex) { - if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null) - { - MessageBox.Show("Коллекция не выбрана"); - return; - } - - ICollectionGenericObject? collection = _storageCollection[listBoxCollection.SelectedItem.ToString() ?? string.Empty]; - if (collection == null) - { - MessageBox.Show("Коллекция не проинициализирована"); - return; - } - - switch (comboBoxSelectionCompany.Text) - { - case "Ангар": - _company = new PlaneHangar(pictureBox.Width, pictureBox.Height, collection); - break; - } - - panelCompanyTools.Enabled = true; - RefreshListBoxItems(); + _logger.LogError("Ошибка: {Message}", ex.Message); } - /// - /// - /// - /// - /// - private void LoadToolStripMenuItem_Click(object sender, EventArgs e) + } + + /// + /// Создание компании + /// + /// + /// + private void buttonCreateCompany_Click(object sender, EventArgs e) + { + if (listBoxCollection.SelectedIndex < 0 || listBoxCollection.SelectedItem == null) { - if (openFileDialog.ShowDialog() == DialogResult.OK) - { - if (_storageCollection.LoadData(openFileDialog.FileName)) - { - MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); - RefreshListBoxItems(); - } - else - { - MessageBox.Show("Не загрузилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } + MessageBox.Show("Коллекция не выбрана"); + return; } - /// - /// - /// - /// - /// - private void SaveToolStripMenuItem_Click(object sender, EventArgs e) + ICollectionGenericObject? collection = + _storageCollection[listBoxCollection.SelectedItem.ToString() ?? string.Empty]; + if (collection == null) { - if (saveFileDialog.ShowDialog() == DialogResult.OK) + MessageBox.Show("Коллекция не проинициализирована"); + return; + } + switch (comboBoxSelectionCompany.Text) + { + case "Ангар": + _company = new PlaneHangar(pictureBox.Width, pictureBox.Height, collection); + break; + } + panelCompanyTools.Enabled = true; + RefreshListBoxItems(); + } + + + /// + /// Обработка кнопки загрузки + /// + /// + /// + private void LoadToolStripMenuItem_Click(object sender, EventArgs e) + { + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + try { - if (_storageCollection.SaveData(saveFileDialog.FileName)) - { - MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - else - { - MessageBox.Show("Не сохранилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); - } + _storageCollection.LoadData(openFileDialog.FileName); + MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + RefreshListBoxItems(); + _logger.LogInformation("Загрузка из файла: {filename}", openFileDialog.FileName); + } + catch (Exception ex) + { + MessageBox.Show("Не загрузилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("Ошибка: {Message}", ex.Message); } } } + + /// + /// Сохранение + /// + /// + /// + private void SaveToolStripMenuItem_Click(object sender, EventArgs e) + { + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + try + { + _storageCollection.SaveData(saveFileDialog.FileName); + MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogInformation($"Сохранение наборов в файл {saveFileDialog.FileName}"); + } + catch (Exception ex) + { + MessageBox.Show($"Не сохранилось: {ex.Message}", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogWarning($"Не удалось сохранить наборы с ошибкой: {ex.Message}"); + } + } + } +} + diff --git a/ProjectBomber/ProjectBomber/Program.cs b/ProjectBomber/ProjectBomber/Program.cs index b4c514a..507c2e1 100644 --- a/ProjectBomber/ProjectBomber/Program.cs +++ b/ProjectBomber/ProjectBomber/Program.cs @@ -1,7 +1,13 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Serilog; + namespace ProjectAirBomber { internal static class Program { + /// /// The main entry point for the application. /// @@ -11,7 +17,27 @@ namespace ProjectAirBomber // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new FormPlaneCollection()); + + ServiceCollection services = new(); + ConfigureServices(services); + using ServiceProvider serviceProvider = services.BuildServiceProvider(); + Application.Run(serviceProvider.GetRequiredService()); + + } + private static void ConfigureServices(ServiceCollection services) + { + string[] path = Directory.GetCurrentDirectory().Split('\\'); + string pathNeed = ""; + for (int i = 0; i < path.Length - 3; i++) + { + pathNeed += path[i] + "\\"; + } + services.AddSingleton() + .AddLogging(option => + { + option.SetMinimumLevel(LogLevel.Information); + option.AddSerilog(new LoggerConfiguration().ReadFrom.Configuration(new ConfigurationBuilder().AddJsonFile($"{pathNeed}serilog.json").Build()).CreateLogger()); + }); } } } \ No newline at end of file diff --git a/ProjectBomber/ProjectBomber/ProjectAirBomber.csproj b/ProjectBomber/ProjectBomber/ProjectAirBomber.csproj index 244387d..ec261dc 100644 --- a/ProjectBomber/ProjectBomber/ProjectAirBomber.csproj +++ b/ProjectBomber/ProjectBomber/ProjectAirBomber.csproj @@ -8,6 +8,19 @@ enable + + + + + + + + + + + + + True diff --git a/ProjectBomber/ProjectBomber/serilog.json b/ProjectBomber/ProjectBomber/serilog.json new file mode 100644 index 0000000..21a6582 --- /dev/null +++ b/ProjectBomber/ProjectBomber/serilog.json @@ -0,0 +1,15 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Debug", + "WriteTo": [ + { + "Name": "File", + "Args": { "path": "log.log" } + } + ], + "Properties": { + "Application": "Sample" + } + } +} \ No newline at end of file