-1

Объясните пожалуйста как срабатывает ничья в этом коде? Понятно что метод 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(&quot;Ходят &quot; + (isCurrentPlayerX ? &quot;крестики: &quot; : &quot;нолики: &quot;));
        int n = getNumber();
        field[n] = isCurrentPlayerX ? 1 : 2;
        inGame = !isGameOver(n);
        if (isDraw()) {
            System.out.println(&quot;Ничья&quot;);
            return;
        }
    } while (inGame);
   drawField();
    System.out.println((isCurrentPlayerX ? &quot;Крестики&quot; : &quot;Нолики&quot;) + &quot; победили!&quot;);
}

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

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

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] &amp;&amp; field[0] == field[8]) {
                return true;
            }
            if (n != 4) return false;
        }

    return field[2] == field[4] &amp;&amp; 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 Answers1

0
    // Разобраться с тем что ниже
    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;
}
Pentiux
  • 518
  • 2
  • 9