109 lines
3.3 KiB
Java
109 lines
3.3 KiB
Java
package MovementStrategy;
|
|
|
|
public abstract class AbstractStrategy {
|
|
/// <summary>
|
|
/// Перемещаемый объект
|
|
/// </summary>
|
|
private IMoveableObject _moveableObject;
|
|
/// <summary>
|
|
/// Статус перемещения
|
|
/// </summary>
|
|
private Status _state = Status.NotInit;
|
|
/// <summary>
|
|
/// Ширина поля
|
|
/// </summary>
|
|
protected int FieldWidth;
|
|
/// <summary>
|
|
/// Высота поля
|
|
/// </summary>
|
|
protected int FieldHeight;
|
|
/// <summary>
|
|
/// Статус перемещения
|
|
/// </summary>
|
|
public Status GetStatus() { return _state; }
|
|
/// <summary>
|
|
/// Установка данных
|
|
/// </summary>
|
|
/// <param name="moveableObject">Перемещаемый объект</param>
|
|
/// <param name="width">Ширина поля</param>
|
|
/// <param name="height">Высота поля</param>
|
|
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;
|
|
}
|
|
/// <summary>
|
|
/// Шаг перемещения
|
|
/// </summary>
|
|
public void MakeStep()
|
|
{
|
|
|
|
if (_state != Status.InProgress)
|
|
{
|
|
return;
|
|
}
|
|
if (IsTargetDestinaion())
|
|
{
|
|
_state = Status.Finish;
|
|
return;
|
|
}
|
|
MoveToTarget();
|
|
}
|
|
/// <summary>
|
|
/// Перемещение влево
|
|
/// </summary>
|
|
/// <returns>Результат перемещения (true - удалось переместиться, false - неудача)</returns>
|
|
protected boolean MoveLeft() { return MoveTo(Direction.Left);};
|
|
protected boolean MoveRight(){return MoveTo(Direction.Right);}
|
|
protected boolean MoveUp(){return MoveTo(Direction.Up);}
|
|
protected boolean MoveDown(){return MoveTo(Direction.Down);}
|
|
protected ObjectParameters GetObjectParameters(){ return _moveableObject.GetObjectPosition();}
|
|
protected int GetStep()
|
|
{
|
|
if (_state != Status.InProgress)
|
|
{
|
|
return Integer.parseInt(null);
|
|
}
|
|
return _moveableObject.GetStep();
|
|
}
|
|
/// <summary>
|
|
/// Перемещение к цели
|
|
/// </summary>
|
|
protected abstract void MoveToTarget();
|
|
/// <summary>
|
|
/// Достигнута ли цель
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
protected abstract boolean IsTargetDestinaion();
|
|
/// <summary>
|
|
/// Попытка перемещения в требуемом направлении
|
|
/// </summary>
|
|
/// <param name="directionType">Направление</param>
|
|
/// <returns>Результат попытки (true - удалось переместиться, false - неудача)</returns>
|
|
private boolean MoveTo(Direction directionType)
|
|
{
|
|
if (_state != Status.InProgress)
|
|
{
|
|
return false;
|
|
}
|
|
if (_moveableObject.CheckCanMove(directionType))
|
|
{
|
|
_moveableObject.MoveObject(directionType);
|
|
return true;
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
|
|
}
|
|
}
|
|
|