diff --git a/src/AbstractStrategy.java b/src/AbstractStrategy.java new file mode 100644 index 0000000..1e75889 --- /dev/null +++ b/src/AbstractStrategy.java @@ -0,0 +1,120 @@ +public class AbstractStrategy { + /// + /// Перемещаемый объект + /// + private IMoveableObject _moveableObject; + /// + /// Статус перемещения + /// + private Status _state = Status.NotInit; + /// + /// Ширина поля + /// + protected int FieldWidth; + /// + /// Высота поля + /// + protected int FieldHeight; + /// + /// Статус перемещения + /// + 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 boolean MoveLeft() { return MoveTo(Direction.Left);} + /// + /// Перемещение вправо + /// + /// Результат перемещения (true - удалось переместиться,false - неудача) + protected boolean MoveRight() { return MoveTo(Direction.Right);} + /// + /// Перемещение вверх + /// + /// Результат перемещения (true - удалось переместиться,false - неудача) + protected boolean MoveUp() { return MoveTo(Direction.Up);} + /// + /// Перемещение вниз + /// + /// Результат перемещения (true - удалось переместиться,false - неудача) + protected boolean MoveDown() { return MoveTo(Direction.Down);} + /// + /// Параметры объекта + /// + protected ObjectParameters GetObjectParameters() { return _moveableObject.GetObjectPosition(); } + /// + /// Шаг объекта + /// + /// + protected int GetStep() + { + if (_state != Status.InProgress) + { + return 0; + } + return _moveableObject.GetStep(); + } + /// + /// Перемещение к цели + /// + protected abstract void MoveToTarget(); + /// + /// Достигнута ли цель + /// + /// + protected abstract boolean IsTargetDestinaion(); + /// + /// Попытка перемещения в требуемом направлении + /// + /// Направление + /// Результат попытки (true - удалось переместиться, false - неудача) + private boolean MoveTo(Direction Direction) + { + if (_state != Status.InProgress) + { + return false; + } + if (_moveableObject.CheckCanMove(Direction)) + { + _moveableObject.MoveObject(Direction); + return true; + } + return false; + } +} diff --git a/src/IMoveableObject.java b/src/IMoveableObject.java new file mode 100644 index 0000000..947dd6b --- /dev/null +++ b/src/IMoveableObject.java @@ -0,0 +1,21 @@ +public interface IMoveableObject { + /// + /// Получение координаты X объекта + /// + ObjectParameters GetObjectPosition(); + /// + /// Шаг объекта + /// + int GetStep(); + /// + /// Проверка, можно ли переместиться по нужному направлению + /// + /// + /// + boolean CheckCanMove(Direction direction); + /// + /// Изменение направления пермещения объекта + /// + /// Направление + void MoveObject(Direction direction); +} diff --git a/src/ObjectParameters.java b/src/ObjectParameters.java new file mode 100644 index 0000000..c52531f --- /dev/null +++ b/src/ObjectParameters.java @@ -0,0 +1,44 @@ +public class ObjectParameters { + private int _x; + private int _y; + private int _width; + private int _height; + /// + /// Левая граница + /// + public int LeftBorder() {return _x;} + /// + /// Верхняя граница + /// + public int TopBorder () {return _y;} + /// + /// Правая граница + /// + public int RightBorder () {return _x + _width;} + /// + /// Нижняя граница + /// + public int DownBorder () {return _y + _height;} + /// + /// Середина объекта + /// + public int ObjectMiddleHorizontal () {return _x + _width / 2;} + /// + /// Середина объекта + /// + public int ObjectMiddleVertical () {return _y + _height / 2;} + /// + /// Конструктор + /// + /// Координата X + /// Координата Y + /// Ширина + /// Высота + public ObjectParameters(int x, int y, int width, int height) + { + _x = x; + _y = y; + _width = width; + _height = height; + } +} diff --git a/src/Status.java b/src/Status.java new file mode 100644 index 0000000..6467ed7 --- /dev/null +++ b/src/Status.java @@ -0,0 +1,5 @@ +public enum Status { + NotInit, + InProgress, + Finish +}