как срабатывает ничья в игре крестики нолики?

Объясните пожалуйста как срабатывает ничья в этом коде? Понятно что метод isDraw возвращает true, когда в массиве не остается нолей. Но что заставляет цикл (do ... while) остановится? Вроде бы очевидно, что isGameOver(n) => true, но для меня не очевидно как этот метод становится true..

import java.util.Scanner;

public class GameField {
    // 0 - "_"
    // 1 - "Player1"
    // 2 - "Player2"
    // 012, 345, 678, 036, 147, 258, 048, 246 <-- Варианты победы

    private int[] field = new int[] {0,0,0,
                                     0,0,0,
                                     0,0,0};

    private void initGame() {
        boolean inGame;
        boolean isCurrentPlayerX = false;
       do {
            isCurrentPlayerX = !isCurrentPlayerX;
            drawField();
           System.out.println("Ходят " + (isCurrentPlayerX ? "крестики: " : "нолики: "));
            int n = getNumber();
            field[n] = isCurrentPlayerX ? 1 : 2;
            inGame = !isGameOver(n);
            if (isDraw()) {
                System.out.println("Ничья");
                return;
            }
        } while (inGame);
       drawField();
        System.out.println((isCurrentPlayerX ? "Крестики" : "Нолики") + " победили!");
    }

    private void drawField() {
        System.out.println("     |     |     ");
        for (int i = 0; i < field.length; i++) {
            if (i != 0) {
                if (i % 3 == 0) {
                    System.out.println("\n_____|_____|_____");
                    System.out.println("     |     |     ");
                } else
                    System.out.print("|");
            }
            if (field[i] == 0) System.out.print("  " + i + "  ");
            if (field[i] == 1) System.out.print("  " + "X" + "  ");
            if (field[i] == 2) System.out.print("  " + "O" + "  ");
        }
        System.out.println("\n     |     |     ");
    }

    private int getNumber() {
        Scanner in = new Scanner(System.in);
        while (true) {
            try {
                int n = Integer.parseInt(in.nextLine());
                if (n >= 0 && n < field.length && field[n] == 0)
                    return n;
            } catch (NumberFormatException e) {
                System.out.println("Введите число!");
            }
        }
    }

    private boolean isGameOver(int n) {
        // Проверка строк и столбцов
        int row = n - n % 3;
        if (field[row] == field[row+1]) {
            if (field[row] == field[row+2]) {
                return true;
            }
        }
        int column = n % 3;
        if (field[column] == field[column+3]) {
            if (field[column] == field[column+6]) {
                return true;
            }
        }
        // Разобраться с тем что ниже
        if (n % 2 != 0) {
            return false;
        }
        if (n % 4 == 0) {
            if (field[0] == field[4] && field[0] == field[8]) {
                    return true;
                }
                if (n != 4) return false;
            }

        return field[2] == field[4] && field[2] == field[6];
    }

    private boolean isDraw() {
        for (int i : field) {
            if (i == 0) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        new GameField().initGame();
    }
}

еще если кто то может объясните то что помечено комментарием "разобраться с тем что ниже"


Ответы (1 шт):

Автор решения: Pentiux
    // Разобраться с тем что ниже
    if (n % 2 != 0) { //если не четный номер поля, то дальше нет смысла проверять
        return false;
    }
    if (n % 4 == 0) { // если поле 0, 4 или 8 то есть смысл проверить 
        if (field[0] == field[4] && field[0] == field[8]) { // проверка одного из условий победы 048
                return true;
            }
         if (n != 4) return false; // если не центральное поле то нет смысла проверять дальше
        }

    return field[2] == field[4] && field[2] == field[6]; //последнее условие победы 246
}

private boolean isDraw() {
    for (int i : field) { // если все поля не 0 то ничья
        if (i == 0) {
            return false;
        }
    }
    return true;
}
→ Ссылка