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(); /// Попытка перемещения в требуемом направлении /// Направление /// Результат попытки (true - удалось переместиться, false - неудача) private bool MoveTo(MovementDirection movementDirection) { if (_state != StrategyStatus.InProgress) { return false; } return _moveableObject?.TryMoveObject(movementDirection) ?? false; } }