@Legacz

Как возможно сделать этот код короче?

Написал код поворота кораблика + случаи если при повороте, он выходит за границу, то поворот в противоположную сторону. Но код вышел слишком большой. Возможно ли сделать его более компактным?

(shipSize - размер кораблика. Field.ceils[yMove + i][xMove].type = 0 - клетка становится пустой; Field.ceils[yMove + i][xMove].type = 1 - клетка занята корабликом; direct - сторона кораблика, 0 - юг, 1 - запад, 2 - север, 3 - восток; yMove - положение кораблика по y; xMove - положение кораблика по x;).
Сам код
case SPACE:

                if (direct == 0 && xMove + 1 > shipSize - 1) {              // direct 0 --> direct 1
                    for (i = 0; i < shipSize; i++) {
                        Field.ceils[yMove + i][xMove].type = 0;
                        Field.ceils[yMove][xMove - i].type = 1;
                    }
                    direct = 1;
                }

                else if (direct == 1 && yMove + 1 >= shipSize) {            // direct 1 --> direct 2
                    for (i = 0; i < shipSize; i++) {
                        Field.ceils[yMove][xMove - i].type = 0;
                        Field.ceils[yMove - i][xMove].type = 1;
                    }
                    direct = 2;
                }

                else if (direct == 2 && SIZE >= shipSize + xMove) {         // direct 2 --> direct 3
                    for (i = 0; i < shipSize; i++) {
                        Field.ceils[yMove - i][xMove].type = 0;
                        Field.ceils[yMove][xMove + i].type = 1;
                    }
                    direct = 3;
                }
                
                else if (direct == 3 && yMove + shipSize < SIZE + 1) {      // direct 3 --> direct 0
                    for (i = 0; i < shipSize; i++) {
                        Field.ceils[yMove][xMove + i].type = 0;
                        Field.ceils[yMove + i][xMove].type = 1;
                    }
                    direct = 0;
                }
                else if (direct == 0 && xMove + 1 < shipSize) {             // direct 0 --> direct 3
                    for (i = 0; i < shipSize; i++) {
                        Field.ceils[yMove + i][xMove].type = 0;
                        Field.ceils[yMove][xMove + i].type = 1;
                    }
                    direct = 3;
                }
                else if (direct == 1 && yMove + 1 < shipSize) {             // direct 1 --> direct 0
                    for (i = 0; i < shipSize; i++) {
                        Field.ceils[yMove][xMove - i].type = 0;
                        Field.ceils[yMove + i][xMove].type = 1;
                    }
                    direct = 0;
                }
                else if (direct == 2 && xMove + shipSize > SIZE) {          // direct 2 --> direct 1
                    for (i = 0; i < shipSize; i++) {
                        Field.ceils[yMove - i][xMove].type = 0;
                        Field.ceils[yMove][xMove - i].type = 1;
                    }
                    direct = 1;
                }
                else if (direct == 3 && yMove + shipSize + 1> SIZE) {       // direct 3 --> direct 2
                    for (i = 0; i < shipSize; i++) {
                        Field.ceils[yMove][xMove + i].type = 0;
                        Field.ceils[yMove - i][xMove].type = 1;
                    }
                    direct = 2;
                }
                break;
  • Вопрос задан
  • 108 просмотров
Решения вопроса 1
Adamos
@Adamos
Все циклы в коде - одной и той же длины, отличаются только шагом.
Цикл выполняется один раз максимум.
Очевидно, логично определять в ветвлении шаг и выполнить цикл только один раз, если этот шаг не нулевой.
Шаг - пара координат [0, 1], [1, 0], [-1, 0] и т.п., нулевой шаг - [0, 0] можно задать до ветвления.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Вместо 4 сторон света лучше брать единичный вектор на плоскости (x,y). Тогда формулы удара о борт получаются тривиальные. Просто где то меняется знак с плюса на минус.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы