2013-04-09 105 views
0

首先,我想表示感謝您的任何幫助。我對Java編程比較陌生。我製作了一個簡單的TicTacToe遊戲,我遇到了一些麻煩。爲什麼不布爾值切換?

每隔一段時間「X」或「O」將連續播放兩次。我有一個布爾變量,應該從true切換到false,每個玩家輪流轉換「X」到「O」,但由於某種原因,它不會隨機切換。

我在想這可能是Eclipse或其他問題,因爲我不明白爲什麼它會這樣做。

下面是遊戲的代碼:

public class gameMain { 

    Boolean player = true; 
    JPanel gameBoard; 
    JButton[] b = new JButton[10]; 
    Font font = new Font("Arial", Font.BOLD, 99); 
    ListenForButtons lfb = new ListenForButtons(); 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new gameMain(); 
      } 
     }); 
    } 

    public gameMain() { 
     JFrame j = new JFrame("TicTacToe"); 
     j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     j.setLocationRelativeTo(null); 
     j.setSize(400, 400); 

     gameBoard = new JPanel(); 
     gameBoard.setLayout(new GridLayout(3, 3)); 

     b[1] = new JButton(""); 
     b[1].addActionListener(lfb); 
     b[1].setContentAreaFilled(false); 
     b[1].setFont(font); 
     b[1].setBorder(BorderFactory.createMatteBorder(0, 0, 2, 2, Color.BLACK)); 
     b[2] = new JButton(""); 
     b[2].addActionListener(lfb); 
     b[2].setContentAreaFilled(false); 
     b[2].setFont(font); 
     b[2].setBorder(BorderFactory.createMatteBorder(0, 0, 2, 0, Color.BLACK)); 
     b[3] = new JButton(""); 
     b[3].addActionListener(lfb); 
     b[3].setContentAreaFilled(false); 
     b[3].setFont(font); 
     b[3].setBorder(BorderFactory.createMatteBorder(0, 2, 2, 0, Color.BLACK)); 
     b[4] = new JButton(""); 
     b[4].addActionListener(lfb); 
     b[4].setContentAreaFilled(false); 
     b[4].setFont(font); 
     b[4].setBorder(BorderFactory.createMatteBorder(0, 0, 0, 2, Color.BLACK)); 
     b[5] = new JButton(""); 
     b[5].addActionListener(lfb); 
     b[5].setContentAreaFilled(false); 
     b[5].setFont(font); 
     b[5].setBorder(BorderFactory.createMatteBorder(0, 0, 0, 0, Color.BLACK)); 
     b[6] = new JButton(""); 
     b[6].addActionListener(lfb); 
     b[6].setContentAreaFilled(false); 
     b[6].setFont(font); 
     b[6].setBorder(BorderFactory.createMatteBorder(0, 2, 0, 0, Color.BLACK)); 
     b[7] = new JButton(""); 
     b[7].addActionListener(lfb); 
     b[7].setContentAreaFilled(false); 
     b[7].setFont(font); 
     b[7].setBorder(BorderFactory.createMatteBorder(2, 0, 0, 2, Color.BLACK)); 
     b[8] = new JButton(""); 
     b[8].addActionListener(lfb); 
     b[8].setContentAreaFilled(false); 
     b[8].setFont(font); 
     b[8].setBorder(BorderFactory.createMatteBorder(2, 0, 0, 0, Color.BLACK)); 
     b[9] = new JButton(""); 
     b[9].addActionListener(lfb); 
     b[9].setContentAreaFilled(false); 
     b[9].setFont(font); 
     b[9].setBorder(BorderFactory.createMatteBorder(2, 2, 0, 0, Color.BLACK)); 

     gameBoard.add(b[1]); 
     gameBoard.add(b[2]); 
     gameBoard.add(b[3]); 
     gameBoard.add(b[4]); 
     gameBoard.add(b[5]); 
     gameBoard.add(b[6]); 
     gameBoard.add(b[7]); 
     gameBoard.add(b[8]); 
     gameBoard.add(b[9]); 

     j.add(gameBoard); 
     j.setVisible(true); 
    } 

    public class ListenForButtons implements ActionListener { 

     public void actionPerformed(ActionEvent e) { 

      if (e.getSource() == b[1]) { 
       setSquare(b[1]); 
      } 
      if (e.getSource() == b[2]) { 
       setSquare(b[2]); 
      } 
      if (e.getSource() == b[3]) { 
       setSquare(b[3]); 
      } 
      if (e.getSource() == b[4]) { 
       setSquare(b[4]); 
      } 
      if (e.getSource() == b[5]) { 
       setSquare(b[5]); 
      } 
      if (e.getSource() == b[6]) { 
       setSquare(b[6]); 
      } 
      if (e.getSource() == b[7]) { 
       setSquare(b[7]); 
      } 
      if (e.getSource() == b[8]) { 
       setSquare(b[8]); 
      } 
      if (e.getSource() == b[9]) { 
       setSquare(b[9]); 
      } 
      checkForWin(); 
     } 
    } 

    public void setSquare(JButton button) { 
     if (player) { 
      button.setText("X"); 
      player = false; 
      button.removeActionListener(lfb); 
     } else { 
      button.setText("O"); 
      player = true; 
      button.removeActionListener(lfb); 
     } 
    } 

    public void checkForWin() { 
     if ((b[1].getText().equals("X") && b[2].getText().equals("X") && b[3].getText().equals("X")) 
       || (b[4].getText().equals("X") && b[5].getText().equals("X") && b[6].getText().equals("X")) 
       || (b[7].getText().equals("X") && b[8].getText().equals("X") && b[9].getText().equals("X")) 
       || (b[1].getText().equals("X") && b[4].getText().equals("X") && b[7].getText().equals("X")) 
       || (b[2].getText().equals("X") && b[5].getText().equals("X") && b[8].getText().equals("X")) 
       || (b[3].getText().equals("X") && b[6].getText().equals("X") && b[9].getText().equals("X")) 
       || (b[1].getText().equals("X") && b[5].getText().equals("X") && b[9].getText().equals("X")) 
       || (b[3].getText().equals("X") && b[5].getText().equals("X") && b[7].getText().equals("X"))) { 
      JOptionPane.showMessageDialog(null, "X WINS THE GAME!", "", JOptionPane.INFORMATION_MESSAGE); 
      resetBoard(); 
     } else if ((b[1].getText().equals("O") && b[2].getText().equals("O") && b[3].getText().equals("O")) 
       || (b[4].getText().equals("O") && b[5].getText().equals("O") && b[6].getText().equals("O")) 
       || (b[7].getText().equals("O") && b[8].getText().equals("O") && b[9].getText().equals("O")) 
       || (b[1].getText().equals("O") && b[4].getText().equals("O") && b[7].getText().equals("O")) 
       || (b[2].getText().equals("O") && b[5].getText().equals("O") && b[8].getText().equals("O")) 
       || (b[3].getText().equals("O") && b[6].getText().equals("O") && b[9].getText().equals("O")) 
       || (b[1].getText().equals("O") && b[5].getText().equals("O") && b[9].getText().equals("O")) 
       || (b[3].getText().equals("O") && b[5].getText().equals("O") && b[7].getText().equals("O"))) { 

      JOptionPane.showMessageDialog(null, "O WINS THE GAME!", "", JOptionPane.INFORMATION_MESSAGE); 
      resetBoard(); 
     } else if (!b[1].getText().equals("") && !b[2].getText().equals("") && !b[3].getText().equals("") 
       && !b[4].getText().equals("") && !b[5].getText().equals("") && !b[6].getText().equals("") 
       && !b[7].getText().equals("") && !b[8].getText().equals("") && !b[9].getText().equals("")) { 
      JOptionPane.showMessageDialog(null, "Cats Game!", "", JOptionPane.INFORMATION_MESSAGE); 
      resetBoard(); 
     } 
    } 

    public void resetBoard() { 
     for (int i = 1; i <= b.length - 1; i++) { 
      b[i].setText(""); 
     } 
     for (int i = 1; i <= b.length - 1; i++) { 
      b[i].addActionListener(lfb); 
     } 
     player = true; 
    } 
} 
+0

