【问题标题】:I have an identical codes in every buttons in my tictactoe game. How to make this short?我的tictactoe 游戏中的每个按钮都有相同的代码。如何使这个简短?
【发布时间】:2012-10-31 05:49:01
【问题描述】:

这个tictactoe 程序是一个2 人游戏。在我开始编码之后,我制作的 GUI 是框架和按钮。实际上,我的程序正在使用这种编码。

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(这些只是我的按钮的例子)这是代码是按钮执行的操作。

我只希望每个按钮执行一个命令,并且我不想在每个按钮中复制粘贴,因为它们是相同的代码。我认为有一个代码可以做到这一点,你怎么看?请帮忙!

【问题讨论】:

  • 创建单个ActionListener,然后将其注册到所有按钮。然后使用event.getSource() 识别按钮并相应地做其余的事情。
  • 嗨!在我生成的代码中,我发现这一行 btn1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btn1ActionPerformed(evt); 我认为 java 已经自动生成了代码. 你觉得哪里不对?

标签: java swing debugging jbutton tic-tac-toe


【解决方案1】:

我真的不知道你是如何解决这个游戏逻辑的,虽然你的代码可以压缩成这种形式:

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); 
        }
    });
}

【讨论】:

  • 是的,你是对的,这就是我现在正在做的事情! :D
【解决方案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,并将按钮的引用传递给它。这允许动作处理程序根据游戏状态控制按钮。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多