Compare commits

..

2 Commits

Author SHA1 Message Date
cb015204b9 inheritance 2024-06-12 19:21:59 +04:00
603cf3a903 In process : Add Border & Center moving strategy 2024-06-12 16:25:55 +04:00
17 changed files with 587 additions and 139 deletions

View File

@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectCruiser;
public enum DirectionType
{
Up = 1,
Down = 2,
Left = 3,
Right = 4
}

View File

@ -0,0 +1,9 @@
namespace ProjectCruiser.DrawningSamples;
public enum DirectionType
{
Unknown = -1,
Up = 1,
Down = 2,
Left = 3,
Right = 4
}

View File

@ -1,33 +1,39 @@
using System.Drawing.Drawing2D; using ProjectCruiser.Entities;
namespace ProjectCruiser.DrawningSamples;
namespace ProjectCruiser;
public class DrawningBase public class DrawningBase
{ {
// Класс-сущность // Класс-сущность
public EntityBase? EntityB { get; private set; } public EntityBase? EntityTransport { get; protected set; }
private int? _pictureWidth; // Ширина окна private int? _pictureWidth; // Ширина окна
private int? _pictureHeight; // Высота окна private int? _pictureHeight; // Высота окна
private int? _startPosX; // Левая координата прорисовки автомобиля
private int? _startPosY; // Верхняя кооридната прорисовки автомобиля
private readonly int _drawningWidth = 300; // Ширина прорисовки автомобиля protected int? _startPosX; // < protected
protected int? _startPosY; // < protected
private readonly int _drawningWidth = 302; // Ширина прорисовки автомобиля
private readonly int _drawningHeight = 42; // Высота прорисовки автомобиля private readonly int _drawningHeight = 42; // Высота прорисовки автомобиля
// Инициализация свойств // Инициализация свойств (теперь через конструктор)
public void Init(int speed, double weight, public DrawningBase(int speed, double weight, Color bodyColor) : this()
Color bodyColor, Color additionalColor, bool pad,
bool hangar, bool deckhouse)
{ {
EntityB = new EntityBase(); EntityTransport = new EntityBase(speed, weight, bodyColor);
EntityB.Init(speed, weight, bodyColor, }
additionalColor, pad, hangar, deckhouse);
private DrawningBase()
{
_pictureWidth = null; _pictureWidth = null;
_pictureHeight = null; _pictureHeight = null;
_startPosX = null; _startPosX = null;
_startPosY = null; _startPosY = null;
} }
// protected >
protected DrawningBase(int drawningCarWidth, int drawningCarHeight) : this()
{
_drawningWidth = drawningCarWidth;
_pictureHeight = drawningCarHeight;
}
public int getHeight() // для создания объекта в нижнем левом углу (*) public int getHeight() // для создания объекта в нижнем левом углу (*)
{ {
return _drawningHeight; return _drawningHeight;
@ -36,7 +42,8 @@ public class DrawningBase
// Установка границ поля // Установка границ поля
public bool SetPictureSize(int w, int h) public bool SetPictureSize(int w, int h)
{ {
if (w > _pictureWidth || h > _pictureHeight) if (w < _drawningWidth || h < _drawningHeight)
// canvas always bigger then obj to fit it
{ {
return false; return false;
} }
@ -72,8 +79,7 @@ public class DrawningBase
public bool MoveTransport(DirectionType direction) public bool MoveTransport(DirectionType direction)
{ {
if (EntityB == null || !_startPosX.HasValue || if (EntityTransport == null || !_startPosX.HasValue || !_startPosY.HasValue)
!_startPosY.HasValue)
{ {
return false; return false;
} }
@ -82,32 +88,32 @@ public class DrawningBase
{ {
//влево //влево
case DirectionType.Left: case DirectionType.Left:
if (_startPosX.Value - EntityB.Step > 0) if (_startPosX.Value - EntityTransport.Step > 0)
{ {
_startPosX -= (int)EntityB.Step; _startPosX -= (int)EntityTransport.Step;
} }
return true; return true;
//вверх //вверх
case DirectionType.Up: case DirectionType.Up:
if (_startPosY.Value - EntityB.Step > 0) if (_startPosY.Value - EntityTransport.Step > 0)
{ {
_startPosY -= (int)EntityB.Step; _startPosY -= (int)EntityTransport.Step;
} }
return true; return true;
// вправо // вправо
case DirectionType.Right: case DirectionType.Right:
if (_startPosX.Value + _drawningWidth + EntityB.Step if (_startPosX.Value + _drawningWidth + EntityTransport.Step
< _pictureWidth.Value) < _pictureWidth.Value)
{ {
_startPosX += (int)EntityB.Step; _startPosX += (int)EntityTransport.Step;
} }
return true; return true;
//вниз //вниз
case DirectionType.Down: case DirectionType.Down:
if (_startPosY.Value + _drawningHeight + EntityB.Step if (_startPosY.Value + _drawningHeight + EntityTransport.Step
< _pictureHeight.Value) < _pictureHeight.Value)
{ {
_startPosY += (int)EntityB.Step; _startPosY += (int)EntityTransport.Step;
} }
return true; return true;
@ -117,18 +123,16 @@ public class DrawningBase
} }
} }
public void DrawTransport(Graphics g) public virtual void DrawTransport(Graphics g) // < virtual
{ {
if (EntityB == null || !_startPosX.HasValue || if (EntityTransport == null || !_startPosX.HasValue ||
!_startPosY.HasValue) !_startPosY.HasValue)
{ {
return; return;
} }
Pen pen = new(Color.Black, 2); Pen pen = new(Color.Black, 2);
Brush PadBrush = new HatchBrush(HatchStyle.DottedDiamond, Color.LightGray, Color.Black); Brush mainBrush = new SolidBrush(EntityTransport.MainColor);
Brush additionalBrush = new SolidBrush(EntityB.AdditionalColor);
Brush mainBrush = new SolidBrush(EntityB.MainColor);
//границы cruiser //границы cruiser
Point point0 = new Point(_startPosX.Value + 2, _startPosY.Value + 7); Point point0 = new Point(_startPosX.Value + 2, _startPosY.Value + 7);
@ -152,38 +156,18 @@ public class DrawningBase
g.DrawPolygon(pen, boarders); g.DrawPolygon(pen, boarders);
g.FillPolygon(mainBrush, boarders); g.FillPolygon(mainBrush, boarders);
// вертолетная площадка
if (EntityB.HelicopterPads)
{
g.DrawEllipse(pen, _startPosX.Value + 170, _startPosY.Value + 11, 20, 20);
g.FillEllipse(PadBrush, _startPosX.Value + 170, _startPosY.Value + 11, 20, 20);
}
// салон на верхней палубе // салон на верхней палубе
if (EntityB.Deckhouse) int y_h = EntityTransport.values[1];
{ g.DrawRectangle(pen, _startPosX.Value + 100, _startPosY.Value + y_h, 38, 24);
// random location
int y_h = EntityB.values[1];
g.DrawRectangle(pen, _startPosX.Value + 100, _startPosY.Value + y_h, 38, 24); // 40, 26
g.DrawRectangle(pen, _startPosX.Value + 110, _startPosY.Value + y_h + 6, 20, 12); g.DrawRectangle(pen, _startPosX.Value + 110, _startPosY.Value + y_h + 6, 20, 12);
g.FillRectangle(additionalBrush, _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.DrawRectangle(pen, _startPosX.Value + 117, _startPosY.Value + y_h + 18, 6, 20);
g.FillRectangle(additionalBrush, _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;
if (EntityB.Hangar) public int? GetPosY => _startPosY;
{ public int GetWidth => _drawningWidth;
int n = EntityB.values[2]; public int GetHeight => _drawningHeight;
if (n == 1) g.FillRectangle(additionalBrush, _startPosX.Value + 250, _startPosY.Value + 20, 14, 7);
else
{
g.FillRectangle(additionalBrush, _startPosX.Value + 80, _startPosY.Value + 10, 10, 20);
g.FillRectangle(additionalBrush, _startPosX.Value + 70, _startPosY.Value + 12, 8, 12);
}
}
}
} }

View File

@ -0,0 +1,54 @@
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 pads, bool hangar) : base(302, 42)
// all additional featchures 'inside' object, so size remains
{
EntityTransport = new EntityCruiser(speed, weight,
bodyColor, additionalColor, pads, hangar);
}
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);
// вертолетная площадка
if (ship.HelicopterPads)
{
g.DrawEllipse(pen, _startPosX.Value + 170, _startPosY.Value + 11, 20, 20);
g.FillEllipse(PadBrush, _startPosX.Value + 170, _startPosY.Value + 11, 20, 20);
}
// ангар
if (ship.Hangar)
{
int n = EntityTransport.values[2];
if (n == 1) g.FillRectangle(additionalBrush, _startPosX.Value + 250, _startPosY.Value + 20, 14, 7);
else
{
g.FillRectangle(additionalBrush, _startPosX.Value + 80, _startPosY.Value + 10, 10, 20);
g.FillRectangle(additionalBrush, _startPosX.Value + 70, _startPosY.Value + 12, 8, 12);
}
}
}
}

View File

@ -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);
}
}

View File

@ -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 Hangar { get; private set; } // ангар
public EntityCruiser(int speed, double weight, Color mainc,
Color additionalColor, bool pads, bool hangar)
: base(speed, weight, mainc)
{
AdditionalColor = additionalColor;
HelicopterPads = pads;
Hangar = hangar;
}
}

