Правки

This commit is contained in:
platoff aeeee 2023-10-11 09:18:35 +04:00
commit 7293c69407
9 changed files with 257 additions and 124 deletions

View File

@ -3,19 +3,31 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
// using Tank.Drawings;
namespace Tank.MovementStrategy namespace Tank.MovementStrategy
{ {
/// <summary>
/// Класс-стратегия перемещения объекта /// Класс-стратегия перемещения объекта
/// </summary>
public abstract class AbstractStrategy public abstract class AbstractStrategy
{ {
/// <summary>
/// Перемещаемый объект /// Перемещаемый объект
/// </summary>
private IMoveableObject? _moveableObject; private IMoveableObject? _moveableObject;
/// <summary>
/// Статус перемещения /// Статус перемещения
/// </summary>
private Status _state = Status.NotInit; private Status _state = Status.NotInit;
/// <summary>
/// Ширина поля /// Ширина поля
/// </summary>
protected int FieldWidth { get; private set; } protected int FieldWidth { get; private set; }
/// <summary>
/// Высота поля /// Высота поля
/// </summary>
protected int FieldHeight { get; private set; } protected int FieldHeight { get; private set; }
/// <summary> /// <summary>
/// Статус перемещения /// Статус перемещения
@ -62,29 +74,29 @@ namespace Tank.MovementStrategy
/// <returns>Результат перемещения (true - удалось переместиться, false - /// <returns>Результат перемещения (true - удалось переместиться, false -
// неудача)</returns> // неудача)</returns>
protected bool MoveLeft() => MoveTo(Direction.Left); protected bool MoveLeft() => MoveTo(Direction.Left);
/// <summary> /// <summary>
/// Перемещение вправо /// Перемещение вправо
/// </summary> /// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, /// <returns>Результат перемещения (true - удалось переместиться,
// false - неудача)</returns> // false - неудача)</returns>
protected bool MoveRight() => MoveTo(Direction.Right); protected bool MoveRight() => MoveTo(Direction.Right);
/// <summary> /// <summary>
/// Перемещение вверх /// Перемещение вверх
/// </summary> /// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, /// <returns>Результат перемещения (true - удалось переместиться,
// false - неудача)</returns> // false - неудача)</returns>
protected bool MoveUp() => MoveTo(Direction.Up); protected bool MoveUp() => MoveTo(Direction.Up);
/// <summary> /// <summary>
/// Перемещение вниз /// Перемещение вниз
/// </summary> /// </summary>
/// <returns>Результат перемещения (true - удалось переместиться, /// <returns>Результат перемещения (true - удалось переместиться,
// false - неудача)</returns> // false - неудача)</returns>
protected bool MoveDown() => MoveTo(Direction.Down); protected bool MoveDown() => MoveTo(Direction.Down);
/// <summary> /// <summary>
/// Параметры объекта /// Параметры объекта
/// </summary> /// </summary>
protected ObjectParameters? GetObjectParameters => protected ObjectParameters? GetObjectParameters =>
_moveableObject?.GetObjectPosition; _moveableObject?.GetObjectPosition;
/// <summary> /// <summary>
/// Шаг объекта /// Шаг объекта
/// </summary> /// </summary>
@ -112,7 +124,7 @@ namespace Tank.MovementStrategy
/// <param name="directionType">Направление</param> /// <param name="directionType">Направление</param>
/// <returns>Результат попытки (true - удалось переместиться, false - /// <returns>Результат попытки (true - удалось переместиться, false -
// неудача)</returns> // неудача)</returns>
private bool MoveTo(Direction directionType) private bool MoveTo(Direction directionType)
{ {
if (_state != Status.InProgress) if (_state != Status.InProgress)
{ {

View File

@ -7,88 +7,40 @@ using Tank.Entites;
namespace Tank.DrawingObjects namespace Tank.DrawingObjects
{ {
/// <summary>
/// Класс, отвечающий за прорисовку и перемещение объекта-сущности /// Класс, отвечающий за прорисовку и перемещение объекта-сущности
/// </summary>
public class DrawingArmoredCar public class DrawingArmoredCar
{ {
/// <summary>
/// Класс-сущность /// Класс-сущность
/// </summary>
public EntityArmoredCar? EntityArmoredCar { get; protected set; } public EntityArmoredCar? EntityArmoredCar { get; protected set; }
public EntityArmoredCar? Tank { get; protected set; } /// <summary>
/// Координата X объекта /// Координата X объекта
/// </summary>
public int GetPosX => _startPosX; public int GetPosX => _startPosX;
/// <summary>
/// Координата Y объекта /// Координата Y объекта
/// </summary>
public int GetPosY => _startPosY; public int GetPosY => _startPosY;
/// <summary>
/// Ширина объекта /// Ширина объекта
/// </summary>
public int GetWidth => _ArmoredcarWidth; public int GetWidth => _ArmoredcarWidth;
/// <summary>
/// Высота объекта /// Высота объекта
/// </summary>
public int GetHeight => _ArmoredcarHeight; public int GetHeight => _ArmoredcarHeight;
/// Ширина окна /// <summary>
private int _pictureWidth; /// Проверка, что объект может переместится по указанному направлению
/// Высота окна /// </summary>
private int _pictureHeight; /// <param name="direction">Направление</param>
/// Левая координата прорисовки автомобиля /// <returns>true - можно переместится по указанному
protected int _startPosX; /// направлению</returns>
/// Верхняя кооридната прорисовки автомобиля public bool CanMove(Direction direction)
protected int _startPosY;
/// Ширина прорисовки автомобиля
protected readonly int _ArmoredcarWidth = 100;
/// Высота прорисовки автомобиля
protected readonly int _ArmoredcarHeight = 55;
/// Конструктор
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
public DrawingArmoredCar(int speed, double weight, Color bodyColor, int
width, int height)
{
_pictureWidth = width;
_pictureHeight = height;
//EntityArmoredCar = new EntityArmoredCar(speed, weight, bodyColor);
if (_pictureHeight < _ArmoredcarHeight || _pictureWidth < _ArmoredcarWidth)
{
return;
}
Tank = new EntityArmoredCar(speed, weight, bodyColor);
}
/// Конструктор
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
/// <param name="carWidth">Ширина прорисовки автомобиля</param>
/// <param name="carHeight">Высота прорисовки автомобиля</param>
protected DrawingArmoredCar(int speed, double weight, Color bodyColor, int
width, int height, int tankWidth, int tankHeight)
{
_pictureWidth = width;
_pictureHeight = height;
_ArmoredcarWidth = tankWidth;
_ArmoredcarHeight = tankHeight;
// EntityArmoredCar = new EntityArmoredCar(speed, weight, bodyColor);
if (_pictureHeight < _ArmoredcarHeight || _pictureWidth < _ArmoredcarWidth)
{
return;
}
Tank = new EntityArmoredCar(speed, weight, bodyColor);
}
/// Установка позиции
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
// TODO: Изменение x, y, если при установке объект выходит зaf границы
_startPosX = x;
_startPosY = y;
}
/// Проверка, что объект может переместится по указанному направлению
/// <returns>true - можно переместится по указанному
/// направлению</returns>
public bool CanMove(Direction direction)
{ {
if (EntityArmoredCar == null) if (EntityArmoredCar == null)
{ {
@ -96,50 +48,167 @@ namespace Tank.DrawingObjects
} }
return direction switch return direction switch
{ {
//влево
Direction.Left => _startPosX - EntityArmoredCar.Step > 0, Direction.Left => _startPosX - EntityArmoredCar.Step > 0,
//вверх
Direction.Up => _startPosY - EntityArmoredCar.Step > 0, Direction.Up => _startPosY - EntityArmoredCar.Step > 0,
Direction.Right => _startPosX + _ArmoredcarWidth + EntityArmoredCar.Step < _pictureWidth, // вправо
Direction.Down => _startPosX + _ArmoredcarHeight + EntityArmoredCar.Step < _pictureHeight, Direction.Right => false,// TODO: Продумать логику
//вниз
Direction.Down => false,// TODO: Продумать логику
_ => false, _ => false,
}; };
} }
/// <summary>
/// Изменение направления перемещения /// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
public void MoveTransport(Direction direction) public void MoveTransport(Direction direction)
{ {
if (EntityArmoredCar == null) if (!CanMove(direction) || EntityArmoredCar == null)
{ {
return; return;
} }
switch (direction) switch (direction)
{ {
//влево
case Direction.Left: case Direction.Left:
if (_startPosX - EntityArmoredCar.Step > 0) _startPosX -= (int)EntityArmoredCar.Step;
{
_startPosX -= (int)EntityArmoredCar.Step;
}
break; break;
//вверх
case Direction.Up: case Direction.Up:
if (_startPosY - EntityArmoredCar.Step > 0) _startPosY -= (int)EntityArmoredCar.Step;
{
_startPosY -= (int)EntityArmoredCar.Step;
}
break; break;
// вправо
case Direction.Right: case Direction.Right:
if (_startPosX + EntityArmoredCar.Step + _ArmoredcarWidth < _pictureWidth) _startPosX += (int)EntityArmoredCar.Step;
{
_startPosX += (int)EntityArmoredCar.Step;
}
break; break;
//вниз
case Direction.Down: case Direction.Down:
if (_startPosY + EntityArmoredCar.Step + _ArmoredcarHeight < _pictureHeight) _startPosY += (int)EntityArmoredCar.Step;
{
_startPosY += (int)EntityArmoredCar.Step;
}
break; break;
} }
} }
/// <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 _ArmoredcarWidth = 100;
/// <summary>
/// Высота прорисовки автомобиля
/// </summary>
protected readonly int _ArmoredcarHeight = 55;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="speed">Скорость</param>
/// <param name="weight">Вес</param>
/// <param name="bodyColor">Основной цвет</param>
/// <param name="width">Ширина картинки</param>
/// <param name="height">Высота картинки</param>
public DrawningArmoredCar(int speed, double weight, Color bodyColor, int
width, int height)
{
// TODO: Продумать проверки
_pictureWidth = width;
_pictureHeight = height;
EntityArmoredCar = new EntityArmoredCar(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="carWidth">Ширина прорисовки автомобиля</param>
/// <param name="carHeight">Высота прорисовки автомобиля</param>
protected DrawningArmoredCar(int speed, double weight, Color bodyColor, int
width, int height, int carWidth, int carHeight)
{
// TODO: Продумать проверки
_pictureWidth = width;
_pictureHeight = height;
_ArmoredcarWidth = carWidth;
_ArmoredcarHeight = carHeight;
EntityArmoredCar = new EntityArmoredCar(speed, weight, bodyColor);
}
/// <summary>
/// Установка позиции
/// </summary>
/// <param name="x">Координата X</param>
/// <param name="y">Координата Y</param>
public void SetPosition(int x, int y)
{
// TODO: Изменение x, y, если при установке объект выходит за
// границы
_startPosX = x;
_startPosY = y;
}
/// <summary>
/// Изменение направления перемещения
/// </summary>
/// <param name="direction">Направление</param>
//public void MoveTransport(Direction direction)
//{
// if (EntityArmoredCar == null)
// {
// return;
// }
// switch (direction)
// {
// //влево
// case Direction.Left:
// if (_startPosX - EntityArmoredCar.Step > 0)
// {
// _startPosX -= (int)EntityArmoredCar.Step;
// }
// break;
// //вверх
// case Direction.Up:
// if (_startPosY - EntityArmoredCar.Step > 0)
// {
// _startPosY -= (int)EntityArmoredCar.Step;
// }
// break;
// // вправо
// case Direction.Right:
// if (_startPosX + EntityArmoredCar.Step + _ArmoredcarWidth < _pictureWidth)
// {
// _startPosX += (int)EntityArmoredCar.Step;
// }
// break;
// //вниз
// case Direction.Down:
// if (_startPosY + EntityArmoredCar.Step + _ArmoredcarHeight < _pictureHeight)
// {
// _startPosY += (int)EntityArmoredCar.Step;
// }
// break;
// }
//}
/// <summary>
/// Прорисовка объекта /// Прорисовка объекта
/// </summary>
/// <param name="g"></param>
public virtual void DrawTransport(Graphics g) public virtual void DrawTransport(Graphics g)
{ {
if (EntityArmoredCar == null) if (EntityArmoredCar == null)
@ -150,7 +219,7 @@ namespace Tank.DrawingObjects
//кузов //кузов
Brush br = new SolidBrush(EntityArmoredCar.BodyColor); Brush br = new SolidBrush(EntityArmoredCar.BodyColor);
g.FillRectangle(br, _startPosX + 10, _startPosY + 15, 10, 30); g.FillRectangle(br, _startPosX + 10, _startPosY + 15, 10, 30);
// не мое // не мое
Brush BrushRandom = new SolidBrush(EntityArmoredCar?.BodyColor ?? Color.Black); Brush BrushRandom = new SolidBrush(EntityArmoredCar?.BodyColor ?? Color.Black);
@ -169,6 +238,6 @@ namespace Tank.DrawingObjects
g.FillEllipse(ColorBlack, 85 + _startPosX, 42 + _startPosY, 20, 20); g.FillEllipse(ColorBlack, 85 + _startPosX, 42 + _startPosY, 20, 20);
g.FillEllipse(ColorBlack, 110 + _startPosX, 42 + _startPosY, 20, 20); g.FillEllipse(ColorBlack, 110 + _startPosX, 42 + _startPosY, 20, 20);
} }
} }
} }

View File

@ -82,21 +82,21 @@ namespace Tank.DrawingObjects
g.FillRectangle(br, _startPosX + 5, _startPosY + 17, 110, 18); g.FillRectangle(br, _startPosX + 5, _startPosY + 17, 110, 18);
g.FillRectangle(br, _startPosX + 30, _startPosY, 50, 15); g.FillRectangle(br, _startPosX + 30, _startPosY, 50, 15);
// пулемет // // пулемет
g.FillRectangle(br, _startPosX + 80, _startPosY + 3, 25, 5); // g.FillRectangle(br, _startPosX + 80, _startPosY + 3, 25, 5);
// зенитный пулемет на башне // // зенитный пулемет на башне
g.FillRectangle(br, _startPosX + 40, _startPosY - 10, 20, 5); // g.FillRectangle(br, _startPosX + 40, _startPosY - 10, 20, 5);
g.FillRectangle(brBlack, _startPosX + 50, _startPosY - 5, 5, 5); // g.FillRectangle(brBlack, _startPosX + 50, _startPosY - 5, 5, 5);
g.FillRectangle(brBlack, _startPosX + 55, _startPosY - 10, 5, 10); // g.FillRectangle(brBlack, _startPosX + 55, _startPosY - 10, 5, 10);
g.FillRectangle(brBlack, _startPosX + 52, _startPosY - 7, 3, 2); // g.FillRectangle(brBlack, _startPosX + 52, _startPosY - 7, 3, 2);
//выделяем рамкой весь танк // //выделяем рамкой весь танк
g.DrawRectangle(pen, _startPosX + 5, _startPosY + 17, 110, 18); // g.DrawRectangle(pen, _startPosX + 5, _startPosY + 17, 110, 18);
g.DrawRectangle(pen, _startPosX + 30, _startPosY, 50, 15); // g.DrawRectangle(pen, _startPosX + 30, _startPosY, 50, 15);
g.DrawRectangle(pen, _startPosX + 80, _startPosY + 3, 25, 5); // g.DrawRectangle(pen, _startPosX + 80, _startPosY + 3, 25, 5);
g.DrawRectangle(pen, _startPosX + 40, _startPosY - 10, 20, 5); // g.DrawRectangle(pen, _startPosX + 40, _startPosY - 10, 20, 5);
//// обвесы //// обвесы
//if (Tank.BodyKit) // entityTank //if (Tank.BodyKit) // entityTank

View File

@ -6,18 +6,30 @@ using System.Threading.Tasks;
namespace Tank.Entites namespace Tank.Entites
{ {
/// <summary>
/// Класс-сущность "Бронированная машина" /// Класс-сущность "Бронированная машина"
/// </summary>
public class EntityArmoredCar public class EntityArmoredCar
{ {
/// <summary>
/// Скорость /// Скорость
/// </summary>
public int Speed { get; set; } public int Speed { get; set; }
/// <summary>
/// Вес /// Вес
/// </summary>
public double Weight { get; set; } public double Weight { get; set; }
/// <summary>
/// Основной цвет /// Основной цвет
/// </summary>
public Color BodyColor { get; set; } public Color BodyColor { get; set; }
/// <summary>
/// Шаг перемещения автомобиля /// Шаг перемещения автомобиля
/// </summary>
public double Step => (double)Speed * 300 / Weight; public double Step => (double)Speed * 300 / Weight;
/// <summary>
/// Конструктор с параметрами /// Конструктор с параметрами
/// </summary>
/// <param name="speed">Скорость</param> /// <param name="speed">Скорость</param>
/// <param name="weight">Вес автомобиля</param> /// <param name="weight">Вес автомобиля</param>
/// <param name="bodyColor">Основной цвет</param> /// <param name="bodyColor">Основной цвет</param>

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Tank.Entites;
namespace Tank.Entites namespace Tank.Entites
{ {

View File

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

View File

@ -6,6 +6,7 @@ using System.Threading.Tasks;
namespace Tank.MovementStrategy namespace Tank.MovementStrategy
{ {
/// <summary>
/// Стратегия перемещения объекта в центр экрана /// Стратегия перемещения объекта в центр экрана
public class MoveToCenter : AbstractStrategy public class MoveToCenter : AbstractStrategy

View File

@ -6,26 +6,46 @@ using System.Threading.Tasks;
namespace Tank.MovementStrategy namespace Tank.MovementStrategy
{ {
/// <summary>
/// Параметры-координаты объекта /// Параметры-координаты объекта
/// </summary>
public class ObjectParameters public class ObjectParameters
{ {
private readonly int _x; private readonly int _x;
private readonly int _y; private readonly int _y;
private readonly int _width; private readonly int _width;
private readonly int _height; private readonly int _height;
/// <summary>
/// Левая граница /// Левая граница
/// </summary>
public int LeftBorder => _x; public int LeftBorder => _x;
/// <summary>
/// Верхняя граница /// Верхняя граница
/// </summary>
public int TopBorder => _y; public int TopBorder => _y;
/// <summary>
/// Правая граница /// Правая граница
/// </summary>
public int RightBorder => _x + _width; public int RightBorder => _x + _width;
/// <summary>
/// Нижняя граница /// Нижняя граница
/// </summary>
public int DownBorder => _y + _height; public int DownBorder => _y + _height;
/// <summary>
/// Середина объекта /// Середина объекта
/// </summary>
public int ObjectMiddleHorizontal => _x + _width / 2; public int ObjectMiddleHorizontal => _x + _width / 2;
/// <summary>
/// Середина объекта /// Середина объекта
/// </summary>
public int ObjectMiddleVertical => _y + _height / 2; 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) public ObjectParameters(int x, int y, int width, int height)
{ {
_x = x; _x = x;
@ -33,5 +53,7 @@ namespace Tank.MovementStrategy
_width = width; _width = width;
_height = height; _height = height;
} }
} }
} }

View File

@ -6,10 +6,12 @@ using System.Threading.Tasks;
namespace Tank.MovementStrategy namespace Tank.MovementStrategy
{ {
/// <summary>
/// Статус выполнения операции перемещения /// Статус выполнения операции перемещения
/// </summary>
public enum Status public enum Status
{ {
NotInit, NotInit,
InProgress, InProgress,
Finish Finish