2012-10-31 37 views
4

這個tictactoe程序是一款2人遊戲。在我開始編碼之後,我製作的GUI是框架和按鈕。實際上我的程序正在使用這種編碼。我的tictactoe遊戲中的每個按鈕都有相同的代碼。如何做到這一點?

private String letter= " "; 
private int count= 0; 


    private void btn7ActionPerformed(java.awt.event.ActionEvent evt) {          
     count++; 
       if(count == 1 || count == 3 || count == 5 || count == 7 || count == 9){ 

       letter = "X"; 

       } else if(count == 2 || count == 4 || count == 6 || count == 8 || count == 10){ 

       letter = "O"; 

       } 

     if(evt.getSource() == btn1){ 

         btn1.setText(letter); 

       } else if(evt.getSource() == btn2){ 

         btn2.setText(letter); 

       } else if(evt.getSource() == btn3){ 

         btn3.setText(letter); 

       } else if(evt.getSource() == btn4){ 

         btn4.setText(letter); 

       } else if(evt.getSource() == btn5){ 

         btn5.setText(letter); 

       } else if(evt.getSource() == btn6){ 

         btn6.setText(letter); 

       } else if(evt.getSource() == btn7){ 

         btn7.setText(letter); 

       } else if(evt.getSource() == btn8){ 

         btn8.setText(letter); 

       } else if(evt.getSource() == btn9){ 

         btn9.setText(letter); 




    }   
    }          

    private void btn1ActionPerformed(java.awt.event.ActionEvent evt) {          
    count++; 
       if(count == 1 || count == 3 || count == 5 || count == 7 || count == 9){ 

       letter = "X"; 

       } else if(count == 2 || count == 4 || count == 6 || count == 8 || count == 10){ 

       letter = "O"; 

       } 

     if(evt.getSource() == btn1){ 

         btn1.setText(letter); 

       } else if(evt.getSource() == btn2){ 

         btn2.setText(letter); 

       } else if(evt.getSource() == btn3){ 

         btn3.setText(letter); 

       } else if(evt.getSource() == btn4){ 

         btn4.setText(letter); 

       } else if(evt.getSource() == btn5){ 

         btn5.setText(letter); 

       } else if(evt.getSource() == btn6){ 

         btn6.setText(letter); 

       } else if(evt.getSource() == btn7){ 

         btn7.setText(letter); 

       } else if(evt.getSource() == btn8){ 

         btn8.setText(letter); 

       } else if(evt.getSource() == btn9){ 

         btn9.setText(letter); 

是的,它實際上是工作,但我的代碼問題是我需要把代碼放在每個按鈕,例如, button7,button1(這些只是我的按鈕的示例),代碼是按鈕執行的操作。

我只想要一個單一的命令,每個按鈕的執行,我不想複製粘貼在每個按鈕,因爲它們是相同的代碼。我認爲有一個代碼可以做到這一點,你怎麼看?請幫忙!

+1

創建單一'ActionListener'然後註冊相同的所有按鈕。然後使用'event.getSource()'確定按鈕,並相應地完成其餘的工作。 – Ved

+0

嗨!在我生成的代碼中,我發現這行btn1.addActionListener(new java.awt.event.ActionListener(){public void actionPerformed(java.awt.event.ActionEvent evt){{{{0}} {你認爲什麼是錯的? – Jayseer

回答

2

所以基本上,你想把你的邏輯摺疊成一個處理程序。這種處理器需要一個單一的參照按鈕,它是作用於...

喜歡的東西...

public class ActionHandler implements ActionListener { 

    private JButton master; 

    public ActionHandler(JButton master) { 
     this.master = master; 
    } 

    protected void setText(String text) { 
     master.setText(text); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     String text = null; 

     count++; 
     if (count/2f == Math.round(count/2f)) { 
      text = "O"; 
     } else { 
      text = "X"; 
     } 

     setText(text); 

    } 

} 

現在你設置的代碼可能會不同,則,這僅僅是一個例子.. 。

buttons = new JButton[9]; // You can use this to reset the board ;) 
setLayout(new GridLayout(3, 3)); 
for (int index = 0; index < 9; index++) { 
    JButton btn = new JButton(Integer.toString(index)); 
    buttons[index] = btn; 
    btn.addActionListener(new ActionHandler(btn)); 
    add(btn); 
} 

的基本思想是,當你創建一個新的按鈕,您分配它自己的ActionHandler傳遞按鈕的參考。這允許動作處理器根據遊戲的狀態來控制按鈕。

3

我真的不知道你是怎麼想解決這個遊戲的邏輯,雖然你的代碼可以被壓縮到這種形式:

int count = -1; 
String letter = ""; 
JButton[] button = new JButton[9]; // These three being your Instance Variables 
for (int i = 0; i < 9; i++, counter++) 
{ 
    final int counter = i; 
    button[i] = new JButton(""); 
    button[i].addActionListener(new ActionListener() 
    { 
     @Override 
     public void actionPerformed(ActionEvent ae) 
     { 
      count++; 
      if (count % 2 != 0) 
       letter = "X"; 
      else 
       letter = "O"; 
      button[counter].setText(letter); 
     } 
    }); 
} 
+0

是的,你說得對,那就是我現在正在做的事:D – Jayseer

相關問題