有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Tic Tac Toe与GUI

好的,我想用GUI创建一个Tic-Tac-Toe(X-O)游戏,我已经画了它,但不知怎么的,我无法运行它。我知道怎么用。addActionListener,我可以将某个按钮设置为“X”或“O”,但如何使第一个按钮单击时将其设置为X,第二个按钮单击时将其设置为O,依此类推。addActionListener无法正常工作,因为我必须在某个按钮上使用它,但我不知道将按下哪个按钮

这是我写的代码

public class XO {
public static void main(String[] args) {
    JFrame myForm=new JFrame("X-O");
    myForm.setSize(255, 300);
    myForm.setLocation(0, 0);

    JButton []buttons=new JButton[10];
    int x=40, y=0;
    for(int i=0;i<10;i++)
    {
        if(i%3==0)
        {
            y+=50; x=40;
        }
        buttons[i]=new JButton((i+1)+"");
        buttons[i].setSize(50, 50);
        buttons[i].setLocation(x, y);
        myForm.add(buttons[i]);
        x+=50;
    }
    buttons[9].setText("Start Over");
    buttons[9].setLocation(80, 205);
    buttons[9].setSize(70, 50);
    buttons[9].setMargin(new Insets(0, 0, 0, 0));

    buttons[0].addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {

        buttons[0].setText("X");
        buttons[0].setForeground(Color.BLUE);
        buttons[0].setFont(new Font("Arial", Font.PLAIN, 30));
        buttons[0].setMargin(new Insets(0, 0, 0, 0));
        buttons[0].setEnabled(false);
        }
    });

    myForm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    myForm.setLayout(null);
    myForm.setVisible(true);
}

}

如你所见,我将不得不使用。在特定的按钮上设置ActionListener,但我不知道将按下哪个按钮。我希望你明白我的意思。 提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    在main方法之外,您可以声明一个静态计数器来确定它是谁的移动:

    private static int turnCount = 0;
    

    为循环中的每个按钮添加操作侦听器,并根据计数器确定设置按钮文本的内容。确保在操作侦听器中增加turnCount变量:

    for(int i=0;i<10;i++)
    {
        if(i%3==0)
        {
            y+=50; x=40;
        }
        buttons[i]=new JButton((i+1)+"");
        buttons[i].setSize(50, 50);
        buttons[i].setLocation(x, y);
    
        int butNum = i;
        buttons[i].addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String currentPlayer = turnCount % 2 == 0 ? "X" : "O";
                buttons[butNum].setText(currentPlayer);
                buttons[butNum].setForeground(Color.BLUE);
                buttons[butNum].setFont(new Font("Arial", Font.PLAIN, 30));
                buttons[butNum].setMargin(new Insets(0, 0, 0, 0));
                buttons[butNum].setEnabled(false);
                turnCount++;
            }
        });
    
        myForm.add(buttons[i]);
        x+=50;
    }
    
  2. # 2 楼答案

    您可以通过getSource方法从ActionEvent获取按下的按钮,只需将其转换为JButton即可

        for (JButton button : buttons) { // one listener per button
            button.addActionListener(new ActionListener() {    
                @Override
                public void actionPerformed(ActionEvent e) {
                    JButton button = (JButton)e.getSource(); // which button
                    button.setText(getPlayer()); // get X or O
                    button.setForeground(Color.BLUE);
                    button.setFont(new Font("Arial", Font.PLAIN, 30));
                    button.setMargin(new Insets(0, 0, 0, 0));
                    button.setEnabled(false);
                    togglePlayer(); // toggle between X and O
                }
            });
        }
    

    我将代码主体移动到了run方法,并添加了获取播放器和切换播放器的方法

    public static void main(String[] args) {
        XO game = new XO();
        game.run();
    }
    
    private String player = "X";
    
    private String getPlayer() {
        return player;
    }
    
    private void togglePlayer() {
        player = "X".equals(player) ? "O" : "X";
    }
    
    public void run() {
        JFrame myForm = new JFrame("X-O");
        // rest of your code
        // plus my actionListener changes
        // ...
    }