using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Artilleries { internal class MapWithSetArtilleriesGeneric 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 SetArtilleriesGeneric _setArtilleries; private readonly U _map; public MapWithSetArtilleriesGeneric(int picWidth, int picHeight, U map) { int width = picWidth / _placeSizeWidth; int height = picHeight / _placeSizeHeight; _setArtilleries = new SetArtilleriesGeneric(width * height); _pictureWidth = picWidth; _pictureHeight = picHeight; _map = map; } public static int operator +(MapWithSetArtilleriesGeneric map, T artillery) { return map._setArtilleries.Insert(artillery); } public static T operator -(MapWithSetArtilleriesGeneric map, int position) { return map._setArtilleries.Remove(position); } public Bitmap ShowSet() { Bitmap bmp = new(_pictureWidth, _pictureHeight); Graphics gr = Graphics.FromImage(bmp); DrawBackground(gr); DrawArtilleries(gr); return bmp; } public Bitmap ShowOnMap() { Shaking(); foreach (var artillery in _setArtilleries.GetArtilleries()) { return _map.CreateMap(_pictureWidth, _pictureHeight, artillery); } 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 = _setArtilleries.Count - 1; for (int i = 0; i < _setArtilleries.Count; i++) { if (_setArtilleries[i] == null) { for (; j > i; j--) { var car = _setArtilleries[j]; if (car != null) { _setArtilleries.Insert(car, i); _setArtilleries.Remove(j); break; } } if (j <= i) { return; } } } } private void DrawBackground(Graphics g) { Pen pen = new(Color.Black, 3); Brush boxBrush = new SolidBrush(Color.DarkGreen); Pen thinPen = new Pen(Color.Black, 2); Brush flagBrush = new SolidBrush(Color.Red); 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.FillRectangle(boxBrush, i * _placeSizeWidth + 5, j * _placeSizeHeight + _placeSizeHeight * 3 / 4 - 5, _placeSizeWidth / 3 - 5, _placeSizeHeight / 3 - 5); g.DrawLine(thinPen, i * _placeSizeWidth + 5, j * _placeSizeHeight + _placeSizeHeight * 3 / 4 - 5, i * _placeSizeWidth + _placeSizeWidth / 3, j * _placeSizeHeight + _placeSizeHeight * 3 / 4 + _placeSizeHeight / 3 - 10); g.DrawLine(thinPen, i * _placeSizeWidth + 5, j * _placeSizeHeight + _placeSizeHeight * 3 / 4 + _placeSizeHeight / 3 - 10, i * _placeSizeWidth + _placeSizeWidth / 3, j * _placeSizeHeight + _placeSizeHeight * 3 / 4 - 5); g.FillRectangle(flagBrush, i * _placeSizeWidth + _placeSizeWidth * 5 / 12, j * _placeSizeHeight + _placeSizeHeight * 5 / 8 - 5, _placeSizeWidth / 5, _placeSizeHeight / 5); g.DrawLine(thinPen, i * _placeSizeWidth + _placeSizeWidth * 5 / 12, j * _placeSizeHeight + _placeSizeHeight - 5, i * _placeSizeWidth + _placeSizeWidth * 5 / 12, j * _placeSizeHeight + _placeSizeHeight * 5 / 8 - 5); } g.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, (_pictureHeight / _placeSizeHeight) * _placeSizeHeight); } } private void DrawArtilleries(Graphics g) { int width = _pictureWidth / _placeSizeWidth; int height = _pictureHeight / _placeSizeHeight; int index = 0; foreach (var artillery in _setArtilleries.GetArtilleries()) { artillery.SetObject(index % width * _placeSizeWidth + 10, (height - 1 - index / width) * _placeSizeHeight + 10, _pictureWidth, _pictureHeight); artillery.DrawingObject(g); index++; } } public string GetData(char separatorType, char separatorData) { string data = $"{_map.GetType().Name}{separatorType}"; foreach (var artillery in _setArtilleries.GetArtilleries().Reverse()) { data += $"{artillery.GetInfo()}{separatorData}"; } return data; } public void LoadData(string[] records) { foreach (var record in records) { _setArtilleries.Insert(DrawingObjectArtillery.Create(record) as T); } } } }