Как перезапустить или сбросить JPanel, чтобы получить новый размер для GridLayout (игра в крестики-нолики)

#java #jframe #jpanel

#java #jframe #jpanel

Вопрос:

Я создаю это приложение для игры в крестики-нолики для проекта. Я вроде как собрал воедино некоторые распространенные коды, которые я нашел в Интернете для игровой механики крестики-нолики и тому подобного, но я изменил / добавил некоторый код, чтобы вы могли выбирать между сеткой 3×3, 4×4 или 5×5. Все дело в GridLayout, размер которого меняется в зависимости от того, что пользователь выбирает в первой панели JOptionPane.

Моя текущая проблема связана с его завершением, когда отображается панель JOptionPane с «ДА» и «НЕТ». Если вы нажмете «ДА», я хочу, чтобы код вернулся к самой первой панели JOptionPane, где вы снова выбираете размер сетки.

Я не совсем уверен, как двигаться дальше с этой проблемой. Пожалуйста, помогите.

Также есть код для проверки того, заполнена ли доска и никто не выигрывает, но он похож на оператор playerWins if, поэтому я не думаю, что это имеет большое значение.

 public TicTacToe(){
      startGame();
    }

    `````````\other methods

    public void startGame(){
      setGridSize(); \JOptionPane where you choose between 3x3, 4x4, 5x5
      setNames(); \set player names
      setTotalButtons();
      setLayout(new GridLayout(gridSize,gridSize));
      initializeButtons(); 
    }
    `````````
    private class buttonListener implements ActionListener{

             `````````
            if(turnCounter%2 == 0){
                buttonClicked.setText("X");
                buttonClicked.setEnabled(false);
                buttonClicked.setBackground(colorX);
            } else {
                buttonClicked.setText("O");
                buttonClicked.setEnabled(false);
                buttonClicked.setBackground(colorO);
            }

            `````````\call methods to check for win

            if (playerWins == true){
                String winner;
                if (turnCounter%2 == 0)
                    winner = playerX;
                else
                    winner = playerO;

                int reply = JOptionPane.showConfirmDialog(null, winner   " wins! New game?", "Game Over", JOptionPane.YES_NO_OPTION);
                if (reply == JOptionPane.NO_OPTION)
                    System.exit(0);
                else
                    resetButtons();\currently just clears board, but it still remains as a 3x3 grid (or whichever you chose)              
            }

  

И вот основной метод.

 public static void main(String[] args) {
        JFrame window = new JFrame("Tic-Tac-Toe");

        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.getContentPane().add(new TicTacToe(), BorderLayout.CENTER);

        JLabel gameInfo = new JLabel("TIC-TAC-TOE");
        gameInfo.setHorizontalAlignment(SwingConstants.CENTER);

        window.add(gameInfo, BorderLayout.NORTH);

        window.setBounds(300,200,300,300);
        window.setVisible(true);
    }
}
  

РЕДАКТИРОВАТЬ: Вот часть кода resetButtons ().

 public void resetButtons(){
        for(int i = 0; i <= totalButtons; i  )
        {
            buttons[i].setText("");
            buttons[i].setEnabled(true);
            buttons[i].setBackground(backgroundColor);
            buttons[i].setOpaque(false);
            buttons[i].setContentAreaFilled(true);
        }
    }
  

Комментарии:

1. Привет, гранитографы, две вещи. Первое — не могли бы вы опубликовать свой метод resetButtonsMethod, пожалуйста. Во-вторых, вам, вероятно, следует использовать {} в ваших условных операторах, их неиспользование может привести к беспорядку через некоторое время.

2. Хорошо. Я немного добавлю этот метод. И насчет {}, я пытаюсь избавиться от этой вредной привычки, хахахаха