【问题标题】:Making a TicTacToe game; how can I get the tictactoe buttons to alternate between X and O?制作井字游戏;我怎样才能让tictactoe按钮在X和O之间交替?
【发布时间】:2012-07-16 23:15:09
【问题描述】:

我只需要让它在“X”和“O”之间交替进行转弯,但它只会给我 X。

import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.*;
public class tictactoe {
    public static final int FRAME_WIDTH = 700;
    public static final int FRAME_HEIGHT = 200;
    public static void main(String[] args)          
    {
        int slots = 9;

        final JButton[] gameButton = new JButton[9];

        JPanel ticTacToeBoard = new JPanel();
        ticTacToeBoard.setLayout(new GridLayout(3, 3));
        JButton clearButtons = new JButton("New Game");
        for (int i = 0; i < slots; i++)
        {
            gameButton[i] = new JButton();
            ticTacToeBoard.add(gameButton[i]);
            final int countTurns = i;

            gameButton[i].addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    Object clicked = e.getSource();
                    int turns = 1;
                    for (int p = 0; p < 9; p++)
                    {
                        if(clicked == gameButton[countTurns] && turns < 10)
                        {
                            if (!(turns % 2 == 0))
                            {
                                ((JButton)e.getSource()).setText("X");
                                turns++;
                            }
                            else
                            {
                                ((JButton)e.getSource()).setText("O");
                                turns++;
                            }
                        }
                    }
                }
            });

            final int integerHack = i; 

            clearButtons.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    gameButton[integerHack].setText("");
                }
            });
        }
        JButton exit = new JButton("Exit");
        exit.setActionCommand("EXIT");
        exit.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                String cmd = e.getActionCommand();
                if (cmd == "EXIT")
                {
                    System.exit(FRAME_WIDTH);
                }
            }
        });

        JPanel rightPanel = new JPanel();
        JLabel wonLabel = new JLabel();
        rightPanel.setLayout(new GridLayout(1, 3));
        rightPanel.add(wonLabel);
        rightPanel.add(clearButtons);
        rightPanel.add(exit);
        JFrame mainFrame = new JFrame();
        mainFrame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
        mainFrame.setVisible(true);
        mainFrame.setLayout(new GridLayout(1,2));
        mainFrame.add(ticTacToeBoard);
        mainFrame.add(rightPanel);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

【问题讨论】:

    标签: java arrays jframe jpanel jbutton


    【解决方案1】:

    查看您的actionPerformed 方法。每次点击发生时,您将 turns 设置为 1。因此,!(turns % 2 == 0) 将始终评估为真,您将始终绘制 X。

    【讨论】:

      【解决方案2】:

      只要快速查看您的代码,我猜这是因为您的 turn 变量在所有 ActionListener 对象中都是本地的。因此,turn 变量始终为 1,并且您总是遇到第一个 if 情况。因此,只要您在 actionPerformed 方法中获得回调,就会始终在堆栈上重新创建 turn 变量。如需快速修复和测试,请尝试将 turn 变量放入 tictactoe 类中,看看是否有帮助。

      【讨论】:

        【解决方案3】:

        问题在于您的 actionPerformed 中的转数变量。如果你想跟踪它,你应该把它从你的方法中移出。

        【讨论】:

          【解决方案4】:

          首先,正如其他人所说,您希望在所有循环之外初始化“转弯”。

          其次,我想指出一个错字:

                      if(clicked == gameButton[countTurns] && turns < 10)
          

          应该是

                      if(clicked == gameButton[p] && turns < 10)
          

          ...除非您真的想在每次单击按钮时将每个按钮的文本从 X 更改为 O 九次。

          但即使修正这个错字也是没有意义的。当它是哪个特定按钮无关紧要时,为什么要循环查找特定按钮?无论如何,所有按钮都有相同的操作处理程序,只有九个单独的副本,因为您每次都创建九个相同的副本。

          相反,因为所有按钮都做同样的事情,所以您应该为所有按钮设置一个操作处理程序。如果您不确定这是如何完成的,您可以在按钮制作循环之外创建它并将其分配给一个变量,然后在分配每个按钮的操作处理程序时放入该变量,例如

           gameButton[i].addActionListener(myActionListener);
          

          【讨论】:

            猜你喜欢
            • 2014-04-04
            • 1970-01-01
            • 1970-01-01
            • 2019-05-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-29
            相关资源
            最近更新 更多