Compare commits

...

3 Commits

Author SHA1 Message Date
803043d6b8 Edited from first lab 2023-10-19 20:58:56 +04:00
04570866d9 lab2 is done with amendment 2023-10-06 11:52:16 +04:00
28fd4805b7 lab2 is done 2023-10-06 10:43:19 +04:00
14 changed files with 845 additions and 242 deletions

View File

@ -0,0 +1,134 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProjectTank.DrawningObjects;
namespace ProjectTank.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

@ -1,28 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectTank
{
public enum DirectionType
{
/// <summary>
/// Вверх
/// </summary>
Up = 1,
/// <summary>
/// Вниз
/// </summary>
Down = 2,
/// <summary>
/// Влево
/// </summary>
Left = 3,
/// <summary>
/// Вправо
/// </summary>
Right = 4
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectTank
{
public enum DirectionType
{
/// <summary>
/// Вверх
/// </summary>
Up = 1,
/// <summary>
/// Вниз
/// </summary>
Down = 2,
/// <summary>
/// Влево
/// </summary>
Left = 3,
/// <summary>
/// Вправо
/// </summary>
Right = 4
}
}

View File

@ -0,0 +1,223 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProjectTank.Entities;
namespace ProjectTank.DrawningObjects
{
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawningArmoredTransport
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityArmoredTransport? EntityArmoredTransport { 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>
protected readonly int _transportWidth = 200;
/// <summary>
/// Высота прорисовки транспорта
/// </summary>
protected readonly int _transportHeight = 80;
/// <summary>
/// Координата X объекта
/// </summary>
public int GetPosX => _startPosX;
/// <summary>
/// Координата Y объекта
/// </summary>
public int GetPosY => _startPosY;
/// <summary>
/// Ширина объекта
/// </summary>
public int GetWidth => _transportWidth;
/// <summary>
/// Высота объекта
/// </summary>
public int GetHeight => _transportHeight;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
public DrawningArmoredTransport(int speed, double weight, Color bodyColor, int
width, int height)
{
if ((height > _transportHeight) && (width > _transportWidth))
{
EntityArmoredTransport = new EntityArmoredTransport(speed, weight, bodyColor);
}
_pictureWidth = width;
_pictureHeight = height;
}
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
/// <param name="transportWidth">Ширина прорисовки транспорта</param>
/// <param name="transportHeight">Высота прорисовки транспорта</param>
protected DrawningArmoredTransport(int speed, double weight, Color bodyColor, int
width, int height, int transportWidth, int transportHeight)
{
if ((height > transportHeight) && (width > transportWidth))
{
EntityArmoredTransport = new EntityArmoredTransport(speed, weight, bodyColor);
}
_pictureWidth = width;
_pictureHeight = height;
_transportWidth = transportWidth;
_transportHeight = transportHeight;
}
/// <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 + _transportWidth > _pictureWidth || y + _transportHeight > _pictureHeight))
{
_startPosX = 0;
_startPosY = 0;
}
else
{
_startPosX = x;
_startPosY = y;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public virtual void DrawTransport(Graphics g)
{
if (EntityArmoredTransport == null)
{
return;
}
Pen pen = new(Color.Black, 3);
Pen penGray = new(Color.Gray, 4);
Brush grayColorBrush = new SolidBrush(Color.Gray);
Brush blackColorBrush = new SolidBrush(Color.Black);
Brush bodyBrush = new SolidBrush(EntityArmoredTransport.BodyColor);
// Границы транспорта
// гусеницы
g.DrawEllipse(pen, _startPosX + 14, _startPosY + 44, 151, 31);
g.FillEllipse(blackColorBrush, _startPosX + 15, _startPosY + 45, 150, 30);
g.DrawEllipse(penGray, _startPosX + 24, _startPosY + 54, 10, 10);
g.DrawEllipse(penGray, _startPosX + 144, _startPosY + 54, 10, 10);
g.DrawEllipse(penGray, _startPosX + 44, _startPosY + 59, 10, 10);
g.DrawEllipse(penGray, _startPosX + 124, _startPosY + 59, 10, 10);
g.DrawEllipse(penGray, _startPosX + 64, _startPosY + 61, 10, 10);
g.DrawEllipse(penGray, _startPosX + 104, _startPosY + 61, 10, 10);
g.DrawEllipse(penGray, _startPosX + 84, _startPosY + 62, 10, 10);
// Кузов
g.DrawRectangle(pen, _startPosX + 19, _startPosY + 34, 141, 21);
g.FillRectangle(bodyBrush, _startPosX + 20, _startPosY + 35, 140, 20);
// Башня
g.FillRectangle(blackColorBrush, _startPosX + 75, _startPosY + 10, 25, 5);
g.DrawRectangle(pen, _startPosX + 64, _startPosY + 14, 66, 21);
g.FillRectangle(bodyBrush, _startPosX + 65, _startPosY + 15, 65, 20);
//Точки для отрисовки передней и задней части
Point pointFirstBackSide = new Point(_startPosX + 18, _startPosY + 35);
Point pointSecondBackSide = new Point(_startPosX + 18, _startPosY + 55);
Point pointThirdBackSide = new Point(_startPosX + 0, _startPosY + 55);
Point pointFirstFrontSide = new Point(_startPosX + 162, _startPosY + 35);
Point pointSecondFrontSide = new Point(_startPosX + 185, _startPosY + 55);
Point pointThirdFrontSide = new Point(_startPosX + 162, _startPosY + 55);
// Задняя часть
Point[] backSide = { pointFirstBackSide, pointSecondBackSide, pointThirdBackSide };
g.DrawPolygon(pen, backSide);
g.FillPolygon(bodyBrush, backSide);
// Передняя часть
Point[] frontSide = { pointFirstFrontSide, pointSecondFrontSide, pointThirdFrontSide };
g.DrawPolygon(pen, frontSide);
g.FillPolygon(bodyBrush, frontSide);
}
/// <summary>
/// Проверка, что объект может переместится по указанному направлению
/// </summary>
/// <param name="direction">Направление</param>
/// <returns>true - можно переместится по указанномунаправлению</returns>
public bool CanMove(DirectionType direction)
{
if (EntityArmoredTransport == null)
{
return false;
}
return direction switch
{
//влево
DirectionType.Left => _startPosX - EntityArmoredTransport.Step > 0,
//вверх
DirectionType.Up => _startPosY - EntityArmoredTransport.Step > 0,
// вправо
DirectionType.Right => _startPosX + _transportWidth + EntityArmoredTransport.Step < _pictureWidth,
//вниз
DirectionType.Down => _startPosY + _transportHeight + EntityArmoredTransport.Step < _pictureHeight,
_ => false,
};
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
public void MoveTransport(DirectionType direction)
{
if (!CanMove(direction) || EntityArmoredTransport == null)
{
return;
}
switch (direction)
{
//влево
case DirectionType.Left:
_startPosX -= (int)EntityArmoredTransport.Step;
break;
//вверх
case DirectionType.Up:
_startPosY -= (int)EntityArmoredTransport.Step;
break;
// вправо
case DirectionType.Right:
_startPosX += (int)EntityArmoredTransport.Step;
break;
//вниз
case DirectionType.Down:
_startPosY += (int)EntityArmoredTransport.Step;
break;
}
}
}
}

View File

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

View File

@ -1,182 +1,50 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ProjectTank.Entities;
namespace ProjectTank
namespace ProjectTank.DrawningObjects
{
public class DrawningTank
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawningTank : DrawningArmoredTransport
{
/// <summary>
/// Класс-сущность
/// </summary>
public EntityTank? _EntityTank { 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 _tankWidth = 200;
/// <summary>
/// Высота прорисовки танка
/// </summary>
private readonly int _tankHeight = 80;
/// <summary>
/// Инициализация свойств
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Цвет кузова</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="gun">Пушка</param>
/// <param name="machineGun">Пулемет</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 gun, bool machineGun, int width, int height)
public DrawningTank(int speed, double weight, Color bodyColor, Color
additionalColor, bool gun, bool machineGun, int width, int height) : base(speed,weight, bodyColor, width, height, 200, 80)
{
_pictureWidth = width;
_pictureHeight = height;
if ((_pictureHeight < _tankHeight) || (_pictureWidth < _tankWidth))
if (EntityArmoredTransport != null)
{
return false;
}
_EntityTank = new EntityTank();
_EntityTank.Init(speed, weight, gun, machineGun, bodyColor, additionalColor);
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 + _tankWidth > _pictureWidth || y + _tankHeight > _pictureHeight))
{
_startPosX = 0;
_startPosY = 0;
}
else
{
_startPosX = x;
_startPosY = y;
EntityArmoredTransport = new EntityTank(speed, weight, bodyColor,
additionalColor, gun, machineGun);
}
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
public void MoveTransport(DirectionType direction)
public override void DrawTransport(Graphics g)
{
if (_EntityTank == null)
{
return;
}
switch (direction)
{
//влево
case DirectionType.Left:
if (_startPosX - _EntityTank.Step > 0)
{
_startPosX -= (int)_EntityTank.Step;
}
break;
//вверх
case DirectionType.Up:
if (_startPosY - _EntityTank.Step > 0)
{
_startPosY -= (int)_EntityTank.Step;
}
break;
//вправо
case DirectionType.Right:
if (_startPosX + _tankWidth + _EntityTank.Step < _pictureWidth)
{
_startPosX += (int)_EntityTank.Step;
}
break;
//вниз
case DirectionType.Down:
if (_startPosY + _tankHeight + _EntityTank.Step < _pictureHeight)
{
_startPosY += (int)_EntityTank.Step;
}
break;
}
}
/// <summary>
/// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public void DrawTransport(Graphics g)
{
if (_EntityTank == null)
if (EntityArmoredTransport is not EntityTank tank)
{
return;
}
Pen pen = new(Color.Black, 3);
Pen penGray = new(Color.Gray, 4);
Brush grayColorBrush = new SolidBrush(Color.Gray);
Brush blackColorBrush = new SolidBrush(Color.Black);
Brush additionalBrush = new SolidBrush(_EntityTank.AdditionalColor);
Brush bodyBrush = new SolidBrush(_EntityTank.BodyColor);
// Границы автомобиля
// гусеницы
g.DrawEllipse(pen, _startPosX+14, _startPosY+44, 151, 31);
g.FillEllipse(blackColorBrush, _startPosX + 15, _startPosY + 45, 150, 30);
g.DrawEllipse(penGray, _startPosX + 24, _startPosY + 54, 10, 10);
g.DrawEllipse(penGray, _startPosX + 144, _startPosY + 54, 10, 10);
g.DrawEllipse(penGray, _startPosX + 44, _startPosY + 59, 10, 10);
g.DrawEllipse(penGray, _startPosX + 124, _startPosY + 59, 10, 10);
g.DrawEllipse(penGray, _startPosX + 64, _startPosY + 61, 10, 10);
g.DrawEllipse(penGray, _startPosX + 104, _startPosY + 61, 10, 10);
g.DrawEllipse(penGray, _startPosX + 84, _startPosY + 62, 10, 10);
// Кузов
g.DrawRectangle(pen, _startPosX + 19, _startPosY + 34, 141, 21);
g.FillRectangle(bodyBrush, _startPosX+20, _startPosY+35, 140, 20);
// Башня
g.FillRectangle(blackColorBrush, _startPosX + 75, _startPosY + 10, 25, 5);
g.DrawRectangle(pen, _startPosX + 64, _startPosY + 14, 66, 21);
g.FillRectangle(additionalBrush, _startPosX + 65, _startPosY + 15, 65, 20);
//Точки для отрисовки передней и задней части
Point pointFirstBackSide = new Point(_startPosX + 18, _startPosY + 35);
Point pointSecondBackSide = new Point(_startPosX + 18, _startPosY + 55);
Point pointThirdBackSide = new Point(_startPosX+0, _startPosY+55);
Point pointFirstFrontSide = new Point(_startPosX + 162, _startPosY + 35);
Point pointSecondFrontSide = new Point(_startPosX + 185, _startPosY + 55);
Point pointThirdFrontSide = new Point(_startPosX + 162, _startPosY + 55);
// Задняя часть
Point[] backSide = { pointFirstBackSide, pointSecondBackSide, pointThirdBackSide };
g.DrawPolygon(pen, backSide);
g.FillPolygon(bodyBrush, backSide);
// Передняя часть
Point[] frontSide ={ pointFirstFrontSide, pointSecondFrontSide, pointThirdFrontSide };
g.DrawPolygon(pen, frontSide);
g.FillPolygon(bodyBrush, frontSide);
Brush additionalBrush = new SolidBrush(tank.AdditionalColor);
// пушка
if (_EntityTank.Gun)
if (tank.Gun)
{
g.DrawRectangle(pen, _startPosX + 129, _startPosY + 19, 56, 6);
g.FillRectangle(additionalBrush, _startPosX + 130, _startPosY + 20, 55, 5);
@ -184,7 +52,7 @@ namespace ProjectTank
g.FillRectangle(blackColorBrush, _startPosX + 185, _startPosY + 18, 15, 10);
}
// пулемет
if (_EntityTank.MachineGun)
if (tank.MachineGun)
{
g.DrawRectangle(pen, _startPosX + 104, _startPosY + 9, 16, 6);
g.FillRectangle(additionalBrush, _startPosX + 105, _startPosY + 10, 15, 5);
@ -195,6 +63,7 @@ namespace ProjectTank
g.FillRectangle(additionalBrush, _startPosX + 105, _startPosY + 3, 29, 3);
g.FillRectangle(blackColorBrush, _startPosX + 135, _startPosY, 15, 8);
}
base.DrawTransport(g);
}
}
}

View File

@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectTank.Entities
{
/// <summary>
/// Класс-сущность "Бронирванный транспорт"
/// </summary>
public class EntityArmoredTransport
{
/// <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 EntityArmoredTransport(int speed, double weight, Color bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
}
}
}

View File

@ -1,48 +1,29 @@
using System;
using ProjectTank.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectTank
namespace ProjectTank.Entities
{
public class EntityTank
/// <summary>
/// Класс-сущность "Танк"
/// </summary>
public class EntityTank : EntityArmoredTransport
{
/// <summary>
/// Скорость
/// </summary>
public int Speed { get; private set; }
/// <summary>
/// Вес
/// </summary>
public double Weight { get; private set; }
/// <summary>
/// Пушка
/// </summary>
public bool Gun { get; private set; }
/// <summary>
/// Пулемет
/// </summary>
public bool MachineGun { get; private set; }
/// <summary>
/// Основной цвет
/// </summary>
public Color BodyColor { get; private set; }
/// <summary>
/// Дополнительный цвет (для опциональных элементов)
/// </summary>
public Color AdditionalColor { get; private set; }
/// <summary>
/// Расчет шага по карте
/// Пушка
/// </summary>
public double Step => (double)Speed * 100 / Weight;
public bool Gun { get; private set; }
/// <summary>
/// Пулемет
/// </summary>
public bool MachineGun { get; private set; }
/// <summary>
/// Инициализация полей объекта-класса спортивного автомобиля
/// </summary>
@ -52,13 +33,9 @@ namespace ProjectTank
/// <param name="additionalColor">Дополнительный цвет</param>
/// <param name="gun">Признак наличия пушки</param>
/// <param name="machineGun">Признак наличия пулемета</param>
///
public void Init(int speed, double weight, bool gun,
bool machineGun, Color bodyColor, Color additionalColor)
public EntityTank(int speed, double weight, Color bodyColor, Color additionalColor, bool gun,
bool machineGun) : base(speed, weight, bodyColor)
{
Speed = speed;
Weight = weight;
BodyColor = bodyColor;
AdditionalColor = additionalColor;
Gun = gun;
MachineGun = machineGun;

View File

@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProjectTank.DrawningObjects;
namespace ProjectTank.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,45 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectTank.MovementStrategy
{
/// <summary>
/// Стратегия перемещения объекта в центр экрана
/// </summary>
public class MoveToBorder : AbstractStrategy
{
protected override bool IsTargetDestinaion()
{
var objParams = GetObjectParameters;
if (objParams == null)
{
return false;
}
return objParams.RightBorder <= FieldWidth &&
objParams.RightBorder + GetStep() >= FieldWidth &&
objParams.DownBorder <= FieldHeight &&
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 ProjectTank.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 ProjectTank.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 ProjectTank.MovementStrategy
{
/// <summary>
/// Статус выполнения операции перемещения
/// </summary>
public enum Status
{
NotInit,
InProgress,
Finish
}
}

View File

@ -35,6 +35,9 @@
this.buttonLeft = new System.Windows.Forms.Button();
this.buttonDown = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.comboBoxStrategy = new System.Windows.Forms.ComboBox();
this.ButtonCreateArmoredTransport = new System.Windows.Forms.Button();
this.ButtonStep = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxTanks)).BeginInit();
this.SuspendLayout();
//
@ -42,7 +45,7 @@
//
this.pictureBoxTanks.Dock = System.Windows.Forms.DockStyle.Fill;
this.pictureBoxTanks.Location = new System.Drawing.Point(0, 0);
this.pictureBoxTanks.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.pictureBoxTanks.Margin = new System.Windows.Forms.Padding(6);
this.pictureBoxTanks.Name = "pictureBoxTanks";
this.pictureBoxTanks.Size = new System.Drawing.Size(1445, 881);
this.pictureBoxTanks.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
@ -53,11 +56,11 @@
//
this.ButtonCreateTank.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.ButtonCreateTank.Location = new System.Drawing.Point(22, 806);
this.ButtonCreateTank.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.ButtonCreateTank.Margin = new System.Windows.Forms.Padding(6);
this.ButtonCreateTank.Name = "ButtonCreateTank";
this.ButtonCreateTank.Size = new System.Drawing.Size(139, 49);
this.ButtonCreateTank.Size = new System.Drawing.Size(192, 49);
this.ButtonCreateTank.TabIndex = 1;
this.ButtonCreateTank.Text = "Создать";
this.ButtonCreateTank.Text = "Создать Танк";
this.ButtonCreateTank.UseVisualStyleBackColor = true;
this.ButtonCreateTank.Click += new System.EventHandler(this.ButtonCreateTank_Click);
//
@ -67,7 +70,7 @@
this.buttonUp.BackgroundImage = global::ProjectTank.Properties.Resources.btnUp;
this.buttonUp.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.buttonUp.Location = new System.Drawing.Point(1300, 730);
this.buttonUp.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.buttonUp.Margin = new System.Windows.Forms.Padding(6);
this.buttonUp.Name = "buttonUp";
this.buttonUp.Size = new System.Drawing.Size(56, 64);
this.buttonUp.TabIndex = 2;
@ -80,7 +83,7 @@
this.buttonRight.BackgroundImage = global::ProjectTank.Properties.Resources.btnRight;
this.buttonRight.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.buttonRight.Location = new System.Drawing.Point(1367, 806);
this.buttonRight.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.buttonRight.Margin = new System.Windows.Forms.Padding(6);
this.buttonRight.Name = "buttonRight";
this.buttonRight.Size = new System.Drawing.Size(56, 64);
this.buttonRight.TabIndex = 3;
@ -93,7 +96,7 @@
this.buttonLeft.BackgroundImage = global::ProjectTank.Properties.Resources.btnLeft;
this.buttonLeft.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.buttonLeft.Location = new System.Drawing.Point(1233, 806);
this.buttonLeft.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.buttonLeft.Margin = new System.Windows.Forms.Padding(6);
this.buttonLeft.Name = "buttonLeft";
this.buttonLeft.Size = new System.Drawing.Size(56, 64);
this.buttonLeft.TabIndex = 4;
@ -106,7 +109,7 @@
this.buttonDown.BackgroundImage = global::ProjectTank.Properties.Resources.btnDown;
this.buttonDown.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.buttonDown.Location = new System.Drawing.Point(1300, 806);
this.buttonDown.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.buttonDown.Margin = new System.Windows.Forms.Padding(6);
this.buttonDown.Name = "buttonDown";
this.buttonDown.Size = new System.Drawing.Size(56, 64);
this.buttonDown.TabIndex = 5;
@ -122,11 +125,51 @@
this.label1.Size = new System.Drawing.Size(0, 32);
this.label1.TabIndex = 6;
//
// comboBoxStrategy
//
this.comboBoxStrategy.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.comboBoxStrategy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBoxStrategy.FormattingEnabled = true;
this.comboBoxStrategy.Items.AddRange(new object[] {
"0",
"1"});
this.comboBoxStrategy.Location = new System.Drawing.Point(1181, 12);
this.comboBoxStrategy.Name = "comboBoxStrategy";
this.comboBoxStrategy.Size = new System.Drawing.Size(242, 40);
this.comboBoxStrategy.TabIndex = 7;
//
// ButtonCreateArmoredTransport
//
this.ButtonCreateArmoredTransport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.ButtonCreateArmoredTransport.Location = new System.Drawing.Point(241, 806);
this.ButtonCreateArmoredTransport.Margin = new System.Windows.Forms.Padding(6);
this.ButtonCreateArmoredTransport.Name = "ButtonCreateArmoredTransport";
this.ButtonCreateArmoredTransport.Size = new System.Drawing.Size(401, 49);
this.ButtonCreateArmoredTransport.TabIndex = 8;
this.ButtonCreateArmoredTransport.Text = "Создать Бронированную машину";
this.ButtonCreateArmoredTransport.UseVisualStyleBackColor = true;
this.ButtonCreateArmoredTransport.Click += new System.EventHandler(this.ButtonCreateArmoredTransport_Click);
//
// ButtonStep
//
this.ButtonStep.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.ButtonStep.Location = new System.Drawing.Point(1263, 61);
this.ButtonStep.Margin = new System.Windows.Forms.Padding(6);
this.ButtonStep.Name = "ButtonStep";
this.ButtonStep.Size = new System.Drawing.Size(160, 49);
this.ButtonStep.TabIndex = 9;
this.ButtonStep.Text = "Шаг";
this.ButtonStep.UseVisualStyleBackColor = true;
this.ButtonStep.Click += new System.EventHandler(this.ButtonStep_Click);
//
// TankForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(13F, 32F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1445, 881);
this.Controls.Add(this.ButtonStep);
this.Controls.Add(this.ButtonCreateArmoredTransport);
this.Controls.Add(this.comboBoxStrategy);
this.Controls.Add(this.label1);
this.Controls.Add(this.buttonDown);
this.Controls.Add(this.buttonLeft);
@ -134,7 +177,7 @@
this.Controls.Add(this.buttonUp);
this.Controls.Add(this.ButtonCreateTank);
this.Controls.Add(this.pictureBoxTanks);
this.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.Margin = new System.Windows.Forms.Padding(6);
this.Name = "TankForm";
this.Text = "Tank";
((System.ComponentModel.ISupportInitialize)(this.pictureBoxTanks)).EndInit();
@ -151,5 +194,8 @@
private Button buttonDown;
public PictureBox pictureBoxTanks;
private Label label1;
private ComboBox comboBoxStrategy;
private Button ButtonCreateArmoredTransport;
private Button ButtonStep;
}
}

View File

@ -1,4 +1,6 @@
using System.Reflection.Emit;
using ProjectTank.DrawningObjects;
using ProjectTank.MovementStrategy;
namespace ProjectTank
{
@ -10,7 +12,11 @@ namespace ProjectTank
/// <summary>
/// Ïîëå-îáúåêò äëÿ ïðîðèñîâêè îáúåêòà
/// </summary>
private DrawningTank? _drawningTank;
private DrawningArmoredTransport? _drawningArmoredTransport;
/// <summary>
/// Ñòðàòåãèÿ ïåðåìåùåíèÿ
/// </summary>
private AbstractStrategy? _abstractStrategy;
/// <summary>
/// Èíèöèàëèçàöèÿ ôîðìû
/// </summary>
@ -23,13 +29,13 @@ namespace ProjectTank
/// </summary>
private void Draw()
{
if (_drawningTank == null)
if (_drawningArmoredTransport == null)
{
return;
}
Bitmap bmp = new(pictureBoxTanks.Width, pictureBoxTanks.Height);
Graphics gr = Graphics.FromImage(bmp);
_drawningTank.DrawTransport(gr);
_drawningArmoredTransport.DrawTransport(gr);
pictureBoxTanks.Image = bmp;
}
/// <summary>
@ -40,12 +46,27 @@ namespace ProjectTank
private void ButtonCreateTank_Click(object sender, EventArgs e)
{
Random random = new();
_drawningTank = new DrawningTank();
_drawningTank.Init(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)), Convert.ToBoolean(random.Next(0, 2)),
pictureBoxTanks.Width, pictureBoxTanks.Height);
_drawningTank.SetPosition(random.Next(0, 100), random.Next(0, 100));
_drawningArmoredTransport = new DrawningTank(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)), Convert.ToBoolean(random.Next(0, 2)),
pictureBoxTanks.Width, pictureBoxTanks.Height);
_drawningArmoredTransport.SetPosition(random.Next(0, 100), random.Next(0, 100));
Draw();
}
/// <summary>
/// Îáðàáîòêà íàæàòèÿ êíîïêè "Ñîçäàòü àâòîìîáèëü"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCreateArmoredTransport_Click(object sender, EventArgs e)
{
Random random = new();
_drawningArmoredTransport = new DrawningArmoredTransport(random.Next(100, 300),random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256),
random.Next(0, 256)),
pictureBoxTanks.Width, pictureBoxTanks.Height);
_drawningArmoredTransport.SetPosition(random.Next(10, 100), random.Next(10,100));
Draw();
}
/// <summary>
@ -55,7 +76,7 @@ namespace ProjectTank
/// <param name="e"></param>
private void ButtonMove_Click(object sender, EventArgs e)
{
if (_drawningTank == null)
if (_drawningArmoredTransport == null)
{
return;
}
@ -63,19 +84,59 @@ namespace ProjectTank
switch (name)
{
case "buttonUp":
_drawningTank.MoveTransport(DirectionType.Up);
_drawningArmoredTransport.MoveTransport(DirectionType.Up);
break;
case "buttonDown":
_drawningTank.MoveTransport(DirectionType.Down);
_drawningArmoredTransport.MoveTransport(DirectionType.Down);
break;
case "buttonLeft":
_drawningTank.MoveTransport(DirectionType.Left);
_drawningArmoredTransport.MoveTransport(DirectionType.Left);
break;
case "buttonRight":
_drawningTank.MoveTransport(DirectionType.Right);
_drawningArmoredTransport.MoveTransport(DirectionType.Right);
break;
}
Draw();
}
/// <summary>
/// Îáðàáîòêà íàæàòèÿ êíîïêè "Øàã"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonStep_Click(object sender, EventArgs e)
{
if (_drawningArmoredTransport == null)
{
return;
}
if (comboBoxStrategy.Enabled)
{
_abstractStrategy = comboBoxStrategy.SelectedIndex
switch
{
0 => new MoveToCenter(),
1 => new MoveToBorder(),
_ => null,
};
if (_abstractStrategy == null)
{
return;
}
_abstractStrategy.SetData(new DrawningObjectArmoredTransport(_drawningArmoredTransport),
pictureBoxTanks.Width, pictureBoxTanks.Height);
comboBoxStrategy.Enabled = false;
}
if (_abstractStrategy == null)
{
return;
}
_abstractStrategy.MakeStep();
Draw();
if (_abstractStrategy.GetStatus() == Status.Finish)
{
comboBoxStrategy.Enabled = true;
_abstractStrategy = null;
}
}
}
}