PIbd-23. Elatomtsev L.K. Lab work 02 #2

Closed
DeerElk wants to merge 1 commits from lab2 into lab1
14 changed files with 1056 additions and 441 deletions

View File

@ -0,0 +1,135 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProjectAircraftCarrier.DrawingObjects;
namespace ProjectAircraftCarrier.MovementStrategy
{
/// <summary>
/// Класс-стратегия перемещения объекта
/// </summary>
public abstract class AbstractStrategy
{
/// <summary>
/// Перемещаемый объект
/// </summary>
private IMoveableObject? _moveableObject;
/// <summary>
/// Статус перемещения
/// </summary>
private Status _state = Status.NotInit;
/// <summary>
/// Ширина поля
/// </summary>
protected int FieldWidth { get; private set; }
/// <summary>
/// Высота поля
/// </summary>
protected int FieldHeight { get; private set; }
/// <summary>
/// Статус перемещения
/// </summary>
public Status GetStatus() { return _state; }
/// <summary>
/// Установка данных
/// </summary>
/// <param name="moveableObject">Перемещаемый объект</param>
/// <param name="width">Ширина поля</param>
/// <param name="height">Высота поля</param>
public void SetData(IMoveableObject moveableObject, int width, int
height)
{
if (moveableObject == null)
{
_state = Status.NotInit;
return;
}
_state = Status.InProgress;
_moveableObject = moveableObject;
FieldWidth = width;
FieldHeight = height;
}
/// <summary>
/// Шаг перемещения
/// </summary>
public void MakeStep()
{
if (_state != Status.InProgress)
{
return;
}
if (IsTargetDestinaion())
{
_state = Status.Finish;
return;
}
MoveToTarget();
}
/// <summary>
/// Перемещение влево
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveLeft() => MoveTo(DirectionType.Left);
/// <summary>
/// Перемещение вправо
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveRight() => MoveTo(DirectionType.Right);
/// <summary>
/// Перемещение вверх
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveUp() => MoveTo(DirectionType.Up);
/// <summary>
/// Перемещение вниз
/// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
protected bool MoveDown() => MoveTo(DirectionType.Down);
/// <summary>
/// Параметры объекта
/// </summary>
protected ObjectParameters? GetObjectParameters =>
_moveableObject?.GetObjectPosition;
/// <summary>
/// Шаг объекта
/// </summary>
/// <returns></returns>
protected int? GetStep()
{
if (_state != Status.InProgress)
{
return null;
}
return _moveableObject?.GetStep;
}
/// <summary>
/// Перемещение к цели
/// </summary>
protected abstract void MoveToTarget();
/// <summary>
/// Достигнута ли цель
/// </summary>
/// <returns></returns>
protected abstract bool IsTargetDestinaion();
/// <summary>
/// Попытка перемещения в требуемом направлении
/// </summary>
/// <param name="directionType">Направление</param>
/// <returns>Результат попытки (true - удалось переместиться, false - неудача)</returns>
private bool MoveTo(DirectionType directionType)
{
if (_state != Status.InProgress)
{
return false;
}
if (_moveableObject?.CheckCanMove(directionType) ?? false)
{
_moveableObject.MoveObject(directionType);
return true;
}
return false;
}
}
}

View File

