Объясните пожалуйста как срабатывает ничья в этом коде? Понятно что метод 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();
}
}
еще если кто то может объясните то что помечено комментарием "разобраться с тем что ниже"