Как получить объект Java Frame для использования в методе Reset? - PullRequest
0 голосов
/ 27 мая 2019

Я делаю 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();
    }
}

Я ожидаю перезагрузки игрового поля.

1 Ответ

1 голос
/ 27 мая 2019

Похоже, вы слишком сильно ломаете проект. Если у вас есть класс для игры, храните все его методы внутри этого класса. Единственный раз, когда я могу подумать об использовании отдельных классов, это если вы пытаетесь создать это с использованием архитектуры Model-View-Controller (MVC) или чего-то подобного. Это общий подход для приложений, использующих графический интерфейс, доступ к данным и контроллеры.

Могут быть и другие времена, но это все, о чем я могу думать на макушке головы.

Из того, что вы показываете, я не думаю, что это применимо.


Я думаю, что это был бы лучший подход:

TicTacToe.java

public class TicTacToe extends JFrame {
    private int scorePlayer1;
    private int scorePlayer2;
    private boolean initialized;    // default = false

    // Reset the board
    // Reset the markers, etc.
    public void resetGame() {}

    // Check to see if there is a winner
    // If so, announce the winner and return true
    // Otherwise, return false.
    public boolean winCheck() {}

    // Set up frame, buttons, score, etc.
    public void newGame(){
        // Create however many JPanels you need
        // Add it to a single JFrame

        // When you're ready...
        // and this game has not been initialized for the first time.
        // In this example jframe is an instance of JFrame
        if (!this.initialized)
            jframe.setVisible(true);
    }

    // Play the game
    public void play(){
        // For each round,
        // a player chooses where to put their "X" or "O"
        // add scores, etc.

        // Then at the end of each round
        if (this.winCheck())
            this.resetGame();
    }
}

TicTacToeTester.java:

public class TicTacToeTester {
    public static void main(String[] args){
        TicTacToe game = new TicTacToe();
        game.play();
    }
}

Надеюсь, это поможет!

Дайте мне знать, если у вас есть какие-либо вопросы. :)

...