@ -3,172 +3,49 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProjectAircraftCarrier.DrawingObjects;
using ProjectAircraftCarrier.Entities;
namespace ProjectAircraftCarrier
namespace ProjectAircraftCarrier.DrawingObjects
{
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
internal class DrawingAircraftCarrier
internal class DrawingAircraftCarrier : DrawingWarship
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityAircraftCarrier? EntityAircraftCarrier { get; private set; }
/// <summary>
/// Ширина окна
/// </summary>
private int _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int _pictureHeight;
/// <summary>
/// Левая координата прорисовки авианосца
/// </summary>
private int _startPosX;
/// <summary>
/// Верхняя кооридната прорисовки авианосца
/// </summary>
private int _startPosY;
/// <summary>
/// Ширина прорисовки авианосца
/// </summary>
private readonly int _carrierWidth = 196;
/// <summary>
/// Высота прорисовки авианосца
/// </summary>
private readonly int _carrierHeight = 58;
/// <summary>
/// Инициализация свойств
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Цвет кузова</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="cabin">Признак наличия кабины</param>
/// <param name="runway">Признак наличия ввп</param>
/// <param name="runway">Признак наличия антикрыла</param>
/// <param name="cabin">Признак наличия гоночной полосы</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
/// <returns>true - объект создан, false - проверка не пройдена,нельзя создать объект в этих размерах</returns>
public bool Init(int speed, double weight, Color bodyColor, Color
additionalColor, bool cabin, bool runway, int width, int height)
public DrawingAircraftCarrier(int speed, double weight, Color bodyColor, Color additionalColor, bool runway, bool cabin, int width, int height) :
base(speed, weight, bodyColor, width, height, 196, 58)
{
if (width < _carrierWidth || height < _carrierHeight)
return false;
_pictureWidth = width;
_pictureHeight = height;
EntityAircraftCarrier = new EntityAircraftCarrier();
EntityAircraftCarrier.Init(speed, weight, bodyColor, additionalColor, cabin, runway);
return true;
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
if (x < 0 || y < 0 || x + _carrierWidth > _pictureWidth || y + _carrierHeight > _pictureHeight)
if (EntityWarship != null)
{
x = 0;
y = 0;
}
_startPosX = x;
_startPosY = y;
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
public void MoveTransport(DirectionType direction)
{
if (EntityAircraftCarrier == null)
{
return;
}
switch (direction)
{
//влево
case DirectionType.Left:
if (_startPosX - EntityAircraftCarrier.Step > 0)
{
_startPosX -= (int)EntityAircraftCarrier.Step;
}
break;
//вверх
case DirectionType.Up:
if (_startPosY - EntityAircraftCarrier.Step > 0)
{
_startPosY -= (int)EntityAircraftCarrier.Step;
}
break;
// вправо
case DirectionType.Right:
if (_startPosX + _carrierWidth + EntityAircraftCarrier.Step < _pictureWidth)
{
_startPosX += (int)EntityAircraftCarrier.Step;
}
break;
//вниз
case DirectionType.Down:
if (_startPosY + _carrierHeight + EntityAircraftCarrier.Step < _pictureHeight)
{
_startPosY += (int)EntityAircraftCarrier.Step;
}
break;
EntityWarship = new EntityAircraftCarrier(speed, weight, bodyColor, additionalColor, runway, cabin);
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public void DrawTransport(Graphics g)
public override void DrawTransport(Graphics g)
{
if (EntityAircraftCarrier == null)
if (EntityWarship is not EntityAircraftCarrier aircraftCarrier)
{
return;
}
Pen pen = new(Color.Black);
Brush additionalBrush = new SolidBrush(EntityAircraftCarrier.AdditionalColor);
Brush bodyBrush = new SolidBrush(EntityAircraftCarrier.BodyColor);
//двигатели
Point[] PointEngine1 = {
new Point(_startPosX + 0, _startPosY + 11),
new Point(_startPosX + 2, _startPosY + 11),
new Point(_startPosX + 2, _startPosY + 24),
new Point(_startPosX + 0, _startPosY + 24),
};
Point[] PointEngine2 = {
new Point(_startPosX + 0, _startPosY + 31),
new Point(_startPosX + 2, _startPosY + 31),
new Point(_startPosX + 2, _startPosY + 44),
new Point(_startPosX + 0, _startPosY + 44),
};
Brush brBlack = new SolidBrush(Color.Black);
g.FillPolygon(brBlack, PointEngine1);
g.DrawPolygon(pen, PointEngine1);
g.FillPolygon(brBlack, PointEngine2);
g.DrawPolygon(pen, PointEngine2);
//границы авианосца
Point[] PointBorders = {
new Point(_startPosX + 4, _startPosY + 0),
new Point(_startPosX + 142, _startPosY + 0),
new Point(_startPosX + 196, _startPosY + 29),
new Point(_startPosX + 142, _startPosY + 58),
new Point(_startPosX + 4, _startPosY + 58),
};
g.FillPolygon(bodyBrush, PointBorders);
g.DrawPolygon(pen, PointBorders);
//отсеки
g.DrawRectangle(pen, _startPosX + 98, _startPosY + 18, 10, 23);
g.FillRectangle(additionalBrush, _startPosX + 99, _startPosY + 19, 9, 22);
g.DrawRectangle(pen, _startPosX + 78, _startPosY + 23, 20, 13);
g.FillRectangle(additionalBrush, _startPosX + 79, _startPosY + 24, 19, 12);
g.DrawEllipse(pen, _startPosX + 138, _startPosY + 22, 11, 11);
g.FillEllipse(additionalBrush, _startPosX + 138, _startPosY + 22, 11, 11);
Brush additionalBrush = new
SolidBrush(aircraftCarrier.AdditionalColor);
base.DrawTransport(g);
//впп
if (EntityAircraftCarrier.Runway)
if (aircraftCarrier.Runway)
{
Pen penWhite = new Pen(Color.White, 3);
Pen penThinWhite = new Pen(Color.White, 1);
@ -177,7 +54,7 @@ additionalColor, bool cabin, bool runway, int width, int height)
g.DrawLine(penThinWhite, _startPosX + 3, _startPosY + 20, _startPosX + 148, _startPosY + 3);
}
// кабина
if (EntityAircraftCarrier.Cabin)
if (aircraftCarrier.Cabin)
{
Point[] PointCabin = {
new Point(_startPosX + 15, _startPosY + 42),

View File

@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProjectAircraftCarrier.DrawingObjects;
namespace ProjectAircraftCarrier.MovementStrategy
{
/// <summary>
/// Реализация интерфейса IdrawingObject для работы с объектом drawingCar (паттерн Adapter)
/// </summary>
public class DrawingObjectWarship : IMoveableObject
{
private readonly DrawingWarship? _drawingWarship = null;
public DrawingObjectWarship(DrawingWarship drawingWarship)
{
_drawingWarship = drawingWarship;
}
public ObjectParameters? GetObjectPosition
{
get
{
if (_drawingWarship == null || _drawingWarship.EntityWarship ==
null)
{
return null;
}
return new ObjectParameters(_drawingWarship.GetPosX,
_drawingWarship.GetPosY, _drawingWarship.GetWidth, _drawingWarship.GetHeight);
}
}
public int GetStep => (int)(_drawingWarship?.EntityWarship?.Step ?? 0);
public bool CheckCanMove(DirectionType direction) =>
_drawingWarship?.CanMove(direction) ?? false;
public void MoveObject(DirectionType direction) =>
_drawingWarship?.MoveTransport(direction);
}
}

View File

@ -0,0 +1,216 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProjectAircraftCarrier.Entities;
namespace ProjectAircraftCarrier.DrawingObjects
{
public class DrawingWarship
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityWarship? EntityWarship { get; protected set; }
/// <summary>
/// Ширина окна
/// </summary>
private int _pictureWidth;
/// <summary>
/// Высота окна
/// </summary>
private int _pictureHeight;
/// <summary>
/// Левая координата прорисовки авианосца
/// </summary>
protected int _startPosX;
/// <summary>
/// Верхняя кооридната прорисовки авианосца
/// </summary>
protected int _startPosY;
/// <summary>
/// Ширина прорисовки авианосца
/// </summary>
private readonly int _warshipWidth = 196;
/// <summary>
/// Высота прорисовки авианосца
/// </summary>
private readonly int _warshipHeight = 58;
/// <summary>
/// Координата X объекта
/// </summary>
public int GetPosX => _startPosX;
/// <summary>
/// Координата Y объекта
/// </summary>
public int GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth => _warshipWidth;
/// <summary>
/// Высота объекта
/// </summary>
public int GetHeight => _warshipHeight;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Цвет кузова</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
/// <returns>true - объект создан, false - проверка не пройдена,нельзя создать объект в этих размерах</returns>
public DrawingWarship(int speed, double weight, Color bodyColor, int width, int height)
{
if (_warshipWidth > width || _warshipHeight > height)
return;
_pictureWidth = width;
_pictureHeight = height;
EntityWarship = new EntityWarship(speed, weight, bodyColor);
}
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
/// <param name="warshipWidth">Ширина прорисовки автомобиля</param>
/// <param name="warshipHeight">Высота прорисовки автомобиля</param>
protected DrawingWarship(int speed, double weight, Color bodyColor, int
width, int height, int warshipWidth, int warshipHeight)
{
if (_warshipWidth > width || _warshipHeight > height)
return;
_pictureWidth = width;
_pictureHeight = height;
_warshipWidth = warshipWidth;
_warshipHeight = warshipHeight;
EntityWarship = new EntityWarship(speed, weight, bodyColor);
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
if (x < 0 || y < 0 || x + _warshipWidth > _pictureWidth || y + _warshipHeight > _pictureHeight)
{
x = 0;
y = 0;
}
_startPosX = x;
_startPosY = y;
}
/// <summary>
/// Проверка, что объект может переместится по указанному направлению
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - можно переместится по указанному направлению</returns>
public bool CanMove(DirectionType direction)
{
if (EntityWarship == null)
{
return false;
}
return direction switch
{
//влево
DirectionType.Left => _startPosX - EntityWarship.Step > 0,
//вверх
DirectionType.Up => _startPosY - EntityWarship.Step > 0,
// вправо
DirectionType.Right => _startPosX + EntityWarship.Step + _warshipWidth < _pictureWidth,
//вниз
DirectionType.Down => _startPosY + EntityWarship.Step + _warshipHeight < _pictureHeight,
_ => false,
};
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
public void MoveTransport(DirectionType direction)
{
if (!CanMove(direction) || EntityWarship == null)
{
return;
}
switch (direction)
{
//влево
case DirectionType.Left:
_startPosX -= (int)EntityWarship.Step;
break;
//вверх
case DirectionType.Up:
_startPosY -= (int)EntityWarship.Step;
break;
// вправо
case DirectionType.Right:
_startPosX += (int)EntityWarship.Step;
break;
//вниз
case DirectionType.Down:
_startPosY += (int)EntityWarship.Step;
break;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public virtual void DrawTransport(Graphics g)
{
if (EntityWarship == null)
{
return;
}
Pen pen = new(Color.Black);
Brush br = new SolidBrush(EntityWarship.BodyColor);
//двигатели
Point[] PointEngine1 = {
new Point(_startPosX + 0, _startPosY + 11),
new Point(_startPosX + 2, _startPosY + 11),
new Point(_startPosX + 2, _startPosY + 24),
new Point(_startPosX + 0, _startPosY + 24),
};
Point[] PointEngine2 = {
new Point(_startPosX + 0, _startPosY + 31),
new Point(_startPosX + 2, _startPosY + 31),
new Point(_startPosX + 2, _startPosY + 44),
new Point(_startPosX + 0, _startPosY + 44),
};
Brush brBlack = new SolidBrush(Color.Black);
g.FillPolygon(brBlack, PointEngine1);
g.DrawPolygon(pen, PointEngine1);
g.FillPolygon(brBlack, PointEngine2);
g.DrawPolygon(pen, PointEngine2);
//границы авианосца
Point[] PointBorders = {
new Point(_startPosX + 4, _startPosY + 0),
new Point(_startPosX + 142, _startPosY + 0),
new Point(_startPosX + 196, _startPosY + 29),
new Point(_startPosX + 142, _startPosY + 58),
new Point(_startPosX + 4, _startPosY + 58),
};
Brush brGray = new SolidBrush(Color.Gray);
g.FillPolygon(br, PointBorders);
g.DrawPolygon(pen, PointBorders);
//отсеки
g.DrawRectangle(pen, _startPosX + 98, _startPosY + 18, 10, 23);
g.FillRectangle(brBlack, _startPosX + 99, _startPosY + 19, 9, 22);
g.DrawRectangle(pen, _startPosX + 78, _startPosY + 23, 20, 13);
g.FillRectangle(brBlack, _startPosX + 79, _startPosY + 24, 19, 12);
g.DrawEllipse(pen, _startPosX + 138, _startPosY + 22, 11, 11);
g.FillEllipse(brBlack, _startPosX + 138, _startPosY + 22, 11, 11);
}
}
}

View File

@ -1,63 +1,44 @@
using System;
using ProjectAircraftCarrier.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAircraftCarrier
namespace ProjectAircraftCarrier.Entities
{
/// <summary>
/// Класс - сущность "Авианосец"
/// Класс-сущность "Спортивный автомобиль"
/// </summary>
public class EntityAircraftCarrier
public class EntityAircraftCarrier : EntityWarship
{
/// <summary>
/// Скорость
/// </summary>
public int Speed { get; private set; }
/// <summary>
/// Вес
/// </summary>
public double Weight { get; private set; }
/// <summary>
/// Основной цвет
/// </summary>
public Color BodyColor { get; private set; }
/// <summary>
/// Дополнительный цвет (для опциональных элементов)
/// </summary>
public Color AdditionalColor { get; private set; }
/// <summary>
/// Признак (опция) наличия кабины
/// </summary>
public bool Cabin { get; private set; }
/// <summary>
/// Признак (опция) наличия ввп
/// Признак (опция) наличия антикрыла
/// </summary>
public bool Runway { get; private set; }
/// <summary>
/// Шаг перемещения авианосца
/// Признак (опция) наличия гоночной полосы
/// </summary>
public double Step => (double)Speed * 100 / Weight;
public bool Cabin { get; private set; }
/// <summary>
/// Инициализация полей объекта-класса спортивного авианосца
/// Инициализация полей объекта-класса спортивного автомобиля
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес авианосца</param>
/// <param name="weight">Вес автомобиля</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="cabin">Признак наличия антикрыла</param>
/// <param name="runway">Признак наличия гоночной полосы</param>
public void Init(int speed, double weight, Color bodyColor, Color
additionalColor, bool cabin, bool runway)
/// <param name="runway">Признак наличия антикрыла</param>
/// <param name="cabin">Признак наличия гоночной полосы</param>
public EntityAircraftCarrier(int speed, double weight, Color bodyColor, Color additionalColor, bool runway, bool cabin)
: base(speed, weight, bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
AdditionalColor = additionalColor;
Cabin = cabin;
Runway = runway;
Cabin = cabin;
}
}
}
}

View File

@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAircraftCarrier.Entities
{
/// <summary>
/// Класс-сущность "Автомобиль"
/// </summary>
public class EntityWarship
{
/// <summary>
/// Скорость
/// </summary>
public int Speed { get; private set; }
/// <summary>
/// Вес
/// </summary>
public double Weight { get; private set; }
/// <summary>
/// Основной цвет
/// </summary>
public Color BodyColor { get; private set; }
/// <summary>
/// Шаг перемещения автомобиля
/// </summary>
public double Step => (double)Speed * 100 / Weight;
/// <summary>
/// Конструктор с параметрами
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес автомобиля</param>
/// <param name="bodyColor">Основной цвет</param>
public EntityWarship(int speed, double weight, Color bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
}
}
}

View File

@ -1,4 +1,6 @@
namespace ProjectAircraftCarrier
using System.Windows.Forms;
namespace ProjectAircraftCarrier
{
partial class FormAircraftCarrier
{
@ -29,110 +31,160 @@
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormAircraftCarrier));
pictureBoxAircraftCarrier = new PictureBox();
buttonCreate = new Button();
buttonUp = new Button();
buttonCreateAircraftCarrier = new Button();
buttonLeft = new Button();
buttonDown = new Button();
buttonRight = new Button();
buttonUp = new Button();
buttonDown = new Button();
pictureBoxAircraftCarrier = new PictureBox();
comboBoxStrategy = new ComboBox();
buttonStep = new Button();
buttonCreateWarship = new Button();
((System.ComponentModel.ISupportInitialize)pictureBoxAircraftCarrier).BeginInit();
SuspendLayout();
//
// pictureBoxAircraftCarrier
// buttonCreateAircraftCarrier
//
pictureBoxAircraftCarrier.Dock = DockStyle.Fill;
pictureBoxAircraftCarrier.Location = new Point(0, 0);
pictureBoxAircraftCarrier.Name = "pictureBoxAircraftCarrier";
pictureBoxAircraftCarrier.Size = new Size(878, 444);
pictureBoxAircraftCarrier.SizeMode = PictureBoxSizeMode.AutoSize;
pictureBoxAircraftCarrier.TabIndex = 0;
pictureBoxAircraftCarrier.TabStop = false;
//
// buttonCreate
//
buttonCreate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreate.Location = new Point(12, 398);
buttonCreate.Name = "buttonCreate";
buttonCreate.Size = new Size(112, 34);
buttonCreate.TabIndex = 1;
buttonCreate.Text = "Create";
buttonCreate.UseVisualStyleBackColor = true;
buttonCreate.Click += ButtonCreate_Click;
//
// buttonUp
//
buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonUp.BackgroundImage = (Image)resources.GetObject("buttonUp.BackgroundImage");
buttonUp.BackgroundImageLayout = ImageLayout.Zoom;
buttonUp.Location = new Point(800, 366);
buttonUp.Name = "buttonUp";
buttonUp.Size = new Size(30, 30);
buttonUp.TabIndex = 2;
buttonUp.UseVisualStyleBackColor = true;
buttonUp.Click += ButtonMove_Click;
buttonCreateAircraftCarrier.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreateAircraftCarrier.Location = new Point(4, 527);
buttonCreateAircraftCarrier.Margin = new Padding(4, 3, 4, 3);
buttonCreateAircraftCarrier.Name = "buttonCreateAircraftCarrier";
buttonCreateAircraftCarrier.Size = new Size(193, 37);
buttonCreateAircraftCarrier.TabIndex = 0;
buttonCreateAircraftCarrier.Text = "Create Aircraft Carrier";
buttonCreateAircraftCarrier.UseVisualStyleBackColor = true;
buttonCreateAircraftCarrier.Click += ButtonCreateAircraftCarrier_Click;
//
// buttonLeft
//
buttonLeft.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonLeft.BackgroundImage = (Image)resources.GetObject("buttonLeft.BackgroundImage");
buttonLeft.BackgroundImageLayout = ImageLayout.Zoom;
buttonLeft.Location = new Point(764, 402);
buttonLeft.Location = new Point(969, 523);
buttonLeft.Margin = new Padding(4, 3, 4, 3);
buttonLeft.Name = "buttonLeft";
buttonLeft.Size = new Size(30, 30);
buttonLeft.TabIndex = 3;
buttonLeft.Size = new Size(37, 37);
buttonLeft.TabIndex = 1;
buttonLeft.UseVisualStyleBackColor = true;
buttonLeft.Click += ButtonMove_Click;
//
// buttonDown
//
buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonDown.BackgroundImage = (Image)resources.GetObject("buttonDown.BackgroundImage");
buttonDown.BackgroundImageLayout = ImageLayout.Zoom;
buttonDown.Location = new Point(800, 402);
buttonDown.Name = "buttonDown";
buttonDown.Size = new Size(30, 30);
buttonDown.TabIndex = 4;
buttonDown.UseVisualStyleBackColor = true;
buttonDown.Click += ButtonMove_Click;
//
// buttonRight
//
buttonRight.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonRight.BackgroundImage = (Image)resources.GetObject("buttonRight.BackgroundImage");
buttonRight.BackgroundImageLayout = ImageLayout.Zoom;
buttonRight.Location = new Point(836, 402);
buttonRight.Location = new Point(1059, 523);
buttonRight.Margin = new Padding(4, 3, 4, 3);
buttonRight.Name = "buttonRight";
buttonRight.Size = new Size(30, 30);
buttonRight.TabIndex = 5;
buttonRight.Size = new Size(37, 37);
buttonRight.TabIndex = 2;
buttonRight.UseVisualStyleBackColor = true;
buttonRight.Click += ButtonMove_Click;
//
// buttonUp
//
buttonUp.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonUp.BackgroundImage = (Image)resources.GetObject("buttonUp.BackgroundImage");
buttonUp.BackgroundImageLayout = ImageLayout.Zoom;
buttonUp.Location = new Point(1014, 478);
buttonUp.Margin = new Padding(4, 3, 4, 3);
buttonUp.Name = "buttonUp";
buttonUp.Size = new Size(37, 37);
buttonUp.TabIndex = 3;
buttonUp.UseVisualStyleBackColor = true;
buttonUp.Click += ButtonMove_Click;
//
// buttonDown
//
buttonDown.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonDown.BackgroundImage = (Image)resources.GetObject("buttonDown.BackgroundImage");
buttonDown.BackgroundImageLayout = ImageLayout.Zoom;
buttonDown.Location = new Point(1014, 523);
buttonDown.Margin = new Padding(4, 3, 4, 3);
buttonDown.Name = "buttonDown";
buttonDown.Size = new Size(37, 37);
buttonDown.TabIndex = 4;
buttonDown.UseVisualStyleBackColor = true;
buttonDown.Click += ButtonMove_Click;
//
// pictureBoxAircraftCarrier
//
pictureBoxAircraftCarrier.Dock = DockStyle.Fill;
pictureBoxAircraftCarrier.Location = new Point(0, 0);
pictureBoxAircraftCarrier.Margin = new Padding(4, 3, 4, 3);
pictureBoxAircraftCarrier.Name = "pictureBoxAircraftCarrier";
pictureBoxAircraftCarrier.Size = new Size(1103, 567);
pictureBoxAircraftCarrier.SizeMode = PictureBoxSizeMode.CenterImage;
pictureBoxAircraftCarrier.TabIndex = 5;
pictureBoxAircraftCarrier.TabStop = false;
//
// comboBoxStrategy
//
comboBoxStrategy.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxStrategy.FormattingEnabled = true;
comboBoxStrategy.Items.AddRange(new object[] { "Move to center", "Move to border" });
comboBoxStrategy.Location = new Point(923, 12);
comboBoxStrategy.Margin = new Padding(4, 5, 4, 5);
comboBoxStrategy.Name = "comboBoxStrategy";
comboBoxStrategy.Size = new Size(171, 33);
comboBoxStrategy.TabIndex = 6;
//
// buttonStep
//
buttonStep.Anchor = AnchorStyles.Top | AnchorStyles.Right;
buttonStep.Location = new Point(989, 57);
buttonStep.Margin = new Padding(4, 5, 4, 5);
buttonStep.Name = "buttonStep";
buttonStep.Size = new Size(107, 38);
buttonStep.TabIndex = 7;
buttonStep.Text = "Step";
buttonStep.UseVisualStyleBackColor = true;
buttonStep.Click += ButtonStep_Click;
//
// buttonCreateWarship
//
buttonCreateWarship.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCreateWarship.Location = new Point(206, 525);
buttonCreateWarship.Margin = new Padding(4, 3, 4, 3);
buttonCreateWarship.Name = "buttonCreateWarship";
buttonCreateWarship.Size = new Size(200, 38);
buttonCreateWarship.TabIndex = 8;
buttonCreateWarship.Text = "Create Warship";
buttonCreateWarship.UseVisualStyleBackColor = true;
buttonCreateWarship.Click += ButtonCreateWarship_Click;
//
// FormAircraftCarrier
//
AutoScaleDimensions = new SizeF(10F, 25F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(878, 444);
Controls.Add(buttonRight);
ClientSize = new Size(1103, 567);
Controls.Add(buttonCreateWarship);
Controls.Add(buttonStep);
Controls.Add(comboBoxStrategy);
Controls.Add(buttonDown);
Controls.Add(buttonLeft);
Controls.Add(buttonUp);
Controls.Add(buttonCreate);
Controls.Add(buttonRight);
Controls.Add(buttonLeft);
Controls.Add(buttonCreateAircraftCarrier);
Controls.Add(pictureBoxAircraftCarrier);
Margin = new Padding(4, 3, 4, 3);
Name = "FormAircraftCarrier";
StartPosition = FormStartPosition.CenterScreen;
Text = "AircraftCarrier";
((System.ComponentModel.ISupportInitialize)pictureBoxAircraftCarrier).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private PictureBox pictureBoxAircraftCarrier;
private Button buttonCreate;
private Button buttonCreateAircraftCarrier;
private Button buttonUp;
private Button buttonLeft;
private Button buttonDown;
private Button buttonRight;
private ComboBox comboBoxStrategy;
private Button buttonStep;
private Button buttonCreateWarship;
}
}

View File

@ -1,3 +1,7 @@
using ProjectAircraftCarrier.MovementStrategy;
using ProjectAircraftCarrier.DrawingObjects;
using System.Windows.Forms;
namespace ProjectAircraftCarrier
{
public partial class FormAircraftCarrier : Form
@ -5,7 +9,11 @@ namespace ProjectAircraftCarrier
/// <summary>
/// Ïîëå-îáúåêò äëÿ ïðîðèñîâêè îáúåêòà
/// </summary>
private DrawingAircraftCarrier? _drawingAircraftCarrier;
private DrawingWarship? _drawingWarship;
/// <summary>
/// Ñòðàòåãèÿ ïåðåìåùåíèÿ
/// </summary>
private AbstractStrategy? _abstractStrategy;
/// <summary>
/// Èíèöèàëèçàöèÿ ôîðìû
/// </summary>
@ -18,13 +26,13 @@ namespace ProjectAircraftCarrier
/// </summary>
private void Draw()
{
if (_drawingAircraftCarrier == null)
{
if (_drawingWarship == null)
{
return;
}
Bitmap bmp = new(pictureBoxAircraftCarrier.Width, pictureBoxAircraftCarrier.Height);
Graphics gr = Graphics.FromImage(bmp);
_drawingAircraftCarrier.DrawTransport(gr);
_drawingWarship.DrawTransport(gr);
pictureBoxAircraftCarrier.Image = bmp;
}
@ -33,11 +41,10 @@ namespace ProjectAircraftCarrier
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCreate_Click(object sender, EventArgs e)
private void ButtonCreateAircraftCarrier_Click(object sender, EventArgs e)
{
Random random = new();
_drawingAircraftCarrier = new DrawingAircraftCarrier();
_drawingAircraftCarrier.Init(random.Next(100, 300),
_drawingWarship = new DrawingAircraftCarrier(random.Next(100, 300),
random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256),
random.Next(0, 256)),
@ -46,18 +53,32 @@ namespace ProjectAircraftCarrier
Convert.ToBoolean(random.Next(0, 2)),
Convert.ToBoolean(random.Next(0, 2)),
pictureBoxAircraftCarrier.Width, pictureBoxAircraftCarrier.Height);
_drawingAircraftCarrier.SetPosition(random.Next(0, pictureBoxAircraftCarrier.Width),
_drawingWarship.SetPosition(random.Next(0, pictureBoxAircraftCarrier.Width),
random.Next(0, pictureBoxAircraftCarrier.Height));
Draw();
}
/// <summary>
/// Îáðàáîòêà íàæàòèÿ êíîïêè "Create Warship"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCreateWarship_Click(object sender, EventArgs e)
{
Random random = new();
_drawingWarship = new DrawingWarship(random.Next(100, 300),
random.Next(1000, 3000), Color.FromArgb(random.Next(0, 256),
random.Next(0, 256), random.Next(0, 256)), pictureBoxAircraftCarrier.Width, pictureBoxAircraftCarrier.Height);
_drawingWarship.SetPosition(random.Next(10, 100), random.Next(10, 100));
Draw();
}
/// <summary>
/// Îáðàáîòêà íàæàòèÿ êíîïîê äâèæåíèÿ
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonMove_Click(object sender, EventArgs e)
{
if (_drawingAircraftCarrier == null)
if (_drawingWarship == null)
{
return;
}
@ -65,19 +86,57 @@ namespace ProjectAircraftCarrier
switch (name)
{
case "buttonUp":
_drawingAircraftCarrier.MoveTransport(DirectionType.Up);
_drawingWarship.MoveTransport(DirectionType.Up);
break;
case "buttonDown":
_drawingAircraftCarrier.MoveTransport(DirectionType.Down);
_drawingWarship.MoveTransport(DirectionType.Down);
break;
case "buttonLeft":
_drawingAircraftCarrier.MoveTransport(DirectionType.Left);
_drawingWarship.MoveTransport(DirectionType.Left);
break;
case "buttonRight":
_drawingAircraftCarrier.MoveTransport(DirectionType.Right);
_drawingWarship.MoveTransport(DirectionType.Right);
break;
}
Draw();
}
/// <summary>
/// Îáðàáîòêà íàæàòèÿ êíîïêè "Øàã"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonStep_Click(object sender, EventArgs e)
{
if (_drawingWarship == null)
{
return;
}
if (comboBoxStrategy.Enabled)
{
_abstractStrategy = comboBoxStrategy.SelectedIndex switch
{
0 => new MoveToCenter(),
1 => new MoveToBorder(),
_ => null,
};
if (_abstractStrategy == null)
{
return;
}
_abstractStrategy.SetData(new DrawingObjectWarship(_drawingWarship), pictureBoxAircraftCarrier.Width, pictureBoxAircraftCarrier.Height);
comboBoxStrategy.Enabled = false;
}
if (_abstractStrategy == null)
{
return;
}
_abstractStrategy.MakeStep();
Draw();
if (_abstractStrategy.GetStatus() == Status.Finish)
{
comboBoxStrategy.Enabled = true;
_abstractStrategy = null;
}
}
}
}

View File

@ -118,6 +118,195 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="buttonLeft.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="buttonRight.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
G22ADWYWMgdLywwxeZlZyBwsLTPE5GVmITOwLS7z/BBcZMrhyjx9i3uLTFnIPH6Le4tMechc/2njRn6m
YFtB5vlGi0yLK/Pxl80WmXKRebzRrr1BcZ5ZKEPD4bSNzG6/QaaNzFUnL2XkZxJWkvnvZ7QrbFBGfiZh
LZndipOXMvIzCavJfPqMdoUNysjPJKwmc8XJSxn5mYT1ZK43eSkjP5Owosxht9IGZeRnElaUudrTxmXk
ZxLWlHm60a6wQRn5mYRVZQ4NMm1kHm+0K2xQRn4mYV2ZjzfaFTYoIz+TsLLMy0NwF5Z5+QmTBoWzyuSl
j58Ah9M/5Omv45FpIPPp+ASZDjIvN1pkGrxmPt1okWlxZa4weemr63VcQOZpxB2ZJjIXn7z01fUqtkvI
PN5okWlyZR5H3JFpI7PfIdNGZrdtl9ygr65XsV1I5ulb3BfboK2uGFfmsk8b99X1Oi4l8+kwbLENivPM
illu8lK+uqLI7HfIrIzLyVxu8lK+usLIXGzyUr664sjsG2TayFxq8lK+ugLJXGjyUr66IsnsF5m8lK+u
UDLHzQIblK+uSDLP3+IuZHrIHBZ42rh8dcWSucTTxvXL2FtbZn+60SLTQubpcRnINJF5utHWlXn5CZMG
9XMccedwOvXh9A8ZkOkjs/uETB+ZtScvfxl7P2O7iszHGy0yK+A6MitPXt7z/7XN5vRfZlxJZv/7JobM
Vpcfv/vjHOVFfevWSdXJy5v/YbP584tRPncr5XyjXVnm5q+u78js1Hza+K3/8NElKZJts7bM5mtHCqXe
08Zv/IcfVnuN8Uu/W1kmF2bBPN5o15TJhVk0NZ82rjfPyv6vIwVTafLyRplr/Yptmn5s1pPJXbZ0qkxe
3ibzfUfK5vLX8SvI5JfM8hlXk8lLZvlUmLy8SaaQWT4VJi9vksn7nxopP3l5k8x3HSmf44j7GldmRyqk
+NPGb5L5sSM1Mm6QaZN+3yLTJgNXplE+IdMnZZ82ftNZGTKrpezkJTLXzbhBpk2+7JDpk6FBpk++b5Bp
k4KTl7f8Qz6brZpyk5dcmeun2OQlMtfP00cHyHTIFplGOSDTJ32zmEzezVbPyJVplAMyfXI6p17ir8CQ
uUAKTF4iM0zmT14iM0zmT14iM05mT14iM05mT14iM1AGrkyjjMj0yczJS2SGyoBMo4zI9MmXHTJ9MiDT
KHtk+uT4jhaZLtnyV2BG+X735CUyw+X+yUtkxssWmUY5INMnlxstMi0y1pPJ3OziOXBl+qRvkOmTEZlG
OSDTJ0ODTJ+MvJs1yoEr0ydDg0yfPD2X6GaZl3CeGTD94RUpHE4ny2XEHZkWGZHpky8HZPpkQKZRPiHT
J1MmL5EZPQMyjbJHpk8uD8FFpkX+0yDTJ3tk+uRyfIJMixyQ6ZPzY4n4KzCLDG874nA6TQ7I9Mn/I9Mn
IzJ9MiDTJ1/KyWRudu3c+HdEXJkZcvrrW2SaBJlGOSDTJ1yZRiknk3ezq4cr0yf8amKUvm35KzCXDBtx
OO2S/yDTJv0nIdMmB2TaZBAybXLrQBcyE4RRS58MQqZL+v0GmS4Z+MMhm/AnfUbhj219wp/B+4QvqDDK
pK+OufyE88yYOb2TvcURh9Ph0++FTJecP5RFpkOGnZBpkqfP8ZBpkPFNe3fIZG52lQxtDZlcmWuk51EY
Pqn0kBpkrhAeH2UUHuzmk2qPXOTd7OIZmpYr0yU8ptgndz5A/BLOMyPlMvbz5gHmFSIzYm6drURm/Gxv
na1EZvjcPluJzPC5fbYSmdGzbZHpkimzlcgMnn2LTJdMemAmMkPn9F2kyPTIpxaZLhlaZLrkfJNFpkXG
FpkuGZqZMi8/4Txz/dwxW3mFyAyTsUWmS+6ZrURmzPSHFpkuuWu2Epkhc99s5R0ymZutnv6+2UquzIiZ
MVuJzGC5fFyATIccWmS6ZNsi0yVPhyW8mzXIfsOV6ZLt/faQGSzHAfZCMi/hPHO1zJitvEJkrp1ti0yX
zJqtRGas7FtkumTbItMlM2crkRkpn1pkumTubCUy46Q/rCDzfUdqZNysIPNdRypkaLSCTE5NauT4Dexr
XJmfO1I8x8dcrCBT3zpSOqfHXKwgs0Fm8Zwfc1FY5uUnr5+V/daRwikzW3mFN/1DftEsnUKzlffI/MA7
oMIpNFt5j8wNL5plU2q28h6Z7deOFEyx2cq7rkzus0VTbLbyLpkNl2bBbButKZMPgQqm8GzldJlcmuVy
/LhgVZna/NWRItkWtHenTGwWyvkb2FeWqc2fX4yy2nuA75sIMtVuLj9+98c5SoxrfQxyeczF6jL/xfan
ZMT2oVsl/e+KJjM/riXz+6b2BlX6YC0BriNzqLpB/TL2Isjsf0emjczSs5XIPOMaMovPViLzjCvI7PdC
povM8rOVyDzj8jKHRsg0kVljthKZZ1xc5ripvkH9MvZWljk09TcoX12hZPZ3PhMcmbfgwjLHzQIblK+u
SDIvN1lkOsg8LLJB+eoKJHNcZoOcZy6QerOVV2ir6w1cUma92UpknnBBmaexn0U26Ksrisyas5XIPGU5
meePCxbZoK2uKFfmdsEN+up6HZeSeb7JItNCZv3Zyh/QV9eruNRr5rZdcoO2ukJcmf1u0Q366nodl5G5
b5HpInNokenymnn8UhFkmlyZn1pkykTmsMoGxXlmhRwH2JfdoHx1vY71ZS4wW3mF8tX1OlaXucRs5RXK
yM8krC1zkdnKK5SRn0lYW+Yis5VXKCM/k7CyzGVmK69QRn4mYV2Z/WGNDcrIzySsK3Nskekic2iQaSPz
0CLTRea40gZl5GcSVpQ57FbaoIz8TMKKMg9rbVBGfiZhPZnjahuUkZ9JWE1m2WeCT0ImDUrn8pnsKhv0
8RPjcHpcc4NGfiZhJZkLz1ZeoZGfSVhJ5qFFpstr5rZFpsuVufhs5RUa+ZmEVWTuW2TKROZ27Q0a+ZmC
NV4zzx8XINPiytyvvkEjP5OwvMxh/Q1mFjIHi8t8+kwWmQavmWOADSYWEurK/OdZQshML7Ov9UzwySjO
M+dmjLBBZRYyB8vKXGm28gqVWcgcLCqzP7TIdJE5xtigMguZgyVlnt/Jrr9BZRYyB0vKPATZoDILmYMF
ZY5RNqjMQuZgOZl9E2WDyixkDpaTeQizQWUWMgeLydzG2aAyC5mDpWT2O2TayNxvkOkicxtpg8osZA6W
kXn8BnZkmsg8fgN7IJmXnzBpcE+GYBtMLGT1w+n1ZyuvMLOQOVhC5j7aBjMLmYMFZA7hNpjKQDks8JoZ
YbbyCjMZiHVljvE2mMpAQZwtM8Rs5RWmMlAQ58rs9wE3mMpAOZz9mjlukOlyZR6/HDjeBlMZKIjzZPaL
PRN8EqYyUBDnyRxjVpfKQDmc95o57GJuMJOBKFdmv+AzwSdhKgMFcY7My1eqxdygOM+ckqePC8JtUKkM
FMQZMg9RN6hUBgri/TK3YTeoVAYK4t0yI81WXqFSGSiId8uMNFt5hUploCDeK3PbCJkmMmPNVl6hUhko
iHfKPH5cgEwPmdtGyGw9ZPa70BtUKgMF8S6Z3zehN6hUBgriPTJXeCb4JFTsyuvhHTLPN1lktg4yn54l
hMz8MofwG2TS4NbE+d7KlzH8AivhZJkhZyuvMPwCK+FUmTFnK68w/AIr4USZ/V7IdHnNHFN0FX6BlXCa
zPPHBeE3GH6BlXCSzLCzlVcYfoGVcJLM0LOVP2D4BdbBSa+Zwy7JBsMvsBJOkNmv+UzwSRh+gZVwgswx
zQbDL7AS3i5zaJBp85p5aJHpcmWOLTJdZB6/gT3VBsV55osJPVt5hYq+wFp4o8xtpg0q+gJr4W0yg89W
XqGiL7AWPtx8k0VmayFz26TaoKIvsBY+3HyTRWbrIDP8bOUVSrnWWwxvkLnNtkElW28xfLjhJotMG5n7
FpkuMocWmS4yT9/AnmyDSrbeYvjw9k0WmSYyh4wbVLL1FsOHt2+y+WRefsKkwU/JMlt5hdnWWwpflXn5
e3dkGsjMM1t5hdnWWwof3r7JIrPN/5qZaLbyCrOttxS+LLM/tMh0kTm2yHSRefwGdmSmwpdfMw8tMmVy
ZY6ZN5htvaXwBZl9k3mD2dZbCNuvL99kkZkNf3v5JovMbPj+2ZvsLvcG29zLvxuflbk32KB+wfPMzefn
brK5N6jcy5+B3567yebeoHIvfwY+PHeTzb1B5V7+DPx47XJokZkVP3x+5p1s7g0q9/Ln4Ldn3snm3pFy
L38O/nyf3RrsSLmXPwu/Xd9kkZkXP/7wqvnJYUfKvfx5+PXqJovMzPjX028lO4sdKffy5+Kfpzvtduex
I+Ve/mz84++//v7eCJkO2Jx/hkwwGP6y55mWSBNGSBNGSBNGSBNGSBNGSBNGSBNGSBNGSBNGSBNGSBNG
SBNGSBNGSBNmKA4DLVA04YOiCR8UTfigaMIHRRM+KJrwQdGED4omfFA04YOiCR8UTfigaMIHRRM+KJrw
QQ4DnZAmjJAmjJAmjJAmjJAmjJAmjJAmjJAmjJAmjJAmjJAmjJAmjJAmjJAmzFAcBlqgaMIHRRM+KJrw
QdGED4omfFA04YOiCR8UTfigaMIHRRM+KJrwQdGED4omfFA04YMcBjohTRghTRghTRghTRghTRghTRgh
TRghTRghTRghTRghTRghTRghTRghTZihOAy0QNGED4omfFA04YOiCR8UTfigaMIHRRM+KJrwQdGED4om
fFA04YOiCR8UTfigaMIHOQx0QpowQpowQpowQpowQpowQpowQpowQpowQpowQpowQpowQpowQpowQpow
Q3EYaIGiCR8UTfigaMIHRRM+KJrwQdGED4omfFA04YOiCR8UTfigaMIHRRM+KJrwQdGED3IY6IQ0YYQ0
YYQ0YYQ0YYQ0YYQ0YYQ0YYQ0YYQ0YYQ0YYQ0YYQ0YYQ0YYQ0YYbiMNACRRM+KJrwQdGED4omfFA04YOi
CR8UTfigaMIHRRM+KJrwQdGED4omfFA04YOiCR/kMNAJacIIacIIacIIacIIacIIacIIacIIacIIacII
acIIacIIacIIacIIacIMxWGgBYomfFA04YOiCR8UTfigaMIHRRM+KJrwQdGED4omfFA04YOiCR8UTfig
aMIHRRM+yGGgE9KEEdKEEdKEEdKEEdKEEdKEEdKEEdKEEdKEEdKEEdKEEdKEEdKEEdKEGYrDQAsUTfig
aMIHRRM+KJpwwbb9L4jsPs2xdH95AAAAAElFTkSuQmCC
</value>
</data>
<data name="buttonUp.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAA5gAAAOYBAMAAABC5kGOAAAABGdBTUEAALGPC/xhBQAAABJQTFRF5ubm
@ -219,95 +408,6 @@
pBOOkE44QjrhDI3DQBdodMIPGp3wg0Yn/KDRCT9odMIPGp3wg0Yn/KDRCT9odMIPGp3wg0Yn/KDRCT9o
dMIPGp3wgxwGekI64QjphCOkE46QTjhCOuEI6YQjpBOOkE44QjrhCOmEI6QTjpBOOEI64QjphBc0+z+G
ED9UnMHLKAAAAABJRU5ErkJggg==
</value>
</data>
<data name="buttonLeft.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAA5gAAAOYBAMAAABC5kGOAAAABGdBTUEAALGPC/xhBQAAABJQTFRF5ubm
////AAAAIyMjycnJiIiI9drrEwAAAAlwSFlzAAAOwQAADsEBuJFr7QAAE2hJREFUeNrtncty01wWRqUK
nkvV9gvIZE6bMCdtmJME3v9VmkC4JU4sW/t2vqxdXdX/YqKtvUqfFZ0juxvHoftZ488Cm0VkIhOsiMhE
JlgRv1f/8E+gADIJIWQSQsgkhJBJCCGTEEImIYRMQgiZhBAyCSFkEkLIJISQSQghkxBCJiGDLAbqIDKR
CVZEZCITrIjIRCZYEZGJTLAiIhOZYEVEJjLBiohMZIIVsWMxUAqZhBAyCSFkEkLIJISQSQghkxBCJiGE
TEIImYQQMgkhZBJCyCSEkEkIIZOQQRYDdRCZyAQrIjKRCVZEZCITrIjIRCZYEZGJTLAiIhOZYEVEJjLB
itixGCiFTEIImYQQMgkhZBJCyCSEkEkIIZMQQiYhhExCCJmEEDIJIWQSQsgkhJBJyCCLgTqITGSCFRGZ
yAQrIjKRCVZEZCITrIjIRCZYEZGJTLAiIhOZYEXsWAyUQiYhhExCCJmEEDIJIWQSQsgkhJBJCCGTEEIm
IYRMQgiZhBAyCSFkEkLIJGSQxUAdRCYywYqITGSCFRGZyAQrIjKRCVZEZCITrIjIRCZYEZGJTLAidiwG
SiGTEEImIYRMQgiZhBAyCSFkEkLIJISQSQghkxBCJiGETEIImYQQMgkhZBIyyGKgDiITmWBFRCYywYqI
TGSCFRGZyAQrIjKRCVZEZCITrIjIRCZYETsWA6WQSQghkxBCJiGETEIImYQQMgkhZBJCyCSEkEkIIZMQ
QiYhhExCCJmEEDIJGWQxUAeRiUywIiITmWBFRCYywYqITGSCFRGZyAQrIjKRCVZEZCITrIgdi4FSyCSE
kEkIIZMQQiYhhExCCJmEEDIJIWQSQsgkhJBJCCGTEEImIYRMQgiZhAyyGKiDMjJ//F/bp7AYVWQOn799
+Pap6VNYjiIy13fT99p+bfgUDFBD5vr23uX3+tDsKSDzF95Nv+qq1VNA5gNe/HY5bW9GZLZ8NuvdH5nT
5YjMls/mbvq7bpDZ8Nms/nF5f2kis9Wz+Sdk7z81r5HZ7NncTo/qBpmtns3qscvpLTIbPZvHIfvjQxOZ
bZ7N/onLadu/Wpltr+A9Ddnv9YXF6RbbPxCyyGy1/f0hl9M7ZDbY/uagy58P29s8o9crc9gdlvmWK7O9
9g+HLDJbbP+ZkL1/atDoGRlgo+0PtxNX5hNstP3nQhaZ7bW/2SFTRebzIctnZnPtPx+yXJmNtd+vdsgc
RWS+FLLIbKv9F0P2NX9mtriCt969LJPF6YbafzFkkdlU+6sJmQexQZlHQhaZLbV/JGSR2VD7x0IWme20
fzRkkdlO+3cTMkVk9sdDFpmt9DsjZJHZSL/DjJBFZhv9zgpZZLbR76yQRWYb/c4KWWS20O/MkH3NMttZ
sht2c2WyOF2+3/2EzKPYSL+babbMsY0z8sA2+h1uJ65MFZmzQxaZ1ft9eW8lMn9jC/2u54csn5nF+z0l
ZLkya/d7Usgis3a/wykhi8zaDZ4Usnxmlm7wtJDlyqzc4Ikhi8zCDZ4assis22B/asjyFth9PfxLNTw1
ZFmcLtvg7BVpZHblZa53yBxFZA6nhywyizbYf56QOR9ryzwnZJFZs8HhbkLmCVhZ5jl3ssgs2uB5IYvM
ig2eGbLILNjguSGLzIINnhuyyCzY4Lkhi8x6DW4mZHYiMs96jvfqZdZcozt9RfpvmSxOV2rwjBVpZFaV
uV4QsuzOK9bRkpDlyizV0bKQRWapjoZFIYvMSh0tDFk+Myt1tDBkuTILdbQ0ZJFZqKOlIYvMOh2td8tl
jo0ZMMRaHS0OWa7MMh2tJmQuwUodGYQsMqt0ZBCyvAV2Xw//kojnbWB/KpPF6QIdmYQsMmt0dDchcwkW
ktmvJmSqyDQKWWRW6MgoZJFZoKPNhMxOROawQ+ZSLCNzPyFzKVaRaReyyMzuaLhF5nIsItMwZJGZ3NFm
h0wDLCHTNGSRmduRacjyFth9ZWG/2hnLZHE6rQXjkEVmZgvGIcvuvMQW1jtzmVyZWS1Yhywy81pYTcg0
xNQW7EOWz8y0Fu4mB5lcmSktOIQsMpNa8AhZZCa14BGyfGbmtLCZfGRyZca34BOyyExpYT8hU0Rmv5q8
ZI5Sfk7AtFU4r5BlcTqhBa+QRWZ8C5sJmdaYJXN9i0xzzJLpF7LIjG7BMWSRGdzCcItMGZmeIYvM2BY2
O2SqyPQNWWRGHrP3DVlkBh7TfAM7MvNkeocsMuOO6R6yyIw7pnvI8hbYfcWge8iyOB12zIsJmZ4Yecz1
LkLmqKzrZYw8ZkDIcmUGHXM1IVNFZkjIIjPkmE4b2J/KHJV1vYxRxzT6BvYZMrky3Y8ZFLLIjDhmUMgi
0/+Y/WoKkzkq66ogMyxkuTLdDzKEhSwyvQ8SGLLI9D5IYMjyFth9PfyLC+6nSJksTnseczMhU0XmcItM
FZl9aMgi0/Mg/WqHTBWZwSGLTMeDRIcsMv0OEh6yyPQ7SHjIItPtIPEhi0y3g8SHLDK9DpIQssh0OkhG
yCLT6SBvEkIWmU4HyQhZ3gK7L3MM21v5qNgD5HCQnJD9S+ZD9Q1jFZmR237+qcuPD+18+lkNY9+PJWRm
hew0bd8L1de+gsx1Usiq1Ye+gMyskJWre5u5MkP3VorX1ZAsk5C1q+3HXJkDIWtYV0OmTELWtLbXmTIJ
Wdu6GhNlErK2dZl4ZW4myrS212kykxZLlOsmTWbKirR2vZtnwXxhrV9x92Nel8McC/Yy14SsfV12KTJ7
Qtahth8zZBKyPnWdIZM7WZ/KuDIJWaf6kiBzQ8j61E2CTELWqRJkXkyUT8XLZLHEreJlsljiVuEyWZH2
q2iZhKxjRcskZB0rWCYh61nzZLK3som6mSnFRiYh61qRMtlb6VzXgTIJWeeKvDIJWecKlMneSu+Kk8li
iXvFyWRF2r3CZLIi7V9Rd7OEbEBFXZmEbEAFySRkIypGJiEbUjEyCdmQCpFJyMbUPJnsrWyiIhanCdmg
CpDJYklUBcgkZKPKXyYb2MPKXSYhG1fuMgnZuPKWybafwHKWSchGlrNMtv1Elq9MQja0XGUSsrHlKZMv
Bw4uR5lsYI8uR5mEbHQ5vgXGYkl0+S1Os4E9vNxksiIdX277ZgnZ+PK6MgnZhHKSSchmlJNMQjajfGSy
tzKlXGSyIp1TLnezhGxOOVyZfAN7VjnI5GcusspeJt/Anlb2MgnZtDKXyeOCvDJ/C4wN7HllvTjNinRi
WcskZBPLWCbbfjLLViYhm1qmMrmTzS1LmTzHSy7TK5MLM7csZbJVJLkMZfJQNrssr0xSNrkMZZKy2WUo
84J72eSyk9n/b6Jyy1AmH5nZZfgWGCmbXXaL0wMys8tO5nqikusamTrFlSlUdjJ5ZpBeXJlCZSiTu9ns
4k8ToTJ8C+z9ROWW4Y52Hudll6FM1qazy1DmfyYqtwxl8odmdlm+BcaHZnIZvgXGhq7sYqulUFnK5O2E
5DLd0c47YLll++IQe7pSi1f6hIqXbYWK1+CFii+oECrzn8Lgq2Pyyv53TQjatLKXuWGROqscfnGIR7RZ
5SCTp3pZ5fFbYHxDe1J5/BbYQNDmlMsX7hO0OeX0UxgTlVBOvwVG0GYUPx8lVPywm1C5/X4mQRtffj+G
yh+b4cXPFAuV2y/bErTx5Xdlsk4dXo4yCdro8pQ53k1UZLnKJGhjy1Vm/3miAsv8t8D+RYI2sjwWp9l5
mVTOMtniHlneMtl5GVjuMtfsvAwrd5k81Ysrf5kEbVgFyOSONqoCZBK0URUhkw1BQRUhc+R3NWMq5Mrk
655iKkQmW9xjKkZmz1O9iIqRyffqhZTHW2AHd14StP7lujj9N7IhyL/CZPLowL+uw2Syxd294q5Mgta9
AmWyIci7ImWyfOJckTJ5dOBckTK7gaB1retImXy5sG+FXpkdW9xdK1YmyyeuFSyzY+elY0XLZPnEsaJl
ErSO5fwW2AHkjtatghan/0a+xd2rEmQStF6VIJOdl16VcWVyR+tUGTK5o3Wq6wyZPUHrUh8zZPLowKW2
KVdm160JWvu67HJksk7tUJdDjsyuI2jN6ypNJk/1zOtLlyWToLWuX/c/CTK7Yc+1aVqXQ57Mji3utvXf
mTIN1zPZeelU2+vZFhxksvPStK66VJnc0RrW99ufXJkErV19/yMzVyZBa1Yf+i5bJkFrUrsfLtNl5m1x
374Xqq/9UEBm3jr1ryWG7tPP+tgu9t142ti9ZPZvkoL27UMX4zD2P/7XMJ46di+ZaUH71u2M6qPfQZK+
XPj3lYlMS8y5o+XK9DlIyhZ3ZDod5BaZOjI3CUH7ej8zXdYz/2DGzsu3rmdUGL1lZuy8RKbXQRK2uCPT
7SDxQYtMv4OEP6NFpt9Bwtepkel4kD545yUyPQ8yIFNHZvCXCyPT95h7ZOrIDA1aZDofc4NMHZmRQYtM
72MGrlMj0/2YG2R6Yxe27Bb3VI/Faf9jhgUtMv2PGbbzkt15AceM+l0irsyIYwYFLTJDjrlCpo7MmJ2X
fGbGHDMkaLkyg455gUxXjD3mLTI9MfaYAVvc+cwMO6b/8glXZtgx/Z/RIjPumO5Bi8zAY3oHLW+BBS67
eQcti9ORLWyQqSPTOWiRGdqCb9AiM7aFDTJ1ZLoGLTKDW/B8Ox6Z0S1skGmOaTIdgxaZ4S34rVMjM76F
DTKNMVGm2x+byExowStokZnQgtfXkCAzowWnoOUtsJRVOJ+gZXE6p4UVMm0xtQWPoGV3XlILHkHLlZnV
wgUyLTG5hVtkGmJyC/ZBy2dmXgvmyydcmXktmD86QGZeC+ZP9ZCZ2IL1t7jzmZnZgvGGIK7MzBaMgxaZ
qS0Me2TaYIWOTP/Y5C2w5EU5yw1BLE5nd7RH5mIsI9PwW9yRmd6R3dvxyMzv6A6ZnYxMsztaZOZ3ZPbl
wsgs0JFV0CKzQkdGQYvMCh0ZBS0yS3Rks06NzBId9W92yDwfa8m0WadGZpGOLO5okVmko371HpnnYldu
UW550LI4Xaaj5Xe0yCzTUb9aekfL7rw6HS2+o+XKLNTR0p2XyCzU0dKgRWapjpYFLZ+ZpRpcFrRcmaUa
XLbFHZm1Guz3O2SegyUbXLJOzWdmsQaXBC1XZrkG98gcZWSev8UdmfUaPHuLO2+B1VujO3udmsXpgg2e
e0eLzIINnntHi8yKDZ4ZtMgs2eD6PTJPwNoyz/tjE5k1GzxrQxAyizZ4zh0tMos2eM4dLTLL9nuLTB2Z
pwctMuv2e4FMHZknBy0yC/d7atAis3K/e2TOwq6FJbsTHx2wOF253xO3uCOzdL+nPaNld17tfk/a4s6V
Wbvfk57qIbN6v3tkjjIyT7ij5TOzfL8brkwdmfMfHSCzfr+zt7gjs4F+525x5zOzhX7vdlyZR7CdftfI
PIYN9btC5hFsqd9ZW9x5C6yNJbtZQcvidBv9znpGi8xW2r9Dpo7MGUGLzGbaXyFTR+bxnZfIbKf9o0GL
zIbav0DmYWxR5rGgRWZL7R8JWmQ21f4emYewTZkvBy0y22r/xXVqZLbV/otBi8zG2n9piztvgbW2gvdC
0LIHqLn2nw9adho01/7zW9yR2V77G2Q+xWbb3/OZ+QSbbf+5Le5cmS22/0zQXo3NntErlvlM0L7jymyx
/cPLJ1+Q2WT7K2R2MjIPfYv79hqZbbZ/IGi3HTLbbL///ETm2wGZjbb/NGi/cGU22/7j5ZPt9euV2f6C
3qM72stXtID5CAVkPtoQdIPMls/mnzvayxGZTZ/NX0G7vRmR2fbZ/LmjvWr1FJD5C39v7/rQ7Ckg8zeu
f1yb268Nn4IBisjshs/f7r59bPoUlqOKzB//NbR9Couxe72nrofIRCZYEZGJTLAiIlNJZveal3L1kEkI
IZMQQiYhhExCCJmEEDIJIWQSQsgkhJBJCCGTEEImIYRMQgiZhBAyCRlkMVAHkYlMsCIiE5lgRUQmMsGK
iExkghURmcgEKyIykQlWRGQiE6yIHYuBUsgkhJBJCCGTEEImIYRMQgiZhBAyCSFkEkLIJISQSQghkxBC
JiGETEIImYQMshiog8hEJlgRkYlMsCIiE5lgRUQmMsGKiExkghURmcgEKyIykQlWxI7FQClkEkLIJISQ
SQghkxBCJiGETEIImYQQMgkhZBJCyCSEkEkIIZMQQiYhhExCBlkM1EFkIhOsiMhEJlgRkYlMsCIiE5lg
RUQmMsGKiExkghURmcgEK2LHYqAUMgkhZBJCyCSEkEkIIZMQQiYhhExCCJmEEDIJIWQSQsgkhJBJCCGT
EEImIYMsBuogMpEJVkRkIhOsiMhEJlgRkYlMsCIiE5lgRUQmMsGKiExkghWxYzFQCpmEEDIJIWQSQsgk
hJBJCCGTEEImIYRMQgiZhBAyCSFkEkLIJISQSQghk5BBFgN1EJnIBCsiMpEJVkRkIhOsiMhEJlgRkYlM
sCIiE5lgRUQmMsGK2LEYKIVMQgiZhBAyCSFkEkLIJISQSQghkxBCJiGETEIImYQQMgkhZBJCyCSEkEnI
IIuBOohMZIIVEZnIBCsiMpEJVkRkIhOsiMhEJlgRkYlMsCIiE5lgRexYDJRCJiGETEIImYQQMgkhZBJC
yCSEkEkIIZMQQiYhhExCCJmEEDIJIWQSQsgkNHAc/w9ZWidsekADXAAAAABJRU5ErkJggg==
</value>
</data>
<data name="buttonDown.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@ -405,106 +505,6 @@
QiY5DNRJMMEkPSaYYJIeE0wwSY8JJpikxwQTTNJjggkm6THBBJP0mInDQKlkJISSkRBKRkIoGQmhZCSE
kpEQSkZCKBkJoWQkhJKREEpGQigZCaFkJISSkZBJDgN1EkwwSY8JJpikv0zp/814JuW3a02NAAAAAElF
TkSuQmCC
</value>
</data>
<data name="buttonRight.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
G22ADWYWMgdLywwxeZlZyBwsLTPE5GVmITOwLS7z/BBcZMrhyjx9i3uLTFnIPH6Le4tMechc/2njRn6m
YFtB5vlGi0yLK/Pxl80WmXKRebzRrr1BcZ5ZKEPD4bSNzG6/QaaNzFUnL2XkZxJWkvnvZ7QrbFBGfiZh
LZndipOXMvIzCavJfPqMdoUNysjPJKwmc8XJSxn5mYT1ZK43eSkjP5Owosxht9IGZeRnElaUudrTxmXk
ZxLWlHm60a6wQRn5mYRVZQ4NMm1kHm+0K2xQRn4mYV2ZjzfaFTYoIz+TsLLMy0NwF5Z5+QmTBoWzyuSl
j58Ah9M/5Omv45FpIPPp+ASZDjIvN1pkGrxmPt1okWlxZa4weemr63VcQOZpxB2ZJjIXn7z01fUqtkvI
PN5okWlyZR5H3JFpI7PfIdNGZrdtl9ygr65XsV1I5ulb3BfboK2uGFfmsk8b99X1Oi4l8+kwbLENivPM
illu8lK+uqLI7HfIrIzLyVxu8lK+usLIXGzyUr664sjsG2TayFxq8lK+ugLJXGjyUr66IsnsF5m8lK+u
UDLHzQIblK+uSDLP3+IuZHrIHBZ42rh8dcWSucTTxvXL2FtbZn+60SLTQubpcRnINJF5utHWlXn5CZMG
9XMccedwOvXh9A8ZkOkjs/uETB+ZtScvfxl7P2O7iszHGy0yK+A6MitPXt7z/7XN5vRfZlxJZv/7JobM
Vpcfv/vjHOVFfevWSdXJy5v/YbP584tRPncr5XyjXVnm5q+u78js1Hza+K3/8NElKZJts7bM5mtHCqXe
08Zv/IcfVnuN8Uu/W1kmF2bBPN5o15TJhVk0NZ82rjfPyv6vIwVTafLyRplr/Yptmn5s1pPJXbZ0qkxe
3ibzfUfK5vLX8SvI5JfM8hlXk8lLZvlUmLy8SaaQWT4VJi9vksn7nxopP3l5k8x3HSmf44j7GldmRyqk
+NPGb5L5sSM1Mm6QaZN+3yLTJgNXplE+IdMnZZ82ftNZGTKrpezkJTLXzbhBpk2+7JDpk6FBpk++b5Bp
k4KTl7f8Qz6brZpyk5dcmeun2OQlMtfP00cHyHTIFplGOSDTJ32zmEzezVbPyJVplAMyfXI6p17ir8CQ
uUAKTF4iM0zmT14iM0zmT14iM05mT14iM05mT14iM1AGrkyjjMj0yczJS2SGyoBMo4zI9MmXHTJ9MiDT
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
</value>
</data>
</root>

View File

@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProjectAircraftCarrier.DrawingObjects;
namespace ProjectAircraftCarrier.MovementStrategy
{
/// <summary>
/// Интерфейс для работы с перемещаемым объектом
/// </summary>
public interface IMoveableObject
{
/// <summary>
/// Получение координаты X объекта
/// </summary>
ObjectParameters? GetObjectPosition { get; }
/// <summary>
/// Шаг объекта
/// </summary>
int GetStep { get; }
/// <summary>
/// Проверка, можно ли переместиться по нужному направлению
/// </summary>
/// <param name="direction"></param>
/// <returns></returns>
bool CheckCanMove(DirectionType direction);
/// <summary>
/// Изменение направления пермещения объекта
/// </summary>
/// <param name="direction">Направление</param>
void MoveObject(DirectionType direction);
}
}

View File

@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAircraftCarrier.MovementStrategy
{
/// <summary>
/// Стратегия перемещения объекта в центр экрана
/// </summary>
public class MoveToBorder : AbstractStrategy
{
protected override bool IsTargetDestinaion()
{
var objParams = GetObjectParameters;
if (objParams == null)
{
return false;
}
return objParams.RightBorder + GetStep() >= FieldWidth &&
objParams.DownBorder + GetStep() >= FieldHeight;
}
protected override void MoveToTarget()
{
var objParams = GetObjectParameters;
if (objParams == null)
{
return;
}
var diffX = objParams.RightBorder - FieldWidth;
if (Math.Abs(diffX) > GetStep())
{
MoveRight();
}
var diffY = objParams.DownBorder - FieldHeight;
if (Math.Abs(diffY) > GetStep())
{
MoveDown();
}
}
}
}

View File

@ -0,0 +1,59 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAircraftCarrier.MovementStrategy
{
/// <summary>
/// Стратегия перемещения объекта в центр экрана
/// </summary>
public class MoveToCenter : AbstractStrategy
{
protected override bool IsTargetDestinaion()
{
var objParams = GetObjectParameters;
if (objParams == null)
{
return false;
}
return objParams.ObjectMiddleHorizontal <= FieldWidth / 2 &&
objParams.ObjectMiddleHorizontal + GetStep() >= FieldWidth / 2 &&
objParams.ObjectMiddleVertical <= FieldHeight / 2 &&
objParams.ObjectMiddleVertical + GetStep() >= FieldHeight / 2;
}
protected override void MoveToTarget()
{
var objParams = GetObjectParameters;
if (objParams == null)
{
return;
}
var diffX = objParams.ObjectMiddleHorizontal - FieldWidth / 2;
if (Math.Abs(diffX) > GetStep())
{
if (diffX > 0)
{
MoveLeft();
}
else
{
MoveRight();
}
}
var diffY = objParams.ObjectMiddleVertical - FieldHeight / 2;
if (Math.Abs(diffY) > GetStep())
{
if (diffY > 0)
{
MoveUp();
}
else
{
MoveDown();
}
}
}
}
}

View File

@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAircraftCarrier.MovementStrategy
{
/// <summary>
/// Параметры-координаты объекта
/// </summary>
public class ObjectParameters
{
private readonly int _x;
private readonly int _y;
private readonly int _width;
private readonly int _height;
/// <summary>
/// Левая граница
/// </summary>
public int LeftBorder => _x;
/// <summary>
/// Верхняя граница
/// </summary>
public int TopBorder => _y;
/// <summary>
/// Правая граница
/// </summary>
public int RightBorder => _x + _width;
/// <summary>
/// Нижняя граница
/// </summary>
public int DownBorder => _y + _height;
/// <summary>
/// Середина объекта
/// </summary>
public int ObjectMiddleHorizontal => _x + _width / 2;
/// <summary>
/// Середина объекта
/// </summary>
public int ObjectMiddleVertical => _y + _height / 2;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
/// <param name="width">Ширина</param>
/// <param name="height">Высота</param>
public ObjectParameters(int x, int y, int width, int height)
{
_x = x;
_y = y;
_width = width;
_height = height;
}
}
}

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectAircraftCarrier.MovementStrategy
{
/// <summary>
/// Статус выполнения операции перемещения
/// </summary>
public enum Status
{
NotInit,
InProgress,
Finish
}
}