Моя мысль была бы: ввести класс направления, а затем выполнить проверку в этом стиле: isBlocked (startPossition, direction, numberOfFields)
Я сделал небольшой пример, используя 3 класса.
- Направление - перечисление для представления 8 направлений (2 по горизонтали, 2 по вертикали, 4 по диагонали)
- Позиция - значение x и y для позиции
- LinarMove - представляетодин линейный Move (startPossition, direction, numberOfFields) и содержит isBlockedMethod
Enum:
public enum Direction {
UP(0, 1),
DOWN(0, -1),
LEFT(1, 0),
RIGHT(-1, 0),
UP_LEFT(UP, LEFT),
UP_RIGTH(UP, RIGHT),
DOWN_LEFT(DOWN, LEFT),
DOWN_RIGHT(
DOWN, RIGHT);
private final int incrementX;
private final int incrementY;
private Direction(int incrementX, int incrementY) {
this.incrementX = incrementX;
this.incrementY = incrementY;
}
private Direction(Direction sub1, Direction sub2) {
this.incrementX = sub1.incrementX + sub2.incrementX;
this.incrementY = sub1.incrementY + sub2.incrementY;
}
public Position oneField(Position start) {
return new Position(start.getX() + this.incrementX, start.getY()
+ this.incrementY);
}
}
Смысл второго конструктора в том, что он позволяет писать диагональные движенияв более читабельном виде.
public class Position {
private final int x;
private final int y;
public Position(int x, int y) {
super();
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
@Override
public String toString() {
return "x:" + x + ", y:" + y;
}
}
Move содержит метод isBlocked - вы можете видеть, насколько маленьким он становится, и насколько читаемым он становится.По крайней мере, нет единственного направления, связанного с оставленным оператором.
Название LinareMove предполагает, что возможен другой вид движения для рыцаря.
public class LinearMove {
private final Position start;
private final Direction direction;
/** Length of the move. */
private final int numberOfFields;
public LinearMove(Position start, Direction direction, int numberOfFields) {
super();
this.start = start;
this.direction = direction;
this.numberOfFields = numberOfFields;
}
boolean isBlocked() {
Position pos = this.start;
for (int i = 0; i < (this.numberOfFields - 1); i++) {
pos = this.direction.oneField(pos);
if (isPiece(pos)) {
return true;
}
}
return false;
}
boolean isPiece(Position pos) {
//Dummy;
System.out.println(pos);
return false;
}
}
И вот как это работает:
public static void main(String[] args) {
new LinearMove(new Position(1, 1), Direction.RIGHT, 3).isBlocked();
}
Возможно, вы заметили, что ход коней - это своего рода пробм.С этой душой вы можете смоделировать ее двумя способами:
- 4 special Directions
- an other kind of move class (this is the more cleaner way, because you could always return true, in the isBockedMethod)