using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ProjectAirbus.Drawnings; using ProjectAirbus.Entities; namespace ProjectAirbus.MovementStrategy { internal 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 (IsTargetDestination()) { _state = Status.Finish; return; } MoveToTarget(); } // перемещения protected bool MoveLeft() => MoveTo(DirectionType.Left); protected bool MoveRight() => MoveTo(DirectionType.Right); protected bool MoveUp() => MoveTo(DirectionType.Up); 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 IsTargetDestination(); // попытка перемещения по направлению private bool MoveTo(DirectionType directionType) { if (_state != Status.InProgress) { return false; } if (_moveableObject?.CheckCanMove(directionType) ?? false) { _moveableObject.MoveObject(directionType); return true; } return false; } } }