89 lines
2.6 KiB
C#
89 lines
2.6 KiB
C#
|
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;
|
|||
|
}
|
|||
|
}
|