Крестики-нолики через ооп
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;
}
}
Вопросы:
- Почему при вызове метода смены игрока newGame.swapPlayers(newGame.whosNext); происходит изменение параметры whosNext но НЕ ТОГО которого нужно. Ведь this было использовано ?
- Почему проверка победителя происходит после проверки 2 из 3 координат ?
Ответы (1 шт):
Автор решения: Storozhev DJ
→ Ссылка
При TicTacToe newGame = new TicTacToe(); у нас создается новый объект newGame, со своими полями. При обращении к полю newGame.whosNext, мы обращаемся к полю whosNext объекта newGame, а при попытке смены игрока обращаемся к полю this.whosNext принадлежащему основной программе, а не объекта newGame.
Определение победителей происходит не верно, потому, что автор кода был не внимателен:
if ((field[i][0] == '0') && (field[i][1] == '0') && (field[i][0] == '0'))
Здесь дважды проверяется 0 элемент