PIbd-14_Pruidze_I.K_Simple_.../ProjectCruiser/MoveStrategy/AbstractStrategy.cs

89 lines
2.6 KiB
C#
Raw Permalink Normal View History

2024-06-12 19:21:59 +04:00
namespace ProjectCruiser.MoveStrategy;
public abstract class AbstractStrategy
{
// Перемещаемый объект
private IMoveableObj? _moveableObject;
// Статус перемещения (default установка)
private StrategyStatus _state = StrategyStatus.NotInit;
// Ширина поля
protected int FieldWidth { get; private set; }
// Высота поля
protected int FieldHeight { get; private set; }
// Получение статуса
public StrategyStatus GetStatus() { return _state; }
// Установка данных
public void SetData(IMoveableObj moveableObject, int width, int height)
{
if (moveableObject == null)
{
_state = StrategyStatus.NotInit;
return;
}
_state = StrategyStatus.InProgress;
_moveableObject = moveableObject;
FieldWidth = width;
FieldHeight = height;
}
// Шаг перемещения
public void MakeStep()
{
if (_state != StrategyStatus.InProgress)
{
return;
}
if (IsTargetDestination())
{
_state = StrategyStatus.Finish;
return;
}
MoveToTarget();
}
// Результаты перемещения
protected bool MoveLeft() => MoveTo(MovementDirection.Left);
protected bool MoveRight() => MoveTo(MovementDirection.Right);
protected bool MoveUp() => MoveTo(MovementDirection.Up);
protected bool MoveDown() => MoveTo(MovementDirection.Down);
// Параметры объекта
protected ObjParameters? GetObjectParameters =>
_moveableObject?.GetObjectPosition;
// Шаг объекта
protected int? GetStep()
{
if (_state != StrategyStatus.InProgress)
{
return null;
}
return _moveableObject?.GetStep;
}
// Перемещение к цели
protected abstract void MoveToTarget();
// Проверка, достигнута ли цель
protected abstract bool IsTargetDestination();
/// Попытка перемещения в требуемом направлении
/// <param name="movementDirection">Направление</param>
/// <returns>Результат попытки (true - удалось переместиться, false - неудача)</returns>
private bool MoveTo(MovementDirection movementDirection)
{
if (_state != StrategyStatus.InProgress)
{
return false;
}
return _moveableObject?.TryMoveObject(movementDirection) ?? false;
}
}