Моя непосредственная мысль при взгляде на это - некоторая путаница. Класс Rover имеет 4 состояния и направление, что кажется немного противоречивым. Я ожидал бы позицию и направление (для государства я, возможно, ожидал бы, ON / OFF / RECHARGING или что-то подобное).
Итак, я бы исследовал перечисления Java и имел бы перечисление NORTH / SOUTH / EAST / WEST Direction
для направления. Позиция (координата) имеет позиции x / y, и чтобы переместиться, я просто внедрил бы deltaX()
и deltaY()
в перечислении на лицевой стороне (похоже, Карл только что опубликовал нечто подобное)
Тогда ваш код движения будет выглядеть так:
x += facing.deltaX()
y += facing.deltaY()
В каком бы направлении вы не оказались. Обратите внимание, что не делегирует движение. Ровер всегда движется, но перечисление Direction
дает ему значение dx / dy, на которое можно изменить.
Перечисление также может иметь методы clockwise()
и counterClockwise()
, поэтому вызов NORTH.clockwise()
вернет ваше новое значение EAST
. Каждый экземпляр перечисления будет иметь только дельта и по часовой / против часовой стрелки методы, а ваш Rover
просто имеет следующее:
private Direction facing;
private int x;
private int y;
, который кажется намного более интуитивным и что я ожидал. Я выразил x и y отдельно, но вы можете обернуть в один класс. Если вы это сделаете, то перечисление Direction должно обрабатывать такой объект, а не полагаться на то, что он снова будет разбит на x и y.