Страницы

Поиск по вопросам

понедельник, 17 декабря 2018 г.

Как можно максимально сократить этот код?

Морской бой. Пишу метод для поворота корабля.
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; } }

Комментариев нет:

Отправить комментарий