Проблема с использованием ключевого слова 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 шт):
Player swapPlayer() {
if (player == players.get(0)) {
player = players.get(1);
} else {
player = players.get(0);
}
return player;
}