View File

@ -1,36 +0,0 @@
namespace ProjectCruiser;
public class EntityBase
{
// свойства
public int Speed { get; private set; } // скорость
public double Weight { get; private set; } // вес
public Color MainColor { get; private set; } // основной цвет
public Color AdditionalColor { get; private set; } // доп. цвет
// признаки (наличия)
public bool HelicopterPads { get; private set; } // вертолетная площадка
public bool Hangar { get; private set; } // ангар
public bool Deckhouse { get; private set; } // салон на верхней палубе
public double Step => Speed * 100 / Weight;
public int[] values = { 0, 0, 0 };
public void Init(int speed, double weight,
Color mainc, Color addtc, bool pad,
bool hangar, bool deckhouse)
{
Random rn = new();
Speed = speed;
Weight = weight;
MainColor = mainc;
AdditionalColor = addtc;
HelicopterPads = pad;
Hangar = hangar;
Deckhouse = deckhouse;
values[0] = rn.Next(1, 4);
values[1] = rn.Next(5, 10);
values[2] = rn.Next(1, 3);
}
}

View File

@ -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();
/// Попытка перемещения в требуемом направлении
/// <param name="movementDirection">Направление</param>
/// <returns>Результат попытки (true - удалось переместиться, false - неудача)</returns>
private bool MoveTo(MovementDirection movementDirection)
{
if (_state != StrategyStatus.InProgress)
{
return false;
}
return _moveableObject?.TryMoveObject(movementDirection) ?? false;
}
}

