2012-04-19 62 views
2

嘗試用「再次播放」JButton重置按鈕。使用Swing按鈕重置應用程序

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.Toolkit; 
import java.awt.Image; 

public class HW4_TicTacToePanel extends JFrame implements ActionListener { 

// declare variables and arrays 
    private int counter = 0; 
    private String letter; 
    private boolean win = false; 
    private int[][] winConditions = new int[][]{ 
     {0, 1, 2}, {3, 4, 5}, {6, 7, 8}, //Horizontal wins 
     {0, 3, 6}, {1, 4, 7}, {2, 5, 8}, //Vertical wins 
     {0, 4, 8}, {2, 4, 6} //Diagonal wins 
    }; 
    // JFrame Instructions 
    // private JButton buttons[] = new JButton[12]; 
    // private JFrame gamewindow = new JFrame("Tic Tac Toe"); 
    // End JFrame 
    // Panel demo 
    private JPanel southPanel; //panel for replay and exit button 
    private JButton[] optButtons;//Exit and replay buttons 
    private JPanel centerPanel; 
    private JButton[] gameButtons;//Tic tac toe squares 
    private GridLayout myGridLayout; 

    // End panel demo 
    public HW4_TicTacToePanel() //Constructor 
    { 
     super("Tic Tac Toe"); //super calls the JFrame controller 
     southPanel = new JPanel();// instantiate panel 
     optButtons = new JButton[2];//create an array of 2 buttons 
     String[] buttonNames = {"Play Again", "Exit"}; 

     centerPanel = new JPanel(); //instantiate panel 
     gameButtons = new JButton[9];//creates an array of 9 buttons 
     myGridLayout = new GridLayout(3, 3, 2, 2); 

     setLayout(new BorderLayout());//set layout for JPanel 
     centerPanel.setLayout(myGridLayout);//set Layout for center panel 

     // add buttons to the centerPanel and add the ActionListener 
     for (int i = 0; i < gameButtons.length; i++) { 
      gameButtons[i] = new JButton(); 
      centerPanel.add(gameButtons[i]); 
      gameButtons[i].addActionListener(this); 
     } 

     add(centerPanel, BorderLayout.CENTER); //add panel to JFrame 

     // add buttons to the southPanel and add the ActionListener 
     for (int i = 0; i < optButtons.length; i++) { 
      optButtons[i] = new JButton(buttonNames[i]); 
      southPanel.add(optButtons[i]); 
     } 

     //add functionality to replay and exit buttons 
     optButtons[0].addActionListener(this); 
     optButtons[1].addActionListener(this); 

     add(southPanel, BorderLayout.SOUTH); //adds panel to JFrame 
    } 

    public void actionPerformed(ActionEvent a) { 
     // Add Image icons 
     counter++; 

     //Calculate whose turn it is by using modulus to determine even or odd 
    if (counter % 2 == 0) { 
     letter = "O"; 
     Icon o = new ImageIcon(getClass().getResource("O.gif")); 
     //Capture and show player input then disable button so it may not be reselected 
     JButton pressedButton = (JButton) a.getSource(); 
     pressedButton.setIcon(o); 
     pressedButton.setText(letter); 
     pressedButton.setEnabled(false); 
    } else if (a.getSource() == optButtons[0]) 
    { 
     // 
     //play again Instructions 
     // 
     System.exit(0); 
    } else if (a.getSource() == optButtons[1]) 
    { 
     System.exit(0); 
    } else { 
     letter = "X"; 
     Icon x = new ImageIcon(getClass().getResource("X.gif")); 
     //Capture and show player input then disable button so it may not be reselected 
     JButton pressedButton = (JButton) a.getSource(); 
     pressedButton.setIcon(x); 
     pressedButton.setText(letter); 
     pressedButton.setEnabled(false); 
    } 

//determine who won 
     for (int i = 0; i <= 7; i++) { 
      if (gameButtons[winConditions[i][0]].getText().equals(gameButtons[winConditions[i][1]].getText()) 
        & gameButtons[winConditions[i][1]].getText().equals(gameButtons[winConditions[i][2]].getText()) 
        & gameButtons[winConditions[i][0]].getText() != "") { 
       win = true; 
      } 
     } 

//Show victor dialog 
     if (win == true) { 
      JOptionPane.showMessageDialog(null, letter + " wins the game!"); 
      //Remove once optButtons are operational... 
      System.exit(0); 
     } else if (counter == 9 && win == false) { 
      JOptionPane.showMessageDialog(null, "The game was a tie!"); 
      //Remove once optButtons are operational... 
      System.exit(0); 
     } 
    } 

    public static void main(String[] args) { 
     HW4_TicTacToePanel starter = new HW4_TicTacToePanel(); 
    } 
} 

對於Play Again按鈕,我想重置計數器並取消存儲在遊戲按鈕中的任何值。我會在播放器作爲其他if語句移動的同一個循環中執行此操作。

