using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Catamaran { /// /// Карта с набром объектов под нее /// /// /// internal class MapWithSetBoatsGeneric where T : class, IDrawingObject where U : AbstractMap { /// /// Ширина окна отрисовки /// private readonly int _pictureWidth; /// /// Высота окна отрисовки /// private readonly int _pictureHeight; /// /// Размер занимаемого объектом места (ширина) /// private readonly int _placeSizeWidth = 210; /// /// Размер занимаемого объектом места (высота) /// private readonly int _placeSizeHeight = 90; /// /// Набор объектов /// private readonly SetBoatsGeneric _setBoats; /// /// Карта /// private readonly U _map; /// /// Конструктор /// /// /// /// public MapWithSetBoatsGeneric(int picWidth, int picHeight, U map) { int width = picWidth / _placeSizeWidth; int height = picHeight / _placeSizeHeight; _setBoats = new SetBoatsGeneric(width * height); _pictureWidth = picWidth; _pictureHeight = picHeight; _map = map; } /// /// Перегрузка оператора сложения /// /// /// /// public static int operator +(MapWithSetBoatsGeneric map, T Boat) { return map._setBoats.Insert(Boat); } /// /// Перегрузка оператора вычитания /// /// /// /// public static T operator -(MapWithSetBoatsGeneric map, int position) { return map._setBoats.Remove(position); } /// /// Вывод всего набора объектов /// /// public Bitmap ShowSet() { Bitmap bmp = new Bitmap(_pictureWidth, _pictureHeight); Graphics gr = Graphics.FromImage(bmp); DrawBackground(gr); DrawBoats(gr); return bmp; } /// /// Просмотр объекта на карте /// /// public Bitmap ShowOnMap() { Shaking(); foreach (var boat in _setBoats.GetBoats()) { return _map.CreateMap(_pictureWidth, _pictureHeight, boat); } return new Bitmap(_pictureWidth, _pictureHeight); } /// /// Перемещение объекта по крате /// /// /// public Bitmap MoveObject(Direction direction) { if (_map != null) { return _map.MoveObject(direction); } return new Bitmap(_pictureWidth, _pictureHeight); } /// /// "Взбалтываем" набор, чтобы все элементы оказались в начале /// private void Shaking() { int j = _setBoats.Count - 1; for (int i = 0; i < _setBoats.Count; i++) { if (_setBoats[i] == null) { for (; j > i; j--) { var Boat = _setBoats[j]; if (Boat != null) { _setBoats.Insert(Boat, i); _setBoats.Remove(j); break; } } if (j <= i) { return; } } } } /// /// Метод отрисовки фона /// /// private void DrawBackground(Graphics g) { Pen pen = new Pen(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); for (int k = 0; k < 7; k++) { g.DrawEllipse(pen, i * _placeSizeWidth + 15 * k, j * _placeSizeHeight, 15, 15); g.DrawEllipse(pen, i * _placeSizeWidth + 15 * k, j * _placeSizeHeight - 15, 15, 15); } } g.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, (_pictureHeight / _placeSizeHeight) * _placeSizeHeight); for (int k = 0; k < 6 * 4; k++) { g.DrawEllipse(pen, i * _placeSizeWidth, 0 + 15 * k, 15, 15); } } } /// /// Метод прорисовки объектов /// /// private void DrawBoats(System.Drawing.Graphics g) { int numberOfSeatsInWidth = _pictureWidth / _placeSizeWidth; int numberOfSeatsInHeight = _pictureHeight / _placeSizeHeight; int bottomLine = (numberOfSeatsInHeight - 1) * _placeSizeHeight; for (int i = 0; i < _setBoats.Count; i++) { // TODO установка позиции _setBoats[i]?.SetObject(i % numberOfSeatsInWidth * _placeSizeWidth, bottomLine - i / numberOfSeatsInWidth * _placeSizeHeight, _pictureWidth, _pictureHeight); _setBoats[i]?.DrawingObject(g); } } } }