此外,有時當resetBoard被調用時,該板的廣場之一沒有按」重置。 – Discoveringmypath 2013-04-09 22:29:37

+3

請[編輯]你的問題,並將其減少到你有問題的**相關**代碼。期待我們瀏覽你的所有代碼,試圖猜測你所問的部分有點不合理。另外,請不要在評論中提出單獨的問題。如果您有添加到問題的信息,請編輯您的問題並將其添加到那裏。謝謝。 :-) – 2013-04-09 22:35:58

+0

給出「System.out.println(player +」「);」到你的setSquare,也許按鈕點擊兩次,所以檢查這個 - 或者它確實分配給你的多個隨機添加的actionlistener,如底部提到的bmorris591 ... – 2013-04-09 22:49:14

回答

2

ResetBoard()被調用,並按下不是每一個按鈕,那麼你最終不得不分配給這些未使用的按鈕多個ActionListeners

這裏是一個例子resetBoard()方法:

public void resetBoard() { 
     // Fixed the loop index. Was: (int i = 1; i <= b.length - 1; i++) 
     for (int i = 0; i < b.length; i++) { 
      b[i].setText(""); 
      // Adding a listener only if there isn't one already 
      if (b[i].getActionListeners().length < 1) 
       b[i].addActionListener(lfb); 
     } 
     player = true; 
    } 

作爲@MadProgrammer建議我還重構了setSquare()方法:

public void setSquare(JButton button) { 
     if (player) { 
      button.setText("X"); 
     } else { 
      button.setText("O"); 
     } 
     button.removeActionListener(lfb); 
     player = !player; 
    } 
+3

或者只是不要隨意重新添加'ActionListeners'? – 2013-04-09 22:47:05

+0

@ bmorris591好點:) – drzymala 2013-04-09 22:48:34

+0

我還會在'setSquare'方法中添加,''player'必須明確地設置爲'true'或'false'是不必要的,只需使用'player =!player'該方法的結尾將1-減少代碼混亂和2實現絕對結果,但您的答案將更好地解決問題 – MadProgrammer 2013-04-09 23:39:08