From 013dcd954da175cdd05d9d4c60af659bc072ea97 Mon Sep 17 00:00:00 2001 From: Programmist73 Date: Wed, 5 Oct 2022 21:57:34 +0400 Subject: [PATCH] Generic classes. --- Airbus/Airbus/Airbus.csproj | 4 + Airbus/Airbus/MapWithSetPlanesGeneric.cs | 144 +++++++++++++++++++++++ Airbus/Airbus/SetPlanesGeneric.cs | 61 ++++++++++ 3 files changed, 209 insertions(+) create mode 100644 Airbus/Airbus/MapWithSetPlanesGeneric.cs create mode 100644 Airbus/Airbus/SetPlanesGeneric.cs diff --git a/Airbus/Airbus/Airbus.csproj b/Airbus/Airbus/Airbus.csproj index 13ee123..f2a984c 100644 --- a/Airbus/Airbus/Airbus.csproj +++ b/Airbus/Airbus/Airbus.csproj @@ -23,4 +23,8 @@ + + + + \ No newline at end of file diff --git a/Airbus/Airbus/MapWithSetPlanesGeneric.cs b/Airbus/Airbus/MapWithSetPlanesGeneric.cs new file mode 100644 index 0000000..ef66b81 --- /dev/null +++ b/Airbus/Airbus/MapWithSetPlanesGeneric.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Airbus +{ + //карта с набором объектов под неё + internal class MapWithSetPlanesGeneric + where T : class, IDrawningObject + where U : AbstractMap + { + //ширина окна отрисовки + private readonly int _pictureWidth; + //высота окна отрисовки + private readonly int _pictureHeight; + //размер занимаемого объектом места (ширина) + private readonly int _placeSizeWidth = 210; + //размер занимаемого объектом места (высота) + private readonly int _placeSizeHeight = 90; + //набор объектов + private readonly SetPlanesGeneric _setPlanes; + //карта + private readonly U _map; + + //конструктор + public MapWithSetPlanesGeneric(int picWidth, int picHeight, U map) + { + int width = picWidth / _placeSizeWidth; + int height = picHeight / _placeSizeHeight; + _setPlanes = new SetPlanesGeneric(width * height); + _pictureWidth = picWidth; + _pictureHeight = picHeight; + _map = map; + } + + //пеергрузка оператора сложения + public static bool operator +(MapWithSetPlanesGeneric map, T plane) + { + return map._setPlanes.Insert(plane); + } + + //перегрузка оператора вычитания + public static bool operator -(MapWithSetPlanesGeneric map, int position) + { + return map._setPlanes.Remove(position); + } + + //вывод всего набора объектов + public Bitmap ShowSet() + { + Bitmap bmp = new(_pictureWidth, _pictureHeight); + Graphics gr = Graphics.FromImage(bmp); + DrawBackground(gr); + DrawPlanes(gr); + return bmp; + } + + //просмотр объекта на карте + public Bitmap ShowOnMap() + { + Shaking(); + + for(int i = 0; i < _setPlanes.Count; i++) + { + var plane = _setPlanes.Get(i); + + if(plane != null) + { + return _map.CreateMap(_pictureWidth, _pictureHeight, plane); + } + } + + return new(_pictureWidth, _pictureHeight); + } + + //пеермещение объекта по карте + public Bitmap MoveObject(Direction direction) + { + if(_map != null) + { + return _map.MoveObject(direction); + } + + return new(_pictureWidth, _pictureHeight); + } + + //"взламываем" набор, чтобы все элементы оказались в начале + private void Shaking() + { + int j = _setPlanes.Count - 1; + + for (int i = 0; i < _setPlanes.Count; i++) + { + if (_setPlanes.Get(i) == null) + { + for (; j > i; j--) + { + var car = _setPlanes.Get(j); + + if (car != null) + { + _setPlanes.Insert(car, i); + _setPlanes.Remove(j); + break; + } + } + + if (j <= i) + { + return; + } + } + } + } + + //метод отрисовки фона + public void DrawBackground(Graphics g) + { + Pen pen = new(Color.Black, 3); + + for(int i = 0; i < _pictureWidth / _placeSizeWidth; i++) + { + 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); + } + } + + //метод прорисовки объеков + public void DrawPlanes(Graphics g) + { + for(int i = 0; i < _setPlanes.Count; i++) + { + //TODO установка позиции + _setPlanes.Get(i)?.DrawningObject(g); + } + } + } +} diff --git a/Airbus/Airbus/SetPlanesGeneric.cs b/Airbus/Airbus/SetPlanesGeneric.cs new file mode 100644 index 0000000..2f20084 --- /dev/null +++ b/Airbus/Airbus/SetPlanesGeneric.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Airbus +{ + internal class SetPlanesGeneric + where T: class + { + //массив объектов, которые храним + private readonly T[] _places; + + //количество объектов в массиве + public int Count => _places.Length; + + //конструктор + public SetPlanesGeneric(int count) + { + _places = new T[count]; + } + + //добавление объекта в набор + public bool Insert(T plane) + { + //TODO вставка в начало набора + return true; + } + + //добавление объекта в набор на конкретную позицию + public bool Insert(T plane, int position) + { + //TODO проверка позиции + //TODO проверка, что элемент массива на этой позиции пустой, если нет, то + // проверка, что после вставляемого элемента в массиве есть пустой элемент + // сдвиг всех элементов, находящихся справа от позиции до первого пустого элемента + //TODO втсавка по позиции + + _places[position] = plane; + return true; + } + + //удаление объекта из набора с конкретной позиции + public bool Remove(int position) + { + //TODO проверка позиции + //TODO удаление объекта из массива, присвоив элементу массива значение null + + return true; + } + + //получение объекта из набора по позиции + public T Get(int position) + { + //TODO проверка позиции + + return _places[position]; + } + } +}