90 lines
2.7 KiB
C#
90 lines
2.7 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|