diff --git a/ProjectCruiser/AbstractCompany.cs b/ProjectCruiser/AbstractCompany.cs new file mode 100644 index 0000000..e9b42e3 --- /dev/null +++ b/ProjectCruiser/AbstractCompany.cs @@ -0,0 +1,70 @@ +using ProjectCruiser.DrawningSamples; +namespace ProjectCruiser; + +/// Абстракция компании, хранящий коллекцию автомобилей +/// +public abstract class AbstractCompany +{ + // Размеры места + protected readonly int _placeSizeWidth = 312; // ширина + + protected readonly int _placeSizeHeight = 56; // высота + + // Ширина окна + protected readonly int _pictureWidth; + // Высота окна + protected readonly int _pictureHeight; + + // Коллекция автомобилей + protected ICollectionGenObj? _collection = null; + private int GetMaxCount => _pictureWidth * _pictureHeight / + (_placeSizeWidth * _placeSizeHeight); + + public AbstractCompany(int picWidth, int picHeight, + ICollectionGenObj? collection) + { + _pictureWidth = picWidth; + _pictureHeight = picHeight; + _collection = collection; + _collection.SetMaxCount = GetMaxCount; + } + + // Перегрузка оператора сложения для класса + // [ ! ] insted of bool: + public static int operator +(AbstractCompany cmp, + DrawningBase trasport) => (cmp._collection.Insert(trasport)); + + // Перегрузка оператора удаления для класса + public static DrawningBase operator -(AbstractCompany cmp, + int pos) => (cmp._collection.Remove(pos)); + + // Получение случайного объекта из коллекции + public DrawningBase? GetRandomObject() + { + Random rnd = new(); + return _collection?.GetItem(rnd.Next(GetMaxCount)); + } + + // Вывод всей коллекции + public Bitmap? Show() + { + Bitmap bitmap = new(_pictureWidth, _pictureHeight); + Graphics graphics = Graphics.FromImage(bitmap); + DrawBackground(graphics); + SetObjectsPosition(); + for (int i = 0; i < (_collection?.Count ?? 0); ++i) + { + DrawningBase? obj = _collection?.GetItem(i); + obj?.DrawTransport(graphics); + } + return bitmap; + } + + + // Вывод заднего фона + protected abstract void DrawBackground(Graphics g); + + // Расстановка объектов + protected abstract void SetObjectsPosition(); +} + diff --git a/ProjectCruiser/ArrayGenObj.cs b/ProjectCruiser/ArrayGenObj.cs new file mode 100644 index 0000000..a20cf25 --- /dev/null +++ b/ProjectCruiser/ArrayGenObj.cs @@ -0,0 +1,94 @@ +namespace ProjectCruiser; + +public class ArrayGenObj : ICollectionGenObj + where T : class +{ + // Массив объектов, которые храним + private T?[] _collection; + public int Count => _collection.Length; + public int SetMaxCount + { + set + { + if (value > 0) + { + if (_collection.Length > 0) Array.Resize(ref _collection, value); + else _collection = new T?[value]; + } + } + } + + // public int SetMaxCount { set { if (value > 0) { _collection = new T?[value]; } } } + + public ArrayGenObj() + { + _collection = Array.Empty(); + } + + // methods : + + public T? GetItem(int index) + { + if (index > Count || index < 0) + { + return null; + } + return _collection[index]; + } + + public int Insert(T? item) + { + // any empty place + for (int i = 0; i < Count; i++) + { + if (_collection[i] == null) + { + _collection[i] = item; + return i; + } + } + return -1; + } + + public int Insert(T? item, int index) + { + if (_collection[index] == null) + { + _collection[index] = item; + return index; + } + + else + { + int min_diff = 100, min_index = 100; + + for (int i = 0; i < Count; i++) + { + if (_collection[i] == null + && min_diff > Math.Abs(index - i)) + { + min_diff = Math.Abs(index - i); + min_index = i; + } + } + + _collection[min_index] = item; + return min_index; + } + + return -1; + } + + public T? Remove(int index) + { + T? item; + if (index < Count && index >= 0) + { + item = _collection[index]; + _collection[index] = null; + return item; + } + return null; + } +} + diff --git a/ProjectCruiser/DrawningSamples/DirectionType.cs b/ProjectCruiser/DrawningSamples/DirectionType.cs new file mode 100644 index 0000000..508a382 --- /dev/null +++ b/ProjectCruiser/DrawningSamples/DirectionType.cs @@ -0,0 +1,9 @@ +namespace ProjectCruiser.DrawningSamples; +public enum DirectionType +{ + Unknown = -1, + Up = 1, + Down = 2, + Left = 3, + Right = 4 +} \ No newline at end of file diff --git a/ProjectCruiser/DrawningSamples/DrawningBase.cs b/ProjectCruiser/DrawningSamples/DrawningBase.cs new file mode 100644 index 0000000..4b7884f --- /dev/null +++ b/ProjectCruiser/DrawningSamples/DrawningBase.cs @@ -0,0 +1,173 @@ +using ProjectCruiser.Entities; +namespace ProjectCruiser.DrawningSamples; +public class DrawningBase +{ + // Класс-сущность + public EntityBase? EntityTransport { get; protected set; } + private int? _pictureWidth; // Ширина окна + private int? _pictureHeight; // Высота окна + + protected int? _startPosX; // < protected + protected int? _startPosY; // < protected + + private readonly int _drawningWidth = 302; // Ширина прорисовки автомобиля + private readonly int _drawningHeight = 42; // Высота прорисовки автомобиля + + // Инициализация свойств (теперь через конструктор) + public DrawningBase(int speed, double weight, Color bodyColor) : this() + { + EntityTransport = new EntityBase(speed, weight, bodyColor); + } + + private DrawningBase() + { + _pictureWidth = null; + _pictureHeight = null; + _startPosX = null; + _startPosY = null; + } + + // protected > + protected DrawningBase(int drawningCarWidth, int drawningCarHeight) : this() + { + _drawningWidth = drawningCarWidth; + _pictureHeight = drawningCarHeight; + } + + public int getHeight() // для создания объекта в нижнем левом углу (*) + { + return _drawningHeight; + } + + // Установка границ поля + public bool SetPictureSize(int w, int h) + { + if (w < _drawningWidth || h < _drawningHeight) + // canvas always bigger then obj to fit it + { + return false; + } + + _pictureWidth = w; + _pictureHeight = h; + + if (_startPosX != null || _startPosY != null) + { + SetPosition(_startPosX.Value, _startPosY.Value); + } + + return true; + } + + public void SetPosition(int x, int y) + { + if (!_pictureHeight.HasValue || !_pictureWidth.HasValue) + { + return; + } + + if (x > _pictureWidth - _drawningWidth) _startPosX = + _pictureWidth - _drawningWidth; + else if (x < 0) _startPosX = 0; + else _startPosX = x; + + if (y > _pictureHeight - _drawningHeight) _startPosY = + _pictureHeight.Value - _drawningHeight; + else if (y < 0) _startPosY = 0; + else _startPosY = y; + } + + public bool MoveTransport(DirectionType direction) + { + if (EntityTransport == null || !_startPosX.HasValue || !_startPosY.HasValue) + { + return false; + } + + switch (direction) + { + //влево + case DirectionType.Left: + if (_startPosX.Value - EntityTransport.Step > 0) + { + _startPosX -= (int)EntityTransport.Step; + } + return true; + //вверх + case DirectionType.Up: + if (_startPosY.Value - EntityTransport.Step > 0) + { + _startPosY -= (int)EntityTransport.Step; + } + return true; + // вправо + case DirectionType.Right: + if (_startPosX.Value + _drawningWidth + EntityTransport.Step + < _pictureWidth.Value) + { + _startPosX += (int)EntityTransport.Step; + } + return true; + //вниз + case DirectionType.Down: + if (_startPosY.Value + _drawningHeight + EntityTransport.Step + < _pictureHeight.Value) + { + _startPosY += (int)EntityTransport.Step; + } + return true; + + default: + return false; + // Перемещение объекта (удалось перемещение - true \ false) + } + } + + public virtual void DrawTransport(Graphics g) // < virtual + { + if (EntityTransport == null || !_startPosX.HasValue || + !_startPosY.HasValue) + { + return; + } + + Pen pen = new(Color.Black, 2); + Brush mainBrush = new SolidBrush(EntityTransport.MainColor); + + //границы cruiser + Point point0 = new Point(_startPosX.Value + 2, _startPosY.Value + 7); + Point point1 = new Point(_startPosX.Value + 2, _startPosY.Value + 30); + Point point2 = new Point(_startPosX.Value + 184, _startPosY.Value + 42); + Point point3 = new Point(_startPosX.Value + 260, _startPosY.Value + 34); + Point point4 = new Point(_startPosX.Value + 300, _startPosY.Value + 22); + Point point5 = new Point(_startPosX.Value + 260, _startPosY.Value + 10); + Point point6 = new Point(_startPosX.Value + 184, _startPosY.Value + 2); + + Point[] boarders = { + point0, + point1, + point2, + point3, + point4, + point5, + point6 + }; + + g.DrawPolygon(pen, boarders); + g.FillPolygon(mainBrush, boarders); + + // салон на верхней палубе + int y_h = EntityTransport.values[1]; + g.DrawRectangle(pen, _startPosX.Value + 100, _startPosY.Value + y_h, 38, 24); + g.DrawRectangle(pen, _startPosX.Value + 110, _startPosY.Value + y_h + 6, 20, 12); + g.FillRectangle(mainBrush, _startPosX.Value + 110, _startPosY.Value + y_h + 6, 20, 12); + g.DrawRectangle(pen, _startPosX.Value + 117, _startPosY.Value + y_h + 18, 6, 20); + g.FillRectangle(mainBrush, _startPosX.Value + 117, _startPosY.Value + y_h + 18, 6, 20); + } + + public int? GetPosX => _startPosX; + public int? GetPosY => _startPosY; + public int GetWidth => _drawningWidth; + public int GetHeight => _drawningHeight; +} + diff --git a/ProjectCruiser/DrawningSamples/DrawningCruiser.cs b/ProjectCruiser/DrawningSamples/DrawningCruiser.cs new file mode 100644 index 0000000..4f3f56e --- /dev/null +++ b/ProjectCruiser/DrawningSamples/DrawningCruiser.cs @@ -0,0 +1,46 @@ +using System.Drawing.Drawing2D; +using ProjectCruiser.Entities; +namespace ProjectCruiser.DrawningSamples; + +public class DrawningCruiser : DrawningBase +{ + // Инициализация свойств (все параметры класса (сущности)) + public DrawningCruiser(int speed, double weight, Color bodyColor, + Color additionalColor, bool hangars) : base(302, 42) + // all additional featchures 'inside' object, so size remains + { + EntityTransport = new EntityCruiser(speed, weight, + bodyColor, additionalColor, hangars); + } + + public override void DrawTransport(Graphics g) + { + if (EntityTransport == null || EntityTransport is not EntityCruiser ship || + !_startPosX.HasValue || !_startPosY.HasValue) // [ !!! ] :O + { + return; + } + + Pen pen = new(Color.Black, 2); + Brush PadBrush = new HatchBrush(HatchStyle.DottedDiamond, Color.LightGray, Color.Black); + Brush additionalBrush = new SolidBrush(ship.AdditionalColor); + + //границы cruiser <...> + // & + // салон на верхней палубе : + + base.DrawTransport(g); + + // вертолетная площадка - default TRUE now + g.DrawEllipse(pen, _startPosX.Value + 170, _startPosY.Value + 11, 20, 20); + g.FillEllipse(PadBrush, _startPosX.Value + 170, _startPosY.Value + 11, 20, 20); + + // ангар(ы) + if (ship.Hangars) + { + g.FillRectangle(additionalBrush, _startPosX.Value + 80, _startPosY.Value + 10, 10, 20); + g.FillRectangle(additionalBrush, _startPosX.Value + 70, _startPosY.Value + 12, 8, 12); + } + else g.FillRectangle(additionalBrush, _startPosX.Value + 250, _startPosY.Value + 20, 14, 7); + } +} diff --git a/ProjectCruiser/Entities/EntityBase.cs b/ProjectCruiser/Entities/EntityBase.cs new file mode 100644 index 0000000..f9aac46 --- /dev/null +++ b/ProjectCruiser/Entities/EntityBase.cs @@ -0,0 +1,27 @@ +namespace ProjectCruiser.Entities; + +public class EntityBase +{ + // свойства + public int Speed { get; private set; } // скорость + public double Weight { get; private set; } // вес + public Color MainColor { get; private set; } // основной цвет + + // public bool Deckhouse { get; private set; } // салон на верхней палубе + public double Step => Speed * 100 / Weight; + + public int[] values = { 0, 0, 0 }; + + public EntityBase(int speed, double weight, Color mainc) + // (bool) deckhouse -> default TRUE now + { + Random rn = new(); + Speed = speed; + Weight = weight; + MainColor = mainc; + // Deckhouse = deckhouse; + values[0] = rn.Next(1, 4); + values[1] = rn.Next(5, 10); + values[2] = rn.Next(1, 3); + } +} diff --git a/ProjectCruiser/Entities/EntityCruiser.cs b/ProjectCruiser/Entities/EntityCruiser.cs new file mode 100644 index 0000000..514f8e8 --- /dev/null +++ b/ProjectCruiser/Entities/EntityCruiser.cs @@ -0,0 +1,19 @@ +namespace ProjectCruiser.Entities; + +public class EntityCruiser : EntityBase +{ + public Color AdditionalColor { get; private set; } // доп. цвет + + // признаки (наличия) + public bool HelicopterPads { get; private set; } // вертолетная площадка + public bool Hangars { get; private set; } // ангар + + public EntityCruiser(int speed, double weight, Color mainc, + Color additionalColor, bool hangars) + : base(speed, weight, mainc) + { + AdditionalColor = additionalColor; + // HelicopterPads = pads; - default TRUE now for Advanced obj + Hangars = hangars; + } +} diff --git a/ProjectCruiser/ICollectionGenObj.cs b/ProjectCruiser/ICollectionGenObj.cs new file mode 100644 index 0000000..9012d74 --- /dev/null +++ b/ProjectCruiser/ICollectionGenObj.cs @@ -0,0 +1,24 @@ +namespace ProjectCruiser; + +public interface ICollectionGenObj where T : class +{ + // Кол-во объектов в коллекции + int Count { get; } + + // Установка max кол-ва элементов + int SetMaxCount { set; } + + /// Добавление объекта в коллекцию + /// Добавляемый объект + /// true - вставка прошла удачно, false - вставка не удалась + int Insert(T obj); + int Insert(T obj, int position); + + /// Удаление объекта из коллекции с конкретной позиции + /// Позиция + /// true - удаление прошло удачно, false - удаление не удалось + T? Remove(int position); + + // Получение объекта по позиции + T? GetItem(int position); +} diff --git a/ProjectCruiser/MoveStrategy/AbstractStrategy.cs b/ProjectCruiser/MoveStrategy/AbstractStrategy.cs new file mode 100644 index 0000000..e2004ba --- /dev/null +++ b/ProjectCruiser/MoveStrategy/AbstractStrategy.cs @@ -0,0 +1,88 @@ +namespace ProjectCruiser.MoveStrategy; + +public abstract class AbstractStrategy +{ + // Перемещаемый объект + private IMoveableObj? _moveableObject; + + // Статус перемещения (default установка) + private StrategyStatus _state = StrategyStatus.NotInit; + + // Ширина поля + protected int FieldWidth { get; private set; } + + // Высота поля + protected int FieldHeight { get; private set; } + + // Получение статуса + public StrategyStatus GetStatus() { return _state; } + + // Установка данных + public void SetData(IMoveableObj moveableObject, int width, int height) + { + if (moveableObject == null) + { + _state = StrategyStatus.NotInit; + return; + } + _state = StrategyStatus.InProgress; + _moveableObject = moveableObject; + FieldWidth = width; + FieldHeight = height; + } + + // Шаг перемещения + public void MakeStep() + { + if (_state != StrategyStatus.InProgress) + { + return; + } + if (IsTargetDestination()) + { + _state = StrategyStatus.Finish; + return; + } + MoveToTarget(); + } + + // Результаты перемещения + protected bool MoveLeft() => MoveTo(MovementDirection.Left); + protected bool MoveRight() => MoveTo(MovementDirection.Right); + protected bool MoveUp() => MoveTo(MovementDirection.Up); + protected bool MoveDown() => MoveTo(MovementDirection.Down); + + + // Параметры объекта + protected ObjParameters? GetObjectParameters => + _moveableObject?.GetObjectPosition; + + // Шаг объекта + protected int? GetStep() + { + if (_state != StrategyStatus.InProgress) + { + return null; + } + return _moveableObject?.GetStep; + } + + // Перемещение к цели + protected abstract void MoveToTarget(); + + // Проверка, достигнута ли цель + protected abstract bool IsTargetDestination(); + + + /// Попытка перемещения в требуемом направлении + /// Направление + /// Результат попытки (true - удалось переместиться, false - неудача) + private bool MoveTo(MovementDirection movementDirection) + { + if (_state != StrategyStatus.InProgress) + { + return false; + } + return _moveableObject?.TryMoveObject(movementDirection) ?? false; + } +} diff --git a/ProjectCruiser/MoveStrategy/IMoveableObj.cs b/ProjectCruiser/MoveStrategy/IMoveableObj.cs new file mode 100644 index 0000000..3af89c4 --- /dev/null +++ b/ProjectCruiser/MoveStrategy/IMoveableObj.cs @@ -0,0 +1,16 @@ +namespace ProjectCruiser.MoveStrategy; + +// Интерфейс для работы с перемещаемым объектом +public interface IMoveableObj +{ + // Получение координат объекта + ObjParameters? GetObjectPosition { get; } + + // Получение шага объекта + int GetStep { get; } + + /// Попытка переместить объект в указанном направлении + /// Направление + /// true - объект перемещен, false - перемещение невозможно + bool TryMoveObject(MovementDirection direction); +} diff --git a/ProjectCruiser/MoveStrategy/MoveToBorder.cs b/ProjectCruiser/MoveStrategy/MoveToBorder.cs new file mode 100644 index 0000000..22137e2 --- /dev/null +++ b/ProjectCruiser/MoveStrategy/MoveToBorder.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectCruiser.MoveStrategy; + +public class MoveToBorder : AbstractStrategy +{ + protected override bool IsTargetDestination() + { + ObjParameters? objP = GetObjectParameters; + if (objP == null) + { + return false; + } + + return FieldWidth - GetStep() < objP.RightBorder + && FieldHeight - GetStep() < objP.DownBorder; + } + + protected override void MoveToTarget() + { + ObjParameters? objP = GetObjectParameters; + if (objP == null) + { + return; + } + + int s = (int)GetStep(); + + int diffx = objP.RightBorder - FieldWidth; + if (Math.Abs(diffx) > GetStep()) + { + if (diffx > 0) + { + MoveLeft(); + } + else { MoveRight(); } + } + + int diffy = objP.DownBorder - FieldHeight; // (... - s) - step unnecessary + if (Math.Abs(diffy) > GetStep()) + { + if (diffy > 0) + { + MoveUp(); + } + else { MoveDown(); } + } + } +} diff --git a/ProjectCruiser/MoveStrategy/MoveToCentre.cs b/ProjectCruiser/MoveStrategy/MoveToCentre.cs new file mode 100644 index 0000000..493cee5 --- /dev/null +++ b/ProjectCruiser/MoveStrategy/MoveToCentre.cs @@ -0,0 +1,50 @@ +namespace ProjectCruiser.MoveStrategy; + +public class MoveToCentre : AbstractStrategy +{ + protected override bool IsTargetDestination() + { + ObjParameters? objP = GetObjectParameters; + if (objP == null) + { + return false; + } + + return objP.ObjectMiddleHorizontal - GetStep() + <= FieldWidth / 2 && objP.ObjectMiddleHorizontal + + GetStep() >= FieldWidth / 2 + + && objP.ObjectMiddleVertical - GetStep() + <= FieldHeight / 2 && objP.ObjectMiddleVertical + + GetStep() >= FieldHeight / 2; + } + + protected override void MoveToTarget() + { + ObjParameters? objP = GetObjectParameters; + if (objP == null) + { + return; + } + + int diffx = objP.ObjectMiddleHorizontal - FieldWidth / 2; + if (Math.Abs(diffx) > GetStep()) + { + if (diffx > 0) + { + MoveLeft(); + } + else { MoveRight(); } + } + + int diffy = objP.ObjectMiddleVertical - FieldHeight / 2; + if (Math.Abs(diffy) > GetStep()) + { + if (diffy > 0) + { + MoveUp(); + } + else { MoveDown(); } + } + } +} diff --git a/ProjectCruiser/MoveStrategy/MoveableTransport.cs b/ProjectCruiser/MoveStrategy/MoveableTransport.cs new file mode 100644 index 0000000..aab74a4 --- /dev/null +++ b/ProjectCruiser/MoveStrategy/MoveableTransport.cs @@ -0,0 +1,56 @@ +using ProjectCruiser.DrawningSamples; + +namespace ProjectCruiser.MoveStrategy; + +// Класс-реализация IMoveableObject с использованием DrawningBase +public class MoveableTransport : IMoveableObj +{ + // Поле-объект класса Drawning(Transport) или его наследника + private readonly DrawningBase? _car = null; + + public MoveableTransport(DrawningBase car) + { + _car = car; + } + + public ObjParameters? GetObjectPosition + { + get + { + if (_car == null || _car.EntityTransport == null || + !_car.GetPosX.HasValue || !_car.GetPosY.HasValue) + { + return null; + } + return new ObjParameters(_car.GetPosX.Value, + _car.GetPosY.Value, _car.GetWidth, _car.GetHeight); + } + } + + public int GetStep => (int)(_car?.EntityTransport?.Step ?? 0); + + public bool TryMoveObject(MovementDirection direction) + { + if (_car == null || _car.EntityTransport == null) + { + return false; + } + return _car.MoveTransport(GetDirectionType(direction)); + } + + /// Конвертация из MovementDirection в DirectionType + /// MovementDirection + /// DirectionType + private static DirectionType GetDirectionType(MovementDirection direction) + { + return direction switch + { + MovementDirection.Left => DirectionType.Left, + MovementDirection.Right => DirectionType.Right, + MovementDirection.Up => DirectionType.Up, + MovementDirection.Down => DirectionType.Down, + _ => DirectionType.Unknown, + }; + } +} + diff --git a/ProjectCruiser/MoveStrategy/MovementDirection.cs b/ProjectCruiser/MoveStrategy/MovementDirection.cs new file mode 100644 index 0000000..9404d45 --- /dev/null +++ b/ProjectCruiser/MoveStrategy/MovementDirection.cs @@ -0,0 +1,10 @@ +namespace ProjectCruiser.MoveStrategy; + +// Направление перемещения +public enum MovementDirection +{ + Up = 1, + Down = 2, + Left = 3, + Right = 4 +} diff --git a/ProjectCruiser/MoveStrategy/ObjParameters.cs b/ProjectCruiser/MoveStrategy/ObjParameters.cs new file mode 100644 index 0000000..428f1eb --- /dev/null +++ b/ProjectCruiser/MoveStrategy/ObjParameters.cs @@ -0,0 +1,29 @@ +namespace ProjectCruiser.MoveStrategy; + +// Параметры-координаты объекта +public class ObjParameters +{ + private readonly int _x; + private readonly int _y; + + private readonly int _width; // Ширина объекта + private readonly int _height; // Высота объекта + + public int LeftBorder => _x; // Левая граница + public int TopBorder => _y; // Верхняя граница + public int RightBorder => _x + _width; // Правая граница + public int DownBorder => _y + _height; // Нижняя граница + + // Вертикальная середина объекта + public int ObjectMiddleHorizontal => _x + _width / 2; + // Горизонтальная середина объекта + public int ObjectMiddleVertical => _y + _height / 2; + + public ObjParameters(int x, int y, int width, int height) + { + _x = x; + _y = y; + _width = width; + _height = height; + } +} diff --git a/ProjectCruiser/MoveStrategy/StrategyStatus.cs b/ProjectCruiser/MoveStrategy/StrategyStatus.cs new file mode 100644 index 0000000..d2d7608 --- /dev/null +++ b/ProjectCruiser/MoveStrategy/StrategyStatus.cs @@ -0,0 +1,13 @@ +namespace ProjectCruiser.MoveStrategy; + +// Статус выполнения операции перемещения +public enum StrategyStatus +{ + // готово к началу + NotInit, + // Выполняется + InProgress, + // Завершено + Finish +} + diff --git a/ProjectCruiser/OceanForm1.Designer.cs b/ProjectCruiser/OceanForm1.Designer.cs new file mode 100644 index 0000000..611ed06 --- /dev/null +++ b/ProjectCruiser/OceanForm1.Designer.cs @@ -0,0 +1,152 @@ +namespace ProjectCruiser; +partial class OceanForm1 +{ + /// Required designer variable. + private System.ComponentModel.IContainer components = null; + + /// Clean up any resources being used. + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + private void InitializeComponent() + { + btnLeftArrow = new Button(); + btnDownArrow = new Button(); + btnRightArrow = new Button(); + btnUpArrow = new Button(); + btnCreateBase = new Button(); + pictureBoxCr = new PictureBox(); + comboBoxStrategy = new ComboBox(); + btnCreateAdvanced = new Button(); + btnActivateStrategy = new Button(); + ((System.ComponentModel.ISupportInitialize)pictureBoxCr).BeginInit(); + SuspendLayout(); + // + // btnLeftArrow + // + btnLeftArrow.Location = new Point(926, 445); + btnLeftArrow.Name = "btnLeftArrow"; + btnLeftArrow.Size = new Size(141, 132); + btnLeftArrow.TabIndex = 0; + btnLeftArrow.UseVisualStyleBackColor = true; + btnLeftArrow.Click += BtnMove_Click; + // + // btnDownArrow + // + btnDownArrow.Location = new Point(1073, 445); + btnDownArrow.Name = "btnDownArrow"; + btnDownArrow.Size = new Size(141, 132); + btnDownArrow.TabIndex = 1; + btnDownArrow.UseVisualStyleBackColor = true; + btnDownArrow.Click += BtnMove_Click; + // + // btnRightArrow + // + btnRightArrow.Location = new Point(1220, 445); + btnRightArrow.Name = "btnRightArrow"; + btnRightArrow.Size = new Size(141, 132); + btnRightArrow.TabIndex = 2; + btnRightArrow.UseVisualStyleBackColor = true; + btnRightArrow.Click += BtnMove_Click; + // + // btnUpArrow + // + btnUpArrow.Location = new Point(1073, 307); + btnUpArrow.Name = "btnUpArrow"; + btnUpArrow.Size = new Size(141, 132); + btnUpArrow.TabIndex = 3; + btnUpArrow.UseVisualStyleBackColor = true; + btnUpArrow.Click += BtnMove_Click; + // + // btnCreateBase + // + btnCreateBase.Location = new Point(928, 12); + btnCreateBase.Name = "btnCreateBase"; + btnCreateBase.Size = new Size(433, 46); + btnCreateBase.TabIndex = 4; + btnCreateBase.Text = "Create base object"; + btnCreateBase.UseVisualStyleBackColor = true; + btnCreateBase.Click += btnCreateBase_Click; + // + // pictureBoxCr + // + pictureBoxCr.Dock = DockStyle.Fill; + pictureBoxCr.Location = new Point(0, 0); + pictureBoxCr.Name = "pictureBoxCr"; + pictureBoxCr.Size = new Size(1375, 778); + pictureBoxCr.TabIndex = 5; + pictureBoxCr.TabStop = false; + // + // comboBoxStrategy + // + comboBoxStrategy.FormattingEnabled = true; + comboBoxStrategy.Items.AddRange(new object[] { "centre", "border" }); + comboBoxStrategy.Location = new Point(928, 120); + comboBoxStrategy.Name = "comboBoxStrategy"; + comboBoxStrategy.Size = new Size(435, 40); + comboBoxStrategy.TabIndex = 6; + // + // btnCreateAdvanced + // + btnCreateAdvanced.Location = new Point(928, 58); + btnCreateAdvanced.Name = "btnCreateAdvanced"; + btnCreateAdvanced.Size = new Size(433, 46); + btnCreateAdvanced.TabIndex = 7; + btnCreateAdvanced.Text = "Create advanced object"; + btnCreateAdvanced.UseVisualStyleBackColor = true; + btnCreateAdvanced.Click += btnCreateAdvanced_Click; + // + // btnActivateStrategy + // + btnActivateStrategy.Location = new Point(928, 166); + btnActivateStrategy.Name = "btnActivateStrategy"; + btnActivateStrategy.Size = new Size(435, 46); + btnActivateStrategy.TabIndex = 8; + btnActivateStrategy.Text = "Activate path"; + btnActivateStrategy.UseVisualStyleBackColor = true; + btnActivateStrategy.Click += ButtonStrategyStep_Click; + // + // OceanForm1 + // + AutoScaleDimensions = new SizeF(13F, 32F); + AutoScaleMode = AutoScaleMode.Font; + BackColor = Color.Turquoise; + ClientSize = new Size(1375, 778); + Controls.Add(btnActivateStrategy); + Controls.Add(btnCreateAdvanced); + Controls.Add(comboBoxStrategy); + Controls.Add(btnCreateBase); + Controls.Add(btnUpArrow); + Controls.Add(btnRightArrow); + Controls.Add(btnDownArrow); + Controls.Add(btnLeftArrow); + Controls.Add(pictureBoxCr); + Name = "OceanForm1"; + Text = "OceanForm1"; + ((System.ComponentModel.ISupportInitialize)pictureBoxCr).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Button btnLeftArrow; + private Button btnDownArrow; + private Button btnRightArrow; + private Button btnUpArrow; + private Button btnCreateBase; + private PictureBox pictureBoxCr; + private ComboBox comboBoxStrategy; + private Button btnCreateAdvanced; + private Button btnActivateStrategy; +} \ No newline at end of file diff --git a/ProjectCruiser/OceanForm1.cs b/ProjectCruiser/OceanForm1.cs new file mode 100644 index 0000000..e8b217f --- /dev/null +++ b/ProjectCruiser/OceanForm1.cs @@ -0,0 +1,156 @@ +using ProjectCruiser.DrawningSamples; +using ProjectCruiser.MoveStrategy; + +namespace ProjectCruiser +{ + public partial class OceanForm1 : Form + { + // Поле-объект для прорисовки объекта + private DrawningBase? _drawningCruiser; + + // Стратегия перемещения + private AbstractStrategy? _strategy; + + // Получение объекта + public DrawningBase SetShip + { + set + { + _drawningCruiser = value; + _drawningCruiser.SetPictureSize(pictureBoxCr.Width, pictureBoxCr.Height); + comboBoxStrategy.Enabled = true; + _strategy = null; + Draw(); + } + } + + public OceanForm1() + { + InitializeComponent(); + _strategy = null; + } + + // Метод прорисовки transport + private void Draw() + { + if (_drawningCruiser == null) + { + return; + } + Bitmap bmp = new(pictureBoxCr.Width, pictureBoxCr.Height); + Graphics gr = Graphics.FromImage(bmp); + _drawningCruiser.DrawTransport(gr); + pictureBoxCr.Image = bmp; + } + + // Обработка нажатия кнопок "Create(...)" + + private void btnCreateBase_Click(object sender, EventArgs e) => + CreateObject(nameof(DrawningBase)); + + private void btnCreateAdvanced_Click(object sender, EventArgs e) => + CreateObject(nameof(DrawningCruiser)); + + // Создание объекта класса-перемещения + /// Тип создаваемого объекта + private void CreateObject(string type) + { + Random random = new(); + switch (type) + { + case nameof(DrawningBase): + _drawningCruiser = new DrawningBase(random.Next(100, 300), random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256))); + break; + + case nameof(DrawningCruiser): + _drawningCruiser = new DrawningCruiser( + random.Next(100, 300), random.Next(1000, 3000), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)), + Convert.ToBoolean(random.Next(0, 2))); + break; + + default: + return; + } + + _drawningCruiser.SetPictureSize(pictureBoxCr.Width, pictureBoxCr.Height); + _drawningCruiser.SetPosition(random.Next(10, 100), + pictureBoxCr.Height - random.Next(10, 100) - _drawningCruiser.getHeight()); + + _strategy = null; + comboBoxStrategy.Enabled = true; + Draw(); + } + + private void BtnMove_Click(object sender, EventArgs e) + { + if (_drawningCruiser == null) + { + return; + } + string name = ((Button)sender)?.Name ?? string.Empty; + bool result = false; + switch (name) + { + case "btnUpArrow": + result = + _drawningCruiser.MoveTransport(DirectionType.Up); + break; + case "btnDownArrow": + result = + _drawningCruiser.MoveTransport(DirectionType.Down); + break; + case "btnLeftArrow": + result = + _drawningCruiser.MoveTransport(DirectionType.Left); + break; + case "btnRightArrow": + result = + _drawningCruiser.MoveTransport(DirectionType.Right); + break; + } + if (result) + { + Draw(); + } + } + + private void ButtonStrategyStep_Click(object sender, EventArgs e) + { + if (_drawningCruiser == null) + { + return; + } + if (comboBoxStrategy.Enabled) + { + _strategy = comboBoxStrategy.SelectedIndex switch + { + 0 => new MoveToCentre(), + 1 => new MoveToBorder(), + _ => null, + }; + if (_strategy == null) + { + return; + } + _strategy.SetData(new MoveableTransport(_drawningCruiser), + pictureBoxCr.Width, pictureBoxCr.Height); + } + if (_strategy == null) + { + return; + } + comboBoxStrategy.Enabled = false; + _strategy.MakeStep(); + Draw(); + + if (_strategy.GetStatus() == StrategyStatus.Finish) + { + comboBoxStrategy.Enabled = true; + _strategy = null; + } + } + } +} diff --git a/ProjectCruiser/OceanForm1.resx b/ProjectCruiser/OceanForm1.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectCruiser/OceanForm1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectCruiser/Program.cs b/ProjectCruiser/Program.cs index 2ddf3fc..faeb072 100644 --- a/ProjectCruiser/Program.cs +++ b/ProjectCruiser/Program.cs @@ -11,7 +11,8 @@ namespace ProjectCruiser // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new Form1()); + Application.Run(new ServiceForm2()); + // -> OceanForm1() inside* } } } \ No newline at end of file diff --git a/ProjectCruiser/ServiceForm2.Designer.cs b/ProjectCruiser/ServiceForm2.Designer.cs new file mode 100644 index 0000000..8990b79 --- /dev/null +++ b/ProjectCruiser/ServiceForm2.Designer.cs @@ -0,0 +1,173 @@ +namespace ProjectCruiser +{ + partial class ServiceForm2 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + comboBoxArrList = new ComboBox(); + btnAddBase = new Button(); + groupBox = new GroupBox(); + btnUpdate = new Button(); + btnTest = new Button(); + btnDelete = new Button(); + maskedTextBoxPosition = new MaskedTextBox(); + btnAddCruiser = new Button(); + pictureBox = new PictureBox(); + groupBox.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)pictureBox).BeginInit(); + SuspendLayout(); + // + // comboBoxArrList + // + comboBoxArrList.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + comboBoxArrList.FormattingEnabled = true; + comboBoxArrList.Items.AddRange(new object[] { "Storage" }); + comboBoxArrList.Location = new Point(17, 54); + comboBoxArrList.Name = "comboBoxArrList"; + comboBoxArrList.Size = new Size(268, 40); + comboBoxArrList.TabIndex = 0; + comboBoxArrList.SelectedIndexChanged += SelectorCompany_SelectedIndexChanged; + // + // btnAddBase + // + btnAddBase.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + btnAddBase.Location = new Point(17, 561); + btnAddBase.Name = "btnAddBase"; + btnAddBase.Size = new Size(268, 46); + btnAddBase.TabIndex = 1; + btnAddBase.Text = "Add ship"; + btnAddBase.UseVisualStyleBackColor = true; + btnAddBase.Click += btnAddBase_Click; + // + // groupBox + // + groupBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + groupBox.Controls.Add(btnUpdate); + groupBox.Controls.Add(btnTest); + groupBox.Controls.Add(btnDelete); + groupBox.Controls.Add(maskedTextBoxPosition); + groupBox.Controls.Add(btnAddCruiser); + groupBox.Controls.Add(btnAddBase); + groupBox.Controls.Add(comboBoxArrList); + groupBox.Location = new Point(1437, 12); + groupBox.Name = "groupBox"; + groupBox.Size = new Size(300, 938); + groupBox.TabIndex = 2; + groupBox.TabStop = false; + groupBox.Text = "Tool panel"; + // + // btnUpdate + // + btnUpdate.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + btnUpdate.Location = new Point(17, 865); + btnUpdate.Name = "btnUpdate"; + btnUpdate.Size = new Size(268, 46); + btnUpdate.TabIndex = 6; + btnUpdate.Text = "Update"; + btnUpdate.UseVisualStyleBackColor = true; + btnUpdate.Click += btnRefresh_Click; + // + // btnTest + // + btnTest.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + btnTest.Location = new Point(17, 795); + btnTest.Name = "btnTest"; + btnTest.Size = new Size(268, 64); + btnTest.TabIndex = 5; + btnTest.Text = "Choose for testing"; + btnTest.UseVisualStyleBackColor = true; + btnTest.Click += btnChooseforTest_Click; + // + // btnDelete + // + btnDelete.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + btnDelete.Location = new Point(17, 732); + btnDelete.Name = "btnDelete"; + btnDelete.Size = new Size(268, 46); + btnDelete.TabIndex = 4; + btnDelete.Text = "Delete"; + btnDelete.UseVisualStyleBackColor = true; + btnDelete.Click += btnRemoveCar_Click; + // + // maskedTextBoxPosition + // + maskedTextBoxPosition.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + maskedTextBoxPosition.Location = new Point(17, 682); + maskedTextBoxPosition.Mask = "00"; + maskedTextBoxPosition.Name = "maskedTextBoxPosition"; + maskedTextBoxPosition.Size = new Size(268, 39); + maskedTextBoxPosition.TabIndex = 3; + maskedTextBoxPosition.ValidatingType = typeof(int); + // + // btnAddCruiser + // + btnAddCruiser.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + btnAddCruiser.Location = new Point(17, 613); + btnAddCruiser.Name = "btnAddCruiser"; + btnAddCruiser.Size = new Size(268, 46); + btnAddCruiser.TabIndex = 2; + btnAddCruiser.Text = "Add cruiser"; + btnAddCruiser.UseVisualStyleBackColor = true; + btnAddCruiser.Click += btnAddAdvanced_Click; + // + // pictureBox + // + pictureBox.Dock = DockStyle.Left; + pictureBox.Location = new Point(0, 0); + pictureBox.Name = "pictureBox"; + pictureBox.Size = new Size(1417, 959); + pictureBox.TabIndex = 3; + pictureBox.TabStop = false; + // + // ServiceForm2 + // + AutoScaleDimensions = new SizeF(13F, 32F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1749, 959); + Controls.Add(pictureBox); + Controls.Add(groupBox); + Name = "ServiceForm2"; + Text = "ServiceForm2"; + groupBox.ResumeLayout(false); + groupBox.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)pictureBox).EndInit(); + ResumeLayout(false); + } + + #endregion + + private ComboBox comboBoxArrList; + private Button btnAddBase; + private GroupBox groupBox; + private Button btnAddCruiser; + private Button btnUpdate; + private Button btnTest; + private Button btnDelete; + private MaskedTextBox maskedTextBoxPosition; + private PictureBox pictureBox; + } +} \ No newline at end of file diff --git a/ProjectCruiser/ServiceForm2.cs b/ProjectCruiser/ServiceForm2.cs new file mode 100644 index 0000000..b17ae80 --- /dev/null +++ b/ProjectCruiser/ServiceForm2.cs @@ -0,0 +1,138 @@ +using System.Windows.Forms; +using ProjectCruiser.DrawningSamples; +namespace ProjectCruiser; + +public partial class ServiceForm2 : Form +{ + // Компания + private AbstractCompany? _company; + public ServiceForm2() + { + InitializeComponent(); + _company = null; + } + + // Выбор компании + private void SelectorCompany_SelectedIndexChanged(object sender, EventArgs e) + { + switch (comboBoxArrList.Text) + { + case "Storage": + _company = new ShipSharingService(pictureBox.Width, pictureBox.Height, + new ArrayGenObj()); + break; + } + } + + // Color picker + private static Color pickColor(Random r) + { + Color cl = Color.FromArgb(r.Next(0, 256), r.Next(0, 256), r.Next(0, 256)); + ColorDialog dialog = new(); + + if (dialog.ShowDialog() == DialogResult.OK) + { cl = dialog.Color; } + + return cl; + } + + // Добавление обычного корабля + private void btnAddBase_Click(object sender, EventArgs e) => + CreateObject(nameof(DrawningBase)); + + // Добавление продвинутого + private void btnAddAdvanced_Click(object sender, EventArgs e) => + CreateObject(nameof(DrawningCruiser)); + + // Создание объекта класса-перемещения + private void CreateObject(string type) + { + if (_company == null) + { + return; + } + Random random = new(); + DrawningBase drawningCar; + + switch (type) + { + case nameof(DrawningBase): + drawningCar = new DrawningBase(random.Next(100, 300), + random.Next(1000, 3000), pickColor(random)); + break; + + case nameof(DrawningCruiser): + // (TODO) вызов диалогового окна для выбора цвета >>> + drawningCar = new DrawningCruiser(random.Next(100, 300), + random.Next(1000, 3000), pickColor(random), pickColor(random), + Convert.ToBoolean(random.Next(0, 2))); + break; + default: + return; + } + if (_company + drawningCar != -1) + { + MessageBox.Show("> Object was added"); + pictureBox.Image = _company.Show(); + } + else + { + MessageBox.Show("[!] Failed to add object"); + } + } + + // Удаление объекта + private void btnRemoveCar_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(maskedTextBoxPosition.Text) + || _company == null) return; + + if (MessageBox.Show("[*] Remove object: Are you sure?", "Remove", + MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) return; + int pos = Convert.ToInt32(maskedTextBoxPosition.Text); + + if (_company - Convert.ToInt32(maskedTextBoxPosition.Text) != null) + { + MessageBox.Show("> Object was removed"); + pictureBox.Image = _company.Show(); + } + else MessageBox.Show("[!] Failed to remove object"); + } + + // Передача объекта в другую форму + private void btnChooseforTest_Click(object sender, EventArgs e) + { + if (_company == null) + { + return; + } + DrawningBase? car = null; + int counter = 100; + while (car == null) + { + car = _company.GetRandomObject(); + counter--; + if (counter <= 0) + { + break; + } + } + if (car == null) + { + return; + } + + OceanForm1 form = new() { SetShip = car }; + form.ShowDialog(); + } + + // Перерисовка коллекции + private void btnRefresh_Click(object sender, EventArgs e) + { + if (_company == null) + { + return; + } + pictureBox.Image = _company.Show(); + } +} diff --git a/ProjectCruiser/ServiceForm2.resx b/ProjectCruiser/ServiceForm2.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectCruiser/ServiceForm2.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectCruiser/ShipSharingService.cs b/ProjectCruiser/ShipSharingService.cs new file mode 100644 index 0000000..e0098d4 --- /dev/null +++ b/ProjectCruiser/ShipSharingService.cs @@ -0,0 +1,69 @@ +using ProjectCruiser.DrawningSamples; +namespace ProjectCruiser; + +public class ShipSharingService : AbstractCompany +{ + protected int MaxInRow { get; private set; } + protected int MaxInColon { get; private set; } + + private int fromBorder = 20, fromCeiling = 20, between = 30; + + public ShipSharingService(int picWidth, int picHeight, + ICollectionGenObj collection) + : base(picWidth, picHeight, collection) + { + MaxInRow = (picWidth - fromBorder - fromCeiling) + / (_placeSizeWidth + between); + MaxInColon = (picHeight - fromBorder - fromCeiling) + / _placeSizeHeight; + } + + protected override void DrawBackground(Graphics g) + { + Pen pen = new(Color.Black, 2); + + int currentH = fromCeiling, currentW = fromBorder; + + for (int i = 0; i < MaxInRow; i++) + { + currentH = fromCeiling; + for (int j = 0; j < MaxInColon; j++) + { + g.DrawLine(pen, currentW + _placeSizeWidth, + currentH, currentW, currentH); + + g.DrawLine(pen, currentW, currentH, + currentW, currentH + _placeSizeHeight); + + currentH += _placeSizeHeight + 1; + } + currentW += _placeSizeWidth + between; + } + } + + protected override void SetObjectsPosition() + { + int index_collection = 0; + int newX = fromBorder + 6, newY = fromCeiling + 6; + + if (_collection != null) + { + for (int i = 0; i < MaxInColon; ++i) + { + newX = fromBorder + 2; + for (int j = 0; j < MaxInRow; ++j) + { + if (_collection.GetItem(index_collection) != null) + { + _collection.GetItem(index_collection).SetPictureSize(_pictureWidth, _pictureHeight); + _collection.GetItem(index_collection).SetPosition(newX, newY); + newX += _placeSizeWidth + between + 2; + index_collection++; + } + } + newY += _placeSizeHeight + 2; + } + } + } +} +