raigen Ответов: 2

Simplyfing метод возвращает оператор, который имеет массивы


Можно ли упростить этот метод hasWinner (), я хочу проверить, не пуст ли какой-то индекс массива, а затем проверить, есть ли уже массивы, которые имеют одинаковое значение, метод работает, чтобы проверить, есть ли у крестиков-ноликов победитель еще или нет
Player currentPlayer;
private final Player[] boardOwned = new Player[9];

public boolean hasWinner() {
    return (boardOwned[0] != null && boardOwned[0] == boardOwned[1] && boardOwned[0] == boardOwned[2])
            || (boardOwned[3] != null && boardOwned[3] == boardOwned[4] && boardOwned[3] == boardOwned[5])
            || (boardOwned[6] != null && boardOwned[6] == boardOwned[7] && boardOwned[6] == boardOwned[8])
            || (boardOwned[0] != null && boardOwned[0] == boardOwned[3] && boardOwned[0] == boardOwned[6])
            || (boardOwned[1] != null && boardOwned[1] == boardOwned[4] && boardOwned[1] == boardOwned[7])
            || (boardOwned[2] != null && boardOwned[2] == boardOwned[5] && boardOwned[2] == boardOwned[8])
            || (boardOwned[0] != null && boardOwned[0] == boardOwned[4] && boardOwned[0] == boardOwned[8])
            || (boardOwned[2] != null && boardOwned[2] == boardOwned[4] && boardOwned[2] == boardOwned[6]);
}

public boolean boardFilledUp() {
    for (Player player : boardOwned) {
        if (player == null) {
            return false;
        }
    }
    return true;
}


Что я уже пробовал:

Я попытался извлечь его тремя методами и использовать цикл for, но он повторяется, и я еще не нашел рабочий код

public boolean hasWinner() {
    return checkHorizontal() || checkVertical() || checkDiagonal()
}

2 Ответов

Рейтинг:
13

OriginalGriff

Вторая версия намного чище и проще для чтения: и три метода намного чище для записи:

public boolean checkHorizontal() {
   for (int j = 1; j < 8; j += 3) {
      if (boardOwned[j] != null && boardOwned[j] == boardOwned[j - 1] && boardOwned[j] == boardOwned[j + 1]) {
         return true;
         }
      }
   return false;
   }
Аналогичный метод для вертикали, простой метод для двух диагоналей.


raigen

Спасибо OriginalGriff, но я все равно потерял, почему внутри, если есть три boardOwned[j] == boardOwned[j - 1]?

OriginalGriff

Чрезмерное усердие copy'n'paste из-за нехватки кофе ... теперь исправлено.

raigen

Дай пять, Спасибо тебе, Оригиналгрифф!

Рейтинг:
0

raigen

Это более чистый код, благодаря объяснению OriginalGriff, хорошо для диагонали, я думаю, что ручная проверка индекса лучше, чем циклическая по диагонали, так как 0,4,8 и 2,4,6 имеют разный инкремент

Player currentPlayer;
private final Player[] boardOwned = new Player[9];

public boolean hasWinner() {
    return checkHorizontal() || checkVertical() || checkDiagonal();
}

private boolean checkVertical() {
    for (int j = 6; j < 9; j += 1) {
        if (boardOwned[j] != null && boardOwned[j] == boardOwned[j - 3] &&
                boardOwned[j] == boardOwned[j - 6])
        {
            return true;
        }
    }
    return false;
}

public boolean checkHorizontal() {
    for (int j = 1; j < 8; j += 3) {
        if (boardOwned[j] != null && boardOwned[j] == boardOwned[j-1] && boardOwned[j] == boardOwned[j+1]) {
            return true;
        }
    }
    return false;
}

private boolean checkDiagonal(){
    return (boardOwned[0] != null && boardOwned[0] == boardOwned[4] && boardOwned[0] == boardOwned[8])
            || (boardOwned[2] != null && boardOwned[2] == boardOwned[4] && boardOwned[2] == boardOwned[6]);
}