Проблема с использованием ключевого слова this

Начало тут: Вопрос по работе цикла while внутри метода

Текущая версия: https://gist.github.com/EugeneWenew/0dac17a5448e60ec5eb84ee357544fad

Предыстория/требования: 00П крестики-нолики. Смена игроков, ограничение на неправильность(выход за рамки)/заполненность поля, проверка на отсутствие победителя. Текущее положение - проверка уникальности текущей координаты.

Класс игрока:

public class Player {
    private int id;
    private static int count = 0;
    private String name;


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    Player() {
        count++;
        id = count;
    }

    Player(String name) {
        this();
        this.name = name;
    }

    @Override
    public String toString() {
        return "Player{" +
                "id " + id +
                ", name='" + name + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

}

Класс-менеджер игроков:

public class PlayerManager {
    ArrayList<Player> players;
    Player player;

    public Player getPlayer() {
        return player;
    }


    PlayerManager() {
        players = new ArrayList<>();
    }

    void addPlayer(String name) {
        Player player = new Player(name);
        players.add(player);
    }


    Player getFirstPlayer() {
        return players.get(0);
    }

    Player getSecondPlayer() {
        return players.get(1);
    }

    @Override
    public String toString() {
        return "PlayerManager{" +
                ", players=" + players +
                '}';
    }

    Player swapPlayer() {
        if (this.player == players.get(0)) {
            return players.get(1);
        } else {
            return players.get(0);
        }
    }


}

Класс игровое поле:

import java.util.ArrayList;
import java.util.Scanner;


public class Field {
    private char[][] field;                                     //видимое поле 1

    ArrayList<Point> space;                         //альтернативное внутреннее поле 2

    Scanner scanner;
    Field() {
        char[][] field = new char[3][3];                // 1
        this.field = field;
        space = new ArrayList<Point>();
    }


    void fillTheField() {                               // 1
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                this.field[i][j] = '.';
            }
        }
        Point init = new Point(-1, -1);
        space.add(init);
    }

    public char[][] getField() {
        return field;
    }

    public ArrayList<Point> getSpace() {
        return space;
    }


    void printField() {
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                System.out.print(this.field[i][j] + "\t\t");
            }
            System.out.println("");
            System.out.println("");
        }
        System.out.println("");
        System.out.println("");
    }

    void madeTheMark(Field field, Point point, Player player) {
        if (player.getId() == 1) {
            field.markO(point.getX(), point.getY());
        } else {
            field.markX(point.getX(), point.getY());
        }
    }

    void markX(int x, int y) {
        this.field[x][y] = 'X';
    }

    void markO(int x, int y) {
        this.field[x][y] = '0';
    }

    Point getCellCoords() {
        scanner = new Scanner(System.in);
        int i = -2;
        while ((i < 0) || (i > 2)) {
            System.out.println("Введите позицию по горизонтали(от 0 до 2):");
            i = scanner.nextInt();
            scanner.nextLine();
        }
        int j = -3;
        while ((j < 0) || (j > 2)) {
            System.out.println("Введите позицию по вертикали(от 0 до 2):");
            j = scanner.nextInt();
            scanner.nextLine();
        }
        Point point = new Point(j, i);

        if (checkPoint(point)) {
            System.out.println("Уже было:");
            System.out.println("Вводите повторно!");
            getCellCoords();
        } else {
            space.add(point);
            return point;
        }
        return point;
    }

    boolean checkPoint(Point point) {
        for (Point spaces : space) {
            if ((point.getX() == spaces.getX()) & (point.getY() == spaces.getX())) {
                return true;
            }
        }
        return false;
    }


    boolean checkCells(char[][] field) {

        for (int i = 0; i < 3; i++) {
            if (((field[i][0]) == 'X') & ((field[i][1]) == 'X') & ((field[i][2]) == 'X')) {
                return true;
            } else if ((((field[0][i]) == 'X')) & ((field[1][i]) == 'X') & ((field[2][i]) == 'X')) {
                return true;
            }
        }
        if (((field[0][0]) == 'X') & ((field[1][1]) == 'X') & ((field[2][2]) == 'X')) {
            return true;
        } else if (((field[2][0]) == 'X') & ((field[1][1]) == 'X') & ((field[0][2]) == 'X')) {
            return true;
        }
        for (int i = 0; i < 3; i++) {
            if (((field[i][0]) == '0') & ((field[i][1]) == '0') & ((field[i][2]) == '0')) {
                return true;
            } else if ((((field[0][i]) == '0')) & ((field[1][i]) == '0') & ((field[2][i]) == '0')) {
                return true;
            }
        }
        if (((field[0][0]) == '0') & ((field[1][1]) == '0') & ((field[2][2]) == '0')) {
            return true;
        } else if (((field[2][0]) == '0') & ((field[1][1]) == '0') & ((field[0][2]) == '0')) {
            return true;
        }
        if (space.size() == 9){
            return true;
        }
        return false;
    }


}

Класс координаты:

public class Point {
    int x, y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Point point = (Point) o;
        return x == point.x &&
                y == point.y;
    }

    @Override
    public int hashCode() {
        return Objects.hash(x, y);
    }
}

Класс - точка входа.

> import java.util.Scanner;
    > 
    > public class Main {
    > 
>     public static void main(String[] args) {
>         Main start = new Main();
>         start.runGame();
>     }
> 
>     void runGame() {
>         PlayerManager manager = new PlayerManager();
>         manager.addPlayer(playerInvitation());
>         manager.addPlayer(playerInvitation());
>         Field plate = new Field();
> 
>         plate.fillTheField();               //инициализация поля отображаемого для игроков
>         plate.printField();
>         mainCycle(plate, manager);
>     }
> 
>     void mainCycle(Field plate, PlayerManager manager) {
>         manager.getSecondPlayer();
>         do {
>             manager.swapPlayer();
>             plate.madeTheMark(plate, plate.getCellCoords(), manager.getPlayer());
>             plate.printField();
>             if (plate.checkCells(plate.getField())) {
>                 if (plate.getSpace().size() == 9) {
>                     System.out.println("Nичья");
>                     break;
>                 }
>                 System.out.println("Победил игрок " + manager.getPlayer().getName());
>                 break;
>             }
>         } while (!plate.checkCells(plate.getField()));
>     }
> 
>     String playerInvitation() {
>         System.out.println("Введите имя игрока: ");
>         Scanner scanner = new Scanner(System.in);
>         String name = scanner.nextLine();
>         return name;
>     } }

Описание проблемы: При проверке координаты изначально планировалась конструкция == или .equals. Также проверялся .contains Поскольку это Arraylist, и в нем ссылки, то одинаковые по значениям координаты определялись различными. Поэтому сделано через поочередное сравнение полей класса Point, метод: boolean checkPoint(Point point) {

Вопрос: Вероятно коряво выполнена проверка и рекурсия в методе getCellCoords, здесь:

    if (checkPoint(point)) {
        System.out.println("Уже было:");
        System.out.println("Вводите повторно!");
        getCellCoords();
    } else {
        space.add(point);
        return point;
    }
    return point;
}

В общем - позволяет брать одну и ту же координату повторно + ПЕРЕПИСЫВАЕТ знак в указанной координате, т.е. был по коорд. 1.1. нолик, ввели 1.1. , произошел запрос повтора ввода, НО знак переписался на крестик.

Что сделано неверно?


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

Автор решения: Igor
Player swapPlayer() {
    if (player == players.get(0)) {
        player = players.get(1);
    } else {
        player = players.get(0);
    }
    return player;
}
→ Ссылка