Я делаю Tic-Tac-Toe игру на Java. У меня есть четыре класса:
TicTacTester просто вызывает (создает объект) класс TicTacToe.
Класс TicTacToe предоставляет графический интерфейс игры (это подкласс JFrame). Он также создает 9 кнопок для отображения JPanel и пользователей для нажатия.
Класс XOButton определяет, что могут делать кнопки, и метод actionPerformed.
Наконец, класс GameEnd определяет, что происходит, когда игра заканчивается (создается новый JFrame для отображения счета и предоставления пользователю 2 кнопок: выход и перезапуск).
Проблема заключается в том, что я пытаюсь закодировать содержимое того, что происходит, когда пользователь нажимает кнопку «перезапустить». Предполагается вызвать метод resetBoard (), который определен в классе TicTacToe. Проблема в том, что я не знаю имени объекта, созданного из класса TicTacToe (в методе static void main класса класса tester я только что набрал «new TicTacToe», мне не нужно было определять имя). Я не могу вызвать resetBoard со статической точки зрения (т.е. я не могу сделать TicTacToe.resetBoard ();), потому что resetBoard должен быть нестатичным.
Что я пробовал:
Я попытался включить в конструктор класса GameEnd объект TicTacToe. Если я сделаю это, создатель объекта GameEnd должен перейти в класс TicTacToe, чтобы я мог использовать ключевое слово this. Это не работает, поскольку объект GameEnd необходимо создавать при выполнении условия WinCondition, которое проверяется при нажатии кнопки в классе XOButton.
Но если я помещу создатель объекта GameEnd в класс XOButton (где находится прямо сейчас и, предположительно, где он должен быть), в конструктор для GameEnd (String s, TicTacToe a), я не смогу использовать 'this' ключевое слово для объекта TicTacToe.
Это мой класс кнопок. Большая часть кода не имеет значения, поэтому она была скрыта.
public class XOButton extends JButton implements ActionListener {
//Hidden code
private void winCheck() {
for(int j = 0; j < 3; j++) {
if(board[j][0] == 1 && board[j][1] == 1 && board[j][2] == 1 || board[0][j] == 1 && board[1][j] == 1 && board[2][j] == 1) {
player1Score++;
GameEnd end = new GameEnd("X wins this round!");
finished = true;
break;
}
else if(board[j][0] == 2 && board[j][1] == 2 && board[j][2] == 2 || board[0][j] == 2 && board[1][j] == 2 && board[2][j] == 2) {
player2Score++;
GameEnd end = new GameEnd("O wins this round!");
finished = true;
break;
}
}
if(board[0][0] == 1 && board[1][1] == 1 && board[2][2] == 1 || board[0][2] == 1 && board[1][1] == 1 && board[2][0] == 1) {
player1Score++;
GameEnd end = new GameEnd("X wins this round!");
finished = true;
}
else if(board[0][0] == 2 && board[1][1] == 2 && board[2][2] == 2 || board[0][2] == 2 && board[1][1] == 2 && board[2][0] == 2) {
player2Score++;
GameEnd end = new GameEnd("O wins this round!");
finished = true;
}
if(turn == 9 && !finished) {
GameEnd end = new GameEnd("This round is a Draw");
finished = true;
}
}
public void resetButton() {
this.setIcon(null);
markSpot(0);
this.clicked = false;
}
public static void resetStatics() {
turn = 0;
finished = false;
}
}
Это класс TicTacToe. Большая часть кода не имеет значения, поэтому она была скрыта.
public class TicTacToe extends JFrame {
//Hidden code
public void resetBoard() {
for(int j = 0; j < 3; j++) {
for(int i = 0; i < 3; i++) {
buttons[j][i].resetButton();
}
}
XOButton.resetStatics();
}
}
Это класс GameEnd. Объект этого создается при выполнении условия WinCondition. Большая часть кода не имеет значения, поэтому она была скрыта.
public class GameEnd extends JFrame implements ActionListener {
//Hidden code
public void actionPerformed(ActionEvent e) {
if(e.getSource() == exit) {
System.exit(0);
}
else if(e.getSource() == retry) {
TicTacToe.resetBoard();
}
}
}
//This is the Tester class
public class TicTacTester {
public static void main(String[] args) {
new TicTacToe();
}
}
Я ожидаю перезагрузки игрового поля.