Морской бой. Пишу метод для поворота корабля.
tt - это текущее положение корабля:
0 - вертикально (по умолчанию)
1 - горизонтально (0 + 90°)
2 - вертикально (0 вверх ногами)
3 - горизонтально (0 - 90°)
ckw - это флаг поворота:
true - по часовой стрелке
false - против часовой стрелки
Код метода поворота:
public void turn (boolean ckw) {
if ((tt == 0 && !ckw) || (tt == 1 && ckw)) {
//b -> c
}
else if ((tt == 1 && !ckw) || (tt == 2 && ckw)) {
//c -> d
}
else if ((tt == 2 && !ckw) || (tt == 3 && ckw)) {
//d -> a
}
else if ((tt == 3 && !ckw) || (tt == 0 && ckw)) {
//a -> b
}
if (ckw)
tt++;
else
tt--;
}
Комментариями обозначены 4 цикла for-each с логикой разворота. Мне бы вот эту лесенку if-ов сократить. Это возможно?
Логика поворота
Корабль представляет собой ArrayList позиций в сетке. Например, 4-палубный, находящийся в середине поля: 35, 45, 55, 65. Чтобы его повернуть по часовой стрелке, надо прибавить к каждой позиции её индекс, умноженный на 11
b -> c (90° -> 180°) или (0° -> 270°)
for (int i = 0; i < col.size(); i++) {
int num = col.get(i);
int new_num = num + 11 * i;
col.set(i, new_num);
}
И т.д.
Ответ
Храним только базовые координаты, длину и текущее состояние разворота.
Всё остальное вычисляемо из этих данных.
Демка на коленке:
public class Main
{
public static void main(String[] args)
{
Ship ship = new Ship(4, 1, 3, 5); // 35,
ship.print();
System.out.println("Clockwise");
ship.turn(true).print();
ship.turn(true).print();
ship.turn(true).print();
ship.turn(true).print();
System.out.println("Counter-clockwise");
ship.turn(false).print();
ship.turn(false).print();
ship.turn(false).print();
ship.turn(false).print();
}
}
public class Ship
{
private int state;
private int x;
private int y;
private int length;
public Ship(int length, int initialState, int x, int y)
{
state = initialState;
this.x = x;
this.y = y;
this.length = length;
}
public Ship turn(boolean clockwise) {
if (clockwise) {
state = (state + 1) % 4;
} else {
state = (state + 3) % 4;
}
return this;
}
public Ship print() {
for (int i = 0; i < length; i++) {
switch (state) {
case 0: System.out.print("("+(10*x+y-i)+")"); break; // N
case 1: System.out.print("("+(10*(x+i)+y)+")"); break; // E
case 2: System.out.print("("+(10*x+y+i)+")"); break; // S
case 3: System.out.print("("+(10*(x-i)+y)+")"); break; // W
}
}
System.out.println("");
return this;
}
}
Комментариев нет:
Отправить комментарий