Крестики-нолики через ооп

import java.util.Arrays;
import java.util.Scanner;

public class TicTacToe {
    int[][] field = new int[3][3];//поле
    int[] players = new int[2];//игроки
    int whosNext = 0;//маркер игрока
    boolean isWinner = false;//проверка окончания игры

public static void main(String[] args) throws Exception {
    Scanner scan = new Scanner(System.in);
    TicTacToe newGame = new TicTacToe();
    newGame.players[0] = 0;//идентификаторы игроков
    newGame.players[1] = 1;
    newGame.fill(newGame.field);//заполнение поля пустыми полями


    while (!newGame.isWinner) {
        System.out.println("Ходит игрок " + newGame.whosNext);
        System.out.println("Введите ячейку(в формате строка/столбец через  \\n)(цифры от 1 до 3): ");
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                System.out.print((char) newGame.field[i][j] + "\t");
            }
            System.out.print("\n");
        }
        int celli = scan.nextInt() - 1;//задание координаты клетки хода игрока
        int cellj = scan.nextInt() - 1;
        if (newGame.field[celli][cellj] == '☐') {
            newGame.field[celli][cellj] = newGame.makeSign(newGame.whosNext);


            try {
                Thread.sleep(1000);//просто задержка просто потому что

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println();
        } else continue;
        newGame.checkWinner(newGame.field);//проверка окончания
        newGame.swapPlayers(newGame.whosNext);//смена игрока

    }
}

@Override
public String toString() {
    return super.toString();
}

char makeSign(int whosNext) {//метод выбора символа для маркировки поля
    if (whosNext == 0) {

        return '0';
    } else return 'X';

}

void fill(int[][] field) {//метод заполнения поля
    this.field = field;
    for (int i = 0; i < field.length; i++) {
        for (int j = 0; j < field.length; j++) {
            field[i][j] = '☐';
        }
    }
}


void checkWinner(int[][] field) {//метод проверки победителя
    this.field = field;
    for (int i = 0; i < 3; i++) {
        if ((field[i][0] == 'X') && (field[i][1] == 'X') && (field[i][0] == 'X')) {
            System.out.println("победитель 1");
            isWinner = true;
        } else if ((field[0][i] == 'X') && (field[1][i] == 'X') && (field[2][i] == 'X')) {
            System.out.println("победитель 1");
            isWinner = true;
        }
    }//организация проверки выигрышных комбинаций по вертикали/горизонтали
    for (int i = 0; i < 3; i++) {
        if ((field[i][0] == '0') && (field[i][1] == '0') && (field[i][0] == '0')) {
            System.out.println("победитель 0");
            isWinner = true;

        } else if ((field[0][i] == '0') && (field[1][i] == '0') && (field[2][i] == '0')) {
            System.out.println("победитель 0");
            isWinner = true;
        }
    }
}

int swapPlayers(int whosNext) {//метод смены игрока
    this.whosNext = whosNext;
    if (whosNext == 0) {
        whosNext = 1;
    } else whosNext = 0;
    return whosNext;


   }
}

Вопросы:

  1. Почему при вызове метода смены игрока newGame.swapPlayers(newGame.whosNext); происходит изменение параметры whosNext но НЕ ТОГО которого нужно. Ведь this было использовано ?
  2. Почему проверка победителя происходит после проверки 2 из 3 координат ?

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

Автор решения: Storozhev DJ
  1. При TicTacToe newGame = new TicTacToe(); у нас создается новый объект newGame, со своими полями. При обращении к полю newGame.whosNext, мы обращаемся к полю whosNext объекта newGame, а при попытке смены игрока обращаемся к полю this.whosNext принадлежащему основной программе, а не объекта newGame.

  2. Определение победителей происходит не верно, потому, что автор кода был не внимателен:

    if ((field[i][0] == '0') && (field[i][1] == '0') && (field[i][0] == '0'))

Здесь дважды проверяется 0 элемент

→ Ссылка