package laba1Loco;
public abstract 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;
}
}