132 lines
3.8 KiB
C#
132 lines
3.8 KiB
C#
namespace ProjectGasolineTanker.MovementStrategy;
|
||
/// <summary>
|
||
/// Класс-стратегия перемещения объекта
|
||
/// </summary>
|
||
public abstract class AbstractStrategy
|
||
{
|
||
/// <summary>
|
||
/// Перемещаемый объект
|
||
/// </summary>
|
||
private IMoveableObject? _moveableObject;
|
||
|
||
/// <summary>
|
||
/// Статус перемещения
|
||
/// </summary>
|
||
private StrategyStatus _state = StrategyStatus.NotInit;
|
||
|
||
/// <summary>
|
||
/// Ширина поля
|
||
/// </summary>
|
||
protected int FieldWidth { get; private set; }
|
||
|
||
/// <summary>
|
||
/// Высота поля
|
||
/// </summary>
|
||
protected int FieldHeight { get; private set; }
|
||
|
||
/// <summary>
|
||
/// Статус перемещения
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public StrategyStatus 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 = StrategyStatus.NotInit;
|
||
return;
|
||
}
|
||
_state = StrategyStatus.InProgress;
|
||
_moveableObject = moveableObject;
|
||
FieldWidth = width;
|
||
FieldHeight = height;
|
||
|
||
}
|
||
/// <summary>
|
||
/// Шаг перемещения
|
||
/// </summary>
|
||
public void MakeStep()
|
||
{
|
||
if (_state != StrategyStatus.InProgress)
|
||
{
|
||
return;
|
||
}
|
||
if (IsTargetDestination())
|
||
{
|
||
_state = StrategyStatus.Finish;
|
||
return;
|
||
}
|
||
|
||
MoveToTarget();
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// Перемещение влево
|
||
/// </summary>
|
||
/// <returns>Результат перемещения (true - удалось переместиться, false - нет)</returns>
|
||
protected bool MoveLeft() => MoveTo(MovementDirection.Left);
|
||
|
||
/// <summary>
|
||
/// Перемещение вправо
|
||
/// </summary>
|
||
/// <returns>Результат перемещения (true - удалось переместиться, false - нет)</returns>
|
||
protected bool MoveRight() => MoveTo(MovementDirection.Right);
|
||
|
||
/// <summary>
|
||
/// Перемещение вверх
|
||
/// </summary>
|
||
/// <returns>Результат перемещения (true - удалось переместиться, false - нет)</returns>
|
||
protected bool MoveUp() => MoveTo(MovementDirection.Up);
|
||
|
||
/// <summary>
|
||
/// Перемещение вниз
|
||
/// </summary>
|
||
/// <returns>Результат перемещения (true - удалось переместиться, false - нет)</returns>
|
||
protected bool MoveDown() => MoveTo(MovementDirection.Down);
|
||
|
||
/// <summary>
|
||
/// Парaметры объекта
|
||
/// </summary>
|
||
protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition;
|
||
|
||
/// <summary>
|
||
/// Шаг объекта
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
protected int? GetStep()
|
||
{
|
||
if (_state != StrategyStatus.InProgress)
|
||
{
|
||
return null;
|
||
}
|
||
return _moveableObject?.GetStep;
|
||
}
|
||
/// <summary>
|
||
/// Перемещение к цели
|
||
/// </summary>
|
||
protected abstract void MoveToTarget();
|
||
|
||
/// <summary>
|
||
/// Достинута ли цель
|
||
/// </summary>
|
||
protected abstract bool IsTargetDestination();
|
||
|
||
private bool MoveTo(MovementDirection movementDirection)
|
||
{
|
||
if (_state != StrategyStatus.InProgress)
|
||
{
|
||
return false;
|
||
}
|
||
return _moveableObject?.TryMoveObject(movementDirection) ?? false;
|
||
}
|
||
}
|