我一直在這個工作一段時間無濟於事,有什麼建議嗎? 謝謝

+0

想通了,爲了重置遊戲板,我必須移動else語句的位置,而不是最後一次是第一次。 如果(a.getSource()== optButtons [0]){ \t \t \t對(INT I = 0;我 Daishi100 2012-04-19 20:56:48

+0

你在哪裏再玩一次按鈕? – 2012-04-27 11:30:20

回答

1

有了那麼多的退出按鈕,你只能退出。下面是一些代碼的改進:

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.Toolkit; 
import java.awt.Image; 

public class HW4_TicTacToePanel extends JFrame implements ActionListener { 
    private int counter = 0; 
    private int [] [] winConditions = new int [] [] { 
     {0, 1, 2}, {3, 4, 5}, {6, 7, 8}, // Horizontal wins 
     {0, 3, 6}, {1, 4, 7}, {2, 5, 8}, // Vertical wins 
     {0, 4, 8}, {2, 4, 6} // Diagonal wins 
    }; 
    private JButton [] gameButtons; 

    public HW4_TicTacToePanel() 
    { 
     super ("Tic Tac Toe"); 
     JPanel southPanel = new JPanel(); 
     JButton [] optButtons = new JButton [2]; 
     String [] buttonNames = {"Play Again", "Exit"}; 
     JPanel centerPanel = new JPanel(); 
     gameButtons = new JButton [9]; 
     GridLayout myGridLayout = new GridLayout (3, 3, 2, 2); 
     setLayout (new BorderLayout()); 
     centerPanel.setLayout (myGridLayout); 
     for (int i = 0; i < gameButtons.length; i++) { 
      gameButtons [i] = new JButton(); 
      centerPanel.add (gameButtons [i]); 
      gameButtons [i].addActionListener (this); 
     } 

     add (centerPanel, BorderLayout.CENTER); 
     for (int i = 0; i < optButtons.length; i++) { 
      optButtons [i] = new JButton (buttonNames [i]); 
      southPanel.add (optButtons [i]); 
      optButtons [i].addActionListener (this);    
     } 
     add (southPanel, BorderLayout.SOUTH); 
     setSize (300, 300); 
     setLocation (200, 200); 
     setVisible (true); 
    } 

    private static Icon [] icon = new ImageIcon [] { 
     new ImageIcon ("/home/stefan/some/images/mini.null.jpg"), 
     new ImageIcon ("/home/stefan/daten/some/images/x.gif")}; 
    private static String [] letter = new String [] {"x", "o"}; 

    public void actionPerformed (ActionEvent a) { 
     // Add Image icons 
     counter++; 
     boolean win = false; 
     String cmd = a.getActionCommand(); 
     if (cmd.equals ("Play Again")) 
     { 
      dispose(); 
      HW4_TicTacToePanel.main (null); 
     } 
     else if (cmd.equals ("Exit")) 
     { 
      dispose(); 
     } else { 
      // Calculate whose turn it is by using modulus to determine even or odd 
      JButton pressedButton = (JButton) a.getSource(); 
      pressedButton.setIcon (icon [counter%2]); 
      pressedButton.setText (letter[counter%2]); 
      pressedButton.setEnabled (false); 
     } 
     //determine who won 
     for (int i = 0; i <= 7; i++) { 
      if (gameButtons [winConditions [i] [0]].getText().equals (gameButtons [winConditions [i] [1]].getText()) 
      & gameButtons [winConditions [i] [1]].getText().equals (gameButtons [winConditions [i] [2]].getText()) 
      & gameButtons [winConditions [i] [0]].getText() != "") { 
       win = true; 
      } 
     } 
     //Show victor dialog 
     if (win == true) { 
      JOptionPane.showMessageDialog (null, letter[counter%2] + " wins the game!"); 
     } else if (counter == 9 && win == false) { 
      JOptionPane.showMessageDialog (null, "The game was a tie!"); 
     } 
    } 

    public static void main (String [] args) { 
     new HW4_TicTacToePanel(); 
    } 
} 

一些提示:

  • 在你寫的代碼有什麼意見,不要重複。
  • 不要評論事情,每個Java程序員都應該知道(構造函數的外觀如何,屬性實例是什麼)
  • 只有在必須使用屬性的情況下,JPanels通常只用於ctor--它們不會需要在其他地方訪問
  • 如果不引用變量(在主起動機) - 不使用參考
  • 你爲什麼不把addActionListener方法進入循環
  • (a.getSource() == optButtons[0])?什麼是optButtons [0]?如果您使用a.getActionCommand().equals ("Play Again")代替文檔,則代碼文檔自身。
  • 使用數組是個好主意。再走一步!
  • setSize/...位置/ ...可見 - 如果沒有它,您將如何工作?
  • 享受。 :)