using RoadTrain.MovementStrategy; using RoadTrain; using RoadTrain.DrawningObjects; namespace RoadTrain.MovementStrategy { /// /// Класс-стратегия перемещения объекта /// public abstract class AbstractStrategy { /// /// Перемещаемый объект /// private IMoveableObject? _moveableObject; /// /// Статус перемещения /// private Status _state = Status.NotInit; /// /// Ширина поля /// protected int FieldWidth { get; private set; } /// /// Высота поля /// protected int FieldHeight { get; private set; } /// /// Статус перемещения /// public Status GetStatus() { return _state; } /// /// Установка данных /// /// Перемещаемый объект /// Ширина поля /// Высота поля public void SetData(IMoveableObject moveableObject, int width, int height) { if (moveableObject == null) { _state = Status.NotInit; return; } _state = Status.InProgress; _moveableObject = moveableObject; FieldWidth = width; FieldHeight = height; } /// /// Шаг перемещения /// public void MakeStep() { if (_state != Status.InProgress) { return; } if (IsTargetDestinaion()) { _state = Status.Finish; return; } MoveToTarget(); } /// /// Перемещение влево /// /// Результат перемещения (true - удалось переместиться, false -неудача) protected bool MoveLeft() => MoveTo(DirectionType.Left); /// /// Перемещение вправо /// /// Результат перемещения (true - удалось переместиться, false - неудача) protected bool MoveRight() => MoveTo(DirectionType.Right); /// /// Перемещение вверх /// /// Результат перемещения (true - удалось переместиться, false - неудача) protected bool MoveUp() => MoveTo(DirectionType.Up); /// /// Перемещение вниз /// /// Результат перемещения (true - удалось переместиться, false - неудача) protected bool MoveDown() => MoveTo(DirectionType.Down); /// /// Параметры объекта /// protected ObjectParameters? GetObjectParameters => _moveableObject?.GetObjectPosition; /// /// Шаг объекта /// /// protected int? GetStep() { if (_state != Status.InProgress) { return null; } return _moveableObject?.GetStep; } /// /// Перемещение к цели /// protected abstract void MoveToTarget(); /// /// Достигнута ли цель /// /// protected abstract bool IsTargetDestinaion(); /// /// Попытка перемещения в требуемом направлении /// /// Направление /// Результат попытки (true - удалось переместиться, false - неудача) private bool MoveTo(DirectionType directionType) { if (_state != Status.InProgress) { return false; } if (_moveableObject?.CheckCanMove(directionType) ?? false) { _moveableObject.MoveObject(directionType); return true; } return false; } } }