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
+}