View File

@ -0,0 +1,16 @@
namespace ProjectCruiser.MoveStrategy;
// Интерфейс для работы с перемещаемым объектом
public interface IMoveableObj
{
// Получение координат объекта
ObjParameters? GetObjectPosition { get; }
// Получение шага объекта
int GetStep { get; }
/// Попытка переместить объект в указанном направлении
/// <param name="direction">Направление</param>
/// <returns>true - объект перемещен, false - перемещение невозможно</returns>
bool TryMoveObject(MovementDirection direction);
}

View File

@ -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(); }
}
}
}

View File

@ -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(); }
}
}
}

View File

@ -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
/// <param name="direction">MovementDirection</param>
/// <returns>DirectionType</returns>
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,
};
}
}

View File

@ -0,0 +1,10 @@
namespace ProjectCruiser.MoveStrategy;
// Направление перемещения
public enum MovementDirection
{
Up = 1,
Down = 2,
Left = 3,
Right = 4
}

View File

@ -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;
}
}

View File

@ -0,0 +1,13 @@
namespace ProjectCruiser.MoveStrategy;
// Статус выполнения операции перемещения
public enum StrategyStatus
{
// готово к началу
NotInit,
// Выполняется
InProgress,
// Завершено
Finish
}

View File

@ -27,12 +27,15 @@ partial class OceanForm1
btnUpArrow = new Button(); btnUpArrow = new Button();
btnCreateBase = new Button(); btnCreateBase = new Button();
pictureBoxCr = new PictureBox(); pictureBoxCr = new PictureBox();
comboBoxStrategy = new ComboBox();
btnCreateAdvanced = new Button();
btnActivateStrategy = new Button();
((System.ComponentModel.ISupportInitialize)pictureBoxCr).BeginInit(); ((System.ComponentModel.ISupportInitialize)pictureBoxCr).BeginInit();
SuspendLayout(); SuspendLayout();
// //
// btnLeftArrow // btnLeftArrow
// //
btnLeftArrow.Location = new Point(926, 634); btnLeftArrow.Location = new Point(926, 445);
btnLeftArrow.Name = "btnLeftArrow"; btnLeftArrow.Name = "btnLeftArrow";
btnLeftArrow.Size = new Size(141, 132); btnLeftArrow.Size = new Size(141, 132);
btnLeftArrow.TabIndex = 0; btnLeftArrow.TabIndex = 0;
@ -41,7 +44,7 @@ partial class OceanForm1
// //
// btnDownArrow // btnDownArrow
// //
btnDownArrow.Location = new Point(1073, 634); btnDownArrow.Location = new Point(1073, 445);
btnDownArrow.Name = "btnDownArrow"; btnDownArrow.Name = "btnDownArrow";
btnDownArrow.Size = new Size(141, 132); btnDownArrow.Size = new Size(141, 132);
btnDownArrow.TabIndex = 1; btnDownArrow.TabIndex = 1;
@ -50,7 +53,7 @@ partial class OceanForm1
// //
// btnRightArrow // btnRightArrow
// //
btnRightArrow.Location = new Point(1220, 634); btnRightArrow.Location = new Point(1220, 445);
btnRightArrow.Name = "btnRightArrow"; btnRightArrow.Name = "btnRightArrow";
btnRightArrow.Size = new Size(141, 132); btnRightArrow.Size = new Size(141, 132);
btnRightArrow.TabIndex = 2; btnRightArrow.TabIndex = 2;
@ -59,7 +62,7 @@ partial class OceanForm1
// //
// btnUpArrow // btnUpArrow
// //
btnUpArrow.Location = new Point(1073, 496); btnUpArrow.Location = new Point(1073, 307);
btnUpArrow.Name = "btnUpArrow"; btnUpArrow.Name = "btnUpArrow";
btnUpArrow.Size = new Size(141, 132); btnUpArrow.Size = new Size(141, 132);
btnUpArrow.TabIndex = 3; btnUpArrow.TabIndex = 3;
@ -70,11 +73,11 @@ partial class OceanForm1
// //
btnCreateBase.Location = new Point(928, 12); btnCreateBase.Location = new Point(928, 12);
btnCreateBase.Name = "btnCreateBase"; btnCreateBase.Name = "btnCreateBase";
btnCreateBase.Size = new Size(435, 46); btnCreateBase.Size = new Size(433, 46);
btnCreateBase.TabIndex = 4; btnCreateBase.TabIndex = 4;
btnCreateBase.Text = "Create"; btnCreateBase.Text = "Create base object";
btnCreateBase.UseVisualStyleBackColor = true; btnCreateBase.UseVisualStyleBackColor = true;
btnCreateBase.Click += ButtonCreateBase_Click; btnCreateBase.Click += btnCreateBase_Click;
// //
// pictureBoxCr // pictureBoxCr
// //
@ -85,12 +88,44 @@ partial class OceanForm1
pictureBoxCr.TabIndex = 5; pictureBoxCr.TabIndex = 5;
pictureBoxCr.TabStop = false; 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 // OceanForm1
// //
AutoScaleDimensions = new SizeF(13F, 32F); AutoScaleDimensions = new SizeF(13F, 32F);
AutoScaleMode = AutoScaleMode.Font; AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.Turquoise; BackColor = Color.Turquoise;
ClientSize = new Size(1375, 778); ClientSize = new Size(1375, 778);
Controls.Add(btnActivateStrategy);
Controls.Add(btnCreateAdvanced);
Controls.Add(comboBoxStrategy);
Controls.Add(btnCreateBase); Controls.Add(btnCreateBase);
Controls.Add(btnUpArrow); Controls.Add(btnUpArrow);
Controls.Add(btnRightArrow); Controls.Add(btnRightArrow);
@ -111,4 +146,7 @@ partial class OceanForm1
private Button btnUpArrow; private Button btnUpArrow;
private Button btnCreateBase; private Button btnCreateBase;
private PictureBox pictureBoxCr; private PictureBox pictureBoxCr;
private ComboBox comboBoxStrategy;
private Button btnCreateAdvanced;
private Button btnActivateStrategy;
} }

