2015-11-30 3 views
1

Я закончил с моей игрой tictactoe, но я не могу понять, как заставить мою кнопку перезапуска начать игру. Я также хотел бы, чтобы игра перезагрузилась, когда кто-то победил, или есть галстук. Любая помощь будет принята с благодарностью.TicTacToe GUI App Reset button

Вот мой код (жаль, что так много его):

package tictactoe; 
import javax.swing.JFrame; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.LineBorder; 
public class TicTacToe 
{ 


    public static void main(String[] args) 
    { 
     JFrame ticTacToe = new TicTacToeFrame(); 
     ticTacToe.setTitle("Phantom TicTacToe Game!"); 
     ticTacToe.setSize(600, 600); 
     ticTacToe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     ticTacToe.setLocationRelativeTo(null); 
     ticTacToe.setVisible(true); 
    } 

} 
class TicTacToeFrame extends JFrame implements ActionListener 
{ 

    private char whoseTurn = 'X'; 
    private boolean gameOver = false; 


    private Cell[][] cells = new Cell[3][3]; 


    JLabel jlblStatus = new JLabel("X's turn to play"); 


    public TicTacToeFrame() 
    { 
     JButton btn = new JButton("Reset"); 
     JPanel panel = new JPanel(new GridLayout(3, 3, 0, 0)); 
     for (int i = 0; i < 3; i++) 
      for (int j = 0; j < 3; j++) 
       panel.add(cells[i][j] = new Cell()); 


     add(btn, BorderLayout.SOUTH); 
     add(panel, BorderLayout.CENTER); 
     add(jlblStatus, BorderLayout.NORTH); 
     jlblStatus.setOpaque(true); 
     jlblStatus.setBackground(Color.YELLOW); 
    } 


    public boolean isFull() 
    { 
     for (int i = 0; i < 3; i++) 
      for (int j = 0; j < 3; j++) 
       if (cells[i][j].getToken() == ' ') 
        return false; 
     return true; 
    } 


    public boolean isWon(char token) 
    { 

     for (int i = 0; i < 3; i++) 
      if ((cells[i][0].getToken() == token) 
        && (cells[i][1].getToken() == token) 
        && (cells[i][2].getToken() == token)) 
      { 
       return true; 
      } 


     for (int j = 0; j < 3; j++) 
      if ((cells[0][j].getToken() == token) 
       && (cells[1][j].getToken() == token) 
       && (cells[2][j].getToken() == token)) 
      { 
       return true; 
      } 

     if ((cells[0][0].getToken() == token) 
       && (cells[1][1].getToken() == token) 
       && (cells[2][2].getToken() == token)) 
      { 
       return true; 
      } 

     if ((cells[0][2].getToken() == token) 
       && (cells[1][1].getToken() == token) 
       && (cells[2][0].getToken() == token)) 
      { 
       return true; 
      } 

     return false; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     JButton bttn = (JButton) e.getSource(); 
     if(bttn == btn) 
     { 

     } 
    } 


    public class Cell extends JPanel 
    { 

     private char token = ' '; 


     public Cell() 
     { 
      setBorder(new LineBorder(Color.black, 1)); 
      addMouseListener(new MyMouseListener()); 
     } 


     public char getToken() 
     { 
      return token; 
     } 


     public void setToken(char c) 
     { 
      token = c; 
      repaint(); 
     } 

     @Override 
     protected void paintComponent(Graphics g) 
     { 
      super.paintComponent(g); 

      if (token == 'X') 
      { 
       g.drawLine(10, 10, getWidth() - 10, getHeight() - 10); 
       g.drawLine(getWidth() - 10, 10, 10, getHeight() - 10); 
      } 

      else if (token == 'O') 
      { 
       g.drawOval(10, 10, getWidth() - 20, getHeight() - 20); 
      } 
     } 

     private class MyMouseListener extends MouseAdapter 
     { 
      @Override 
      public void mouseClicked(MouseEvent e) 
      { 
       if (gameOver) 
        return; 


       if (token == ' ' && whoseTurn != ' ') 
        setToken(whoseTurn); 


       if (isWon(whoseTurn)) 
       { 
        jlblStatus.setText(whoseTurn + " won! Game over!"); 
        whoseTurn = ' '; 
        gameOver = true; 
       } 
       else if (isFull()) 
       { 
        jlblStatus.setText("Tie game! Game over!"); 
        whoseTurn = ' '; 
        gameOver = true; 
       } 
       else 
       { 
        whoseTurn = (whoseTurn == 'X') ? 'O' : 'X'; 
        jlblStatus.setText(whoseTurn + "'s turn."); 
       } 
      } 

     } 
    } 
} 
+2

Повторное использование вашего 'для-loop's от вас конструктору ...? Возможно, оберните его в метод, который можно более легко использовать повторно. – MadProgrammer

+0

Поместите его в метод, который, возможно, называется 'reset()'. –

+0

Вы должны снова инициализировать все, что было, когда игра началась в первый раз, обернув эту функциональность таким методом, как @MadProgrammer. – charliebrownie

ответ

0

Вам нужно сбросить состояние вашей программы, в том числе либо отдых или сброс некоторых пользовательского интерфейса (метка и панель с девятью ячейками должна быть изменена).

Вопросы взглянуть на:

  • TicTacToeFrame имеет actionPerformed метод и реализует интерфейс ActionListener, но кнопка сброса не имеет слушатель действия еще;
  • для сброса: можно, например, установить whoseTurn и gameOver полей к их исходному значению, установите текст в jlblStatus этикетке, и
    • вариант 1: удалить все клетки из panel и добавлять новые (как вы уже делаете в конструкторе - это может быть initializeCells метод) или
    • вариант 2 (если вы предпочитаете рециркуляцию): добавить метод reset к Cell класса, который очищает token поле, вызовите этот метод сброса для всех ячеек, и сообщите panel, чтобы перекрасить).

Маленькие вещи, чтобы иметь в виду:

  • , если вы хотите использовать panel и button компоненты вне конструктора, изменить их в полях (вместо локальных переменных);
  • оператор if в методе actionPerformed использует оператор == вместо метода equals - вы уверены в этом? (подсказка: см. What is the difference between == vs equals() in Java?).
0

У вас уже есть код.

JFrame ticTacToe = new TicTacToeFrame(); 
    ticTacToe.setTitle("Phantom TicTacToe Game!"); 
    ticTacToe.setSize(600, 600); 
    ticTacToe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    ticTacToe.setLocationRelativeTo(null); 
    ticTacToe.setVisible(true); 

Просто поместите его внутри метода startNewGame() и назвать его как в начале, и когда игра выиграна;)