diff --git a/Liner/Liner/MapWithSetShipsGeneric.cs b/Liner/Liner/MapWithSetShipsGeneric.cs new file mode 100644 index 0000000..624fa39 --- /dev/null +++ b/Liner/Liner/MapWithSetShipsGeneric.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Liner +{ + internal class MapWithSetShipsGeneric + where T : class, IDrawingObject + where U : AbstractMap + { + private readonly int _pictureWidth; + private readonly int _pictureHeight; + private readonly int _placeSizeWidth = 170; + private readonly int _placeSizeHeight = 90; + private readonly SetShipsGeneric _setShips; + private readonly U _map; + public MapWithSetShipsGeneric(int picWidth, int picHeight, U map) + { + int width = picWidth / _placeSizeWidth; + int height = picHeight / _placeSizeHeight; + _setShips = new SetShipsGeneric(width * height); + _pictureWidth = picWidth; + _pictureHeight = picHeight; + _map = map; + } + public static bool operator +(MapWithSetShipsGeneric map, T car) + { + if (map._setShips.Insert(car) == -1) + { + return false; + } + else + { + return true; + } + } + public static bool operator -(MapWithSetShipsGeneric map, int position) + { + if (map._setShips.Remove(position) == null) + { + return false; + } + else + { + return true; + } + } + public Bitmap ShowSet() + { + Bitmap bmp = new(_pictureWidth, _pictureHeight); + Graphics gr = Graphics.FromImage(bmp); + DrawBackground(gr); + DrawCars(gr); + return bmp; + } + public Bitmap ShowOnMap() + { + Shaking(); + for (int i = 0; i < _setShips.Count; i++) + { + var ship = _setShips.Get(i); + if (ship != null) + { + return _map.CreateMap(_pictureWidth, _pictureHeight, ship); + } + } + 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 = _setShips.Count - 1; + for (int i = 0; i < _setShips.Count; i++) + { + if (_setShips.Get(i) == null) + { + for (; j > i; j--) + { + var car = _setShips.Get(j); + if (car != null) + { + _setShips.Insert(car, i); + _setShips.Remove(j); + break; + } + } + if (j <= i) + { + return; + } + } + } + } + private void DrawBackground(Graphics g) + { + Pen pen = new(Color.Sienna, 3); + Brush brush = new SolidBrush(Color.DodgerBlue); + g.FillRectangle(brush, 0, 0, _pictureWidth, _pictureHeight); + 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 + 40, j * _placeSizeHeight); + } + g.DrawLine(pen, i * _placeSizeWidth, 0, i * _placeSizeWidth, (_pictureHeight / _placeSizeHeight) * _placeSizeHeight); + g.DrawLine(pen, i * _placeSizeWidth - 4, 0, i * _placeSizeWidth - 4, (_pictureHeight / _placeSizeHeight) * _placeSizeHeight); + } + } + private void DrawCars(Graphics g) + { + int widthEl = _pictureWidth / _placeSizeWidth; + int heightEl = _pictureHeight / _placeSizeHeight; + int curWidth = 1; + int curHeight = 0; + for (int i = 0; i < _setShips.Count; i++) + { + _setShips.Get(i)?.SetObject(_pictureWidth - _placeSizeWidth * curWidth - (_pictureWidth / 8), + curHeight * _placeSizeHeight + 10, _pictureWidth, _pictureHeight); + _setShips.Get(i)?.DrawningObject(g); + + if (curWidth < widthEl) + curWidth++; + else + { + curWidth = 1; + curHeight++; + } + if (curHeight > heightEl) + { + return; + } + + } + } + } +} diff --git a/Liner/Liner/SetShipsGeneric.cs b/Liner/Liner/SetShipsGeneric.cs new file mode 100644 index 0000000..e311083 --- /dev/null +++ b/Liner/Liner/SetShipsGeneric.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Liner +{ + internal class SetShipsGeneric + where T : class + { + private readonly T[] _places; + public int Count => _places.Length; + public SetShipsGeneric(int count) + { + _places = new T[count]; + } + public int Insert(T ship) + { + return Insert(ship, 0); + } + public int Insert(T ship, int position) + { + if (position >= _places.Length || position < 0) + { + return -1; + } + if (_places[position] == null) + { + _places[position] = ship; + return position; + } + int emptyIndex = -1; + for (int i = position + 1; i < _places.Length; i++) + { + if (_places[i] == null) + { + emptyIndex = i; + break; + } + } + if (emptyIndex < 0) + { + return -1; + } + for (int i = emptyIndex; i > position; i--) + { + _places[i] = _places[i - 1]; + } + _places[position] = ship; + return position; + } + public T Remove(int position) + { + if (position >= _places.Length || position < 0) + { + return null; + } + T ship = _places[position]; + _places[position] = null; + return ship; + } + public T Get(int position) + { + if (position >= _places.Length || position < 0) + { + return null; + } + return _places[position]; + } + } +} \ No newline at end of file