View File

@ -1,12 +1,5 @@
using System; using ProjectCruiser.DrawningSamples;
using System.Collections.Generic; using ProjectCruiser.MoveStrategy;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ProjectCruiser namespace ProjectCruiser
{ {
@ -15,9 +8,13 @@ namespace ProjectCruiser
// Поле-объект для прорисовки объекта // Поле-объект для прорисовки объекта
private DrawningBase? _drawningCruiser; private DrawningBase? _drawningCruiser;
// Стратегия перемещения
private AbstractStrategy? _strategy;
public OceanForm1() public OceanForm1()
{ {
InitializeComponent(); InitializeComponent();
_strategy = null;
} }
// Метод прорисовки transport // Метод прорисовки transport
@ -27,32 +24,52 @@ namespace ProjectCruiser
{ {
return; return;
} }
Bitmap bmp = new(pictureBoxCr.Width, Bitmap bmp = new(pictureBoxCr.Width, pictureBoxCr.Height);
pictureBoxCr.Height);
Graphics gr = Graphics.FromImage(bmp); Graphics gr = Graphics.FromImage(bmp);
_drawningCruiser.DrawTransport(gr); _drawningCruiser.DrawTransport(gr);
pictureBoxCr.Image = bmp; pictureBoxCr.Image = bmp;
} }
// Обработка нажатия кнопки "Create" // Обработка нажатия кнопок "Create(...)"
private void ButtonCreateBase_Click(object sender, EventArgs e)
private void btnCreateBase_Click(object sender, EventArgs e) =>
CreateObject(nameof(DrawningBase));
private void btnCreateAdvanced_Click(object sender, EventArgs e) =>
CreateObject(nameof(DrawningCruiser));
// Создание объекта класса-перемещения
/// <param name="type">Тип создаваемого объекта</param>
private void CreateObject(string type)
{ {
Random random = new(); Random random = new();
_drawningCruiser = new DrawningBase(); 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;
_drawningCruiser.Init(random.Next(100, 300), random.Next(1000, 3000), 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)),
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)), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)));
Convert.ToBoolean(random.Next(0, 2))); break;
default:
return;
}
_drawningCruiser.SetPictureSize(pictureBoxCr.Width, pictureBoxCr.Height); _drawningCruiser.SetPictureSize(pictureBoxCr.Width, pictureBoxCr.Height);
_drawningCruiser.SetPosition(random.Next(10, 100), _drawningCruiser.SetPosition(random.Next(10, 100),
pictureBoxCr.Height - random.Next(10, 100) - _drawningCruiser.getHeight()); pictureBoxCr.Height - random.Next(10, 100) - _drawningCruiser.getHeight());
_strategy = null;
comboBoxStrategy.Enabled = true;
Draw(); Draw();
} }
private void BtnMove_Click(object sender, EventArgs e) private void BtnMove_Click(object sender, EventArgs e)
{ {
if (_drawningCruiser == null) if (_drawningCruiser == null)
@ -85,5 +102,41 @@ namespace ProjectCruiser
Draw(); 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;
}
}
} }
} }