检测Tic Tac Toe GUI java+退出按钮中的无效移动

检测Tic Tac Toe GUI java+退出按钮中的无效移动,java,swing,user-interface,Java,Swing,User Interface,我的代码几乎完全正常工作,只是遇到了几个小问题。首先,我希望用户在尝试选择一个已经标记有X或O的按钮时收到一个弹出窗口,告诉他们移动无效,并选择另一个按钮。其次,我试图在游戏底部添加一个退出按钮,但它总是使退出按钮成为游戏网格的一部分?解决方案可能很简单,我只是看不到,但我尝试过几次,似乎无法将其从网格中删除。谢谢你的帮助 import java.awt.*; import java.awt.event.*; import java.util.Random; import javax.swing

我的代码几乎完全正常工作,只是遇到了几个小问题。首先,我希望用户在尝试选择一个已经标记有X或O的按钮时收到一个弹出窗口,告诉他们移动无效,并选择另一个按钮。其次,我试图在游戏底部添加一个退出按钮,但它总是使退出按钮成为游戏网格的一部分?解决方案可能很简单,我只是看不到,但我尝试过几次,似乎无法将其从网格中删除。谢谢你的帮助

import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;

class TicTacToeFrame extends JFrame implements ActionListener {

private int[][] winningMoves = new int[][]{
    {1, 2, 3}, {4, 5, 6}, {7, 8, 9},
    {1, 4, 7}, {2, 5, 8}, {3, 6, 9},
    {1, 5, 9}, {3, 5, 7}
};

private JFrame frame = new JFrame("Tic Tac Toe");
private JButton buttons[] = new JButton[10];
private JButton quitButton = new JButton("Quit");
private int moveCount = 0;
private String letter = "";
private boolean win = false;
ActionListener quitListener = new quitListener();

public TicTacToeFrame() {
    JPanel bottom = new JPanel();
    bottom.setBorder(BorderFactory.createLineBorder(Color.black));
    frame.setPreferredSize(new Dimension(400, 400));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new GridLayout(3, 3));
    frame.pack();
    frame.setLocationRelativeTo(null);
    quitButton.addActionListener(quitListener);
    bottom.add(quitButton, BorderLayout.SOUTH);

    for (int i = 1; i <= 9; i++) {
        buttons[i] = new JButton();
        frame.add(buttons[i]);
        buttons[i].addActionListener(this);
    }

    frame.setVisible(true);
}

public void actionPerformed(ActionEvent a) {
    for (int i = 1; i <= 9; i++) {
        if (a.getSource() == buttons[i]) {
            buttons[i].setText("X");
            buttons[i].setEnabled(false);
        }
    }

    moveCount++;
    computer();

}

public void computer() {
    moveCount++;
    if (buttons[1].getText().equals("O") && buttons[2].getText().equals("O") && buttons[3].getText().equals("")) {
        buttons[3].setText("O");
        buttons[3].setEnabled(false);
    } else if (buttons[4].getText().equals("O") && buttons[5].getText().equals("O") && buttons[6].getText().equals("")) {
        buttons[6].setText("O");
        buttons[6].setEnabled(false);
    } else if (buttons[7].getText().equals("O") && buttons[8].getText().equals("O") && buttons[9].getText().equals("")) {
        buttons[9].setText("O");
        buttons[9].setEnabled(false);
    } else if (buttons[2].getText().equals("O") && buttons[3].getText().equals("O") && buttons[1].getText().equals("")) {
        buttons[1].setText("O");
        buttons[1].setEnabled(false);
    } else if (buttons[5].getText().equals("O") && buttons[6].getText().equals("O") && buttons[4].getText().equals("")) {
        buttons[4].setText("O");
        buttons[4].setEnabled(false);
    } else if (buttons[8].getText().equals("O") && buttons[9].getText().equals("O") && buttons[7].getText().equals("")) {
        buttons[7].setText("O");
        buttons[7].setEnabled(false);
    } else if (buttons[1].getText().equals("O") && buttons[3].getText().equals("O") && buttons[2].getText().equals("")) {
        buttons[2].setText("O");
        buttons[2].setEnabled(false);
    } else if (buttons[4].getText().equals("O") && buttons[6].getText().equals("O") && buttons[5].getText().equals("")) {
        buttons[5].setText("O");
        buttons[5].setEnabled(false);
    } else if (buttons[7].getText().equals("O") && buttons[9].getText().equals("O") && buttons[8].getText().equals("")) {
        buttons[8].setText("O");
        buttons[8].setEnabled(false);
    } else if (buttons[1].getText().equals("O") && buttons[4].getText().equals("O") && buttons[7].getText().equals("")) {
        buttons[7].setText("O");
        buttons[7].setEnabled(false);
    } else if (buttons[2].getText().equals("O") && buttons[5].getText().equals("O") && buttons[8].getText().equals("")) {
        buttons[4].setText("O");
        buttons[4].setEnabled(false);
    } else if (buttons[3].getText().equals("O") && buttons[6].getText().equals("O") && buttons[9].getText().equals("")) {
        buttons[9].setText("O");
        buttons[9].setEnabled(false);
    } else if (buttons[4].getText().equals("O") && buttons[7].getText().equals("O") && buttons[1].getText().equals("")) {
        buttons[1].setText("O");
        buttons[1].setEnabled(false);
    } else if (buttons[5].getText().equals("O") && buttons[8].getText().equals("O") && buttons[2].getText().equals("")) {
        buttons[2].setText("O");
        buttons[2].setEnabled(false);
    } else if (buttons[6].getText().equals("O") && buttons[9].getText().equals("O") && buttons[3].getText().equals("")) {
        buttons[3].setText("O");
        buttons[3].setEnabled(false);
    } else if (buttons[1].getText().equals("O") && buttons[7].getText().equals("O") && buttons[4].getText().equals("")) {
        buttons[4].setText("O");
        buttons[4].setEnabled(false);
    } else if (buttons[2].getText().equals("O") && buttons[8].getText().equals("O") && buttons[5].getText().equals("")) {
        buttons[5].setText("O");
        buttons[5].setEnabled(false);
    } else if (buttons[3].getText().equals("O") && buttons[9].getText().equals("O") && buttons[6].getText().equals("")) {
        buttons[6].setText("O");
        buttons[6].setEnabled(false);
    } else if (buttons[1].getText().equals("O") && buttons[5].getText().equals("O") && buttons[9].getText().equals("")) {
        buttons[9].setText("O");
        buttons[9].setEnabled(false);
    } else if (buttons[5].getText().equals("O") && buttons[9].getText().equals("O") && buttons[1].getText().equals("")) {
        buttons[1].setText("O");
        buttons[1].setEnabled(false);
    } else if (buttons[1].getText().equals("O") && buttons[9].getText().equals("O") && buttons[5].getText().equals("")) {
        buttons[5].setText("O");
        buttons[5].setEnabled(false);
    } else if (buttons[3].getText().equals("O") && buttons[5].getText().equals("O") && buttons[7].getText().equals("")) {
        buttons[7].setText("O");
        buttons[7].setEnabled(false);
    } else if (buttons[7].getText().equals("O") && buttons[5].getText().equals("O") && buttons[3].getText().equals("")) {
        buttons[3].setText("O");
        buttons[3].setEnabled(false);
    } else if (buttons[7].getText().equals("O") && buttons[3].getText().equals("O") && buttons[5].getText().equals("")) {
        buttons[5].setText("O");
        buttons[5].setEnabled(false);
    } else if (buttons[1].getText().equals("X") && buttons[2].getText().equals("X") && buttons[3].getText().equals("")) {
        buttons[3].setText("O");
        buttons[3].setEnabled(false);
    } else if (buttons[4].getText().equals("X") && buttons[5].getText().equals("X") && buttons[6].getText().equals("")) {
        buttons[6].setText("O");
        buttons[6].setEnabled(false);
    } else if (buttons[7].getText().equals("X") && buttons[8].getText().equals("X") && buttons[9].getText().equals("")) {
        buttons[9].setText("O");
        buttons[9].setEnabled(false);
    } else if (buttons[2].getText().equals("X") && buttons[3].getText().equals("X") && buttons[1].getText().equals("")) {
        buttons[1].setText("O");
        buttons[1].setEnabled(false);
    } else if (buttons[5].getText().equals("X") && buttons[6].getText().equals("X") && buttons[4].getText().equals("")) {
        buttons[4].setText("O");
        buttons[4].setEnabled(false);
    } else if (buttons[8].getText().equals("X") && buttons[9].getText().equals("X") && buttons[7].getText().equals("")) {
        buttons[7].setText("O");
        buttons[7].setEnabled(false);
    } else if (buttons[1].getText().equals("X") && buttons[3].getText().equals("X") && buttons[2].getText().equals("")) {
        buttons[2].setText("O");
        buttons[2].setEnabled(false);
    } else if (buttons[4].getText().equals("X") && buttons[6].getText().equals("X") && buttons[5].getText().equals("")) {
        buttons[5].setText("O");
        buttons[5].setEnabled(false);
    } else if (buttons[7].getText().equals("X") && buttons[9].getText().equals("X") && buttons[8].getText().equals("")) {
        buttons[8].setText("O");
        buttons[8].setEnabled(false);
    } else if (buttons[1].getText().equals("X") && buttons[4].getText().equals("X") && buttons[7].getText().equals("")) {
        buttons[7].setText("O");
        buttons[7].setEnabled(false);
    } else if (buttons[2].getText().equals("X") && buttons[5].getText().equals("X") && buttons[8].getText().equals("")) {
        buttons[8].setText("O");
        buttons[8].setEnabled(false);
    } else if (buttons[3].getText().equals("X") && buttons[6].getText().equals("X") && buttons[9].getText().equals("")) {
        buttons[9].setText("O");
        buttons[9].setEnabled(false);
    } else if (buttons[4].getText().equals("X") && buttons[7].getText().equals("X") && buttons[1].getText().equals("")) {
        buttons[1].setText("O");
        buttons[1].setEnabled(false);
    } else if (buttons[5].getText().equals("X") && buttons[8].getText().equals("X") && buttons[2].getText().equals("")) {
        buttons[2].setText("O");
        buttons[2].setEnabled(false);
    } else if (buttons[6].getText().equals("X") && buttons[9].getText().equals("X") && buttons[3].getText().equals("")) {
        buttons[3].setText("O");
        buttons[3].setEnabled(false);
    } else if (buttons[1].getText().equals("X") && buttons[7].getText().equals("X") && buttons[4].getText().equals("")) {
        buttons[4].setText("O");
        buttons[4].setEnabled(false);
    } else if (buttons[2].getText().equals("X") && buttons[8].getText().equals("X") && buttons[5].getText().equals("")) {
        buttons[5].setText("O");
        buttons[5].setEnabled(false);
    } else if (buttons[3].getText().equals("X") && buttons[9].getText().equals("X") && buttons[6].getText().equals("")) {
        buttons[6].setText("O");
        buttons[6].setEnabled(false);
    } else if (buttons[1].getText().equals("X") && buttons[5].getText().equals("X") && buttons[9].getText().equals("")) {
        buttons[9].setText("O");
        buttons[9].setEnabled(false);
    } else if (buttons[5].getText().equals("X") && buttons[9].getText().equals("X") && buttons[1].getText().equals("")) {
        buttons[1].setText("O");
        buttons[1].setEnabled(false);
    } else if (buttons[1].getText().equals("X") && buttons[9].getText().equals("X") && buttons[5].getText().equals("")) {
        buttons[5].setText("O");
        buttons[5].setEnabled(false);
    } else if (buttons[3].getText().equals("X") && buttons[5].getText().equals("X") && buttons[7].getText().equals("")) {
        buttons[7].setText("O");
        buttons[7].setEnabled(false);
    } else if (buttons[7].getText().equals("X") && buttons[5].getText().equals("X") && buttons[3].getText().equals("")) {
        buttons[3].setText("O");
        buttons[3].setEnabled(false);
    } else if (buttons[7].getText().equals("X") && buttons[3].getText().equals("X") && buttons[5].getText().equals("")) {
        buttons[5].setText("O");
        buttons[5].setEnabled(false);
    } else if (buttons[1].getText().equals("X") && buttons[5].getText().equals("O") && buttons[9].getText().equals("X")) {
        buttons[6].setText("O");
        buttons[6].setEnabled(false);
    } else if (buttons[3].getText().equals("X") && buttons[5].getText().equals("O") && buttons[7].getText().equals("X")) {
        buttons[4].setText("O");
        buttons[4].setEnabled(false);
    } else if (buttons[5].getText().equals("")) {
        buttons[5].setText("O");
        buttons[5].setEnabled(false);
    } else if (buttons[1].getText().equals("")) {
        buttons[1].setText("O");
        buttons[1].setEnabled(false);
    } else {
        if (moveCount >= 9) {
            checkWinner();
        } else {
            random();
        }
    }

    checkWinner();

}

public void random() {
    Random x = new Random();
    int y = 1 + x.nextInt(9);
    if (buttons[y].getText().equals("O") || buttons[y].getText().equals("X")) {
        random();
    } else {
        buttons[y].setText("O");
        buttons[y].setEnabled(false);
    }
}

class quitListener implements ActionListener
{
    public void actionPerformed(ActionEvent evt)
    {
        System.exit(0);
    } 
}

public void checkWinner() {
    for (int i = 0; i <= 7; i++) {
        if (buttons[winningMoves[i][0]].getText().equals(buttons[winningMoves[i][1]].getText())
                && buttons[winningMoves[i][1]].getText().equals(buttons[winningMoves[i][2]].getText())
                && !buttons[winningMoves[i][0]].getText().equals("")) {
            win = true;
        }
    }

    if (moveCount % 2 == 0) {
        letter = "O";
    } else {
        letter = "X";
    }

    if (win == true) {
        int select = JOptionPane.showConfirmDialog(null, letter + " wins! Would you like to play again?");
        if(select == JOptionPane.YES_OPTION) 
        {
            for (int i = 1; i <= 9; i++) 
            {
            buttons[i].setText("");
            buttons[i].setEnabled(true);
            moveCount = 0;
            win = false;
            }
        }
        else 
        {
            if(select == JOptionPane.NO_OPTION) 
            {
                System.exit(0);
            }    
        }
    }
    else if (moveCount >= 9 && win == false) 
    {
        int select = JOptionPane.showConfirmDialog(null, "It's a tie! Would you like to play again?");
        if(select == JOptionPane.YES_OPTION) 
        {
            for (int i = 1; i <= 9; i++) 
            {
            buttons[i].setText("");
            buttons[i].setEnabled(true);
            moveCount = 0;
            win = false;
            }
        }
        else 
        {
            if(select == JOptionPane.NO_OPTION) 
            {
                System.exit(0);
            }    
        }
    }
}
}
在JButton的ActionListener中,可以通过ActionEvent的getSource方法获取已按下的按钮。只需在该JButton上调用getText,如果它包含有问题的文本,则显示一个error JOptionPane。或者在循环中使用buttons[i]变量,因为它指向有问题的JButton。 如果您走这条路线,请确保exit按钮有自己单独的ActionListener。否则你可能会遇到麻烦。内部匿名类在这里可以很好地工作。 您已经将整个GUI(JFrame)的布局设置为GridLayout,无论您是否喜欢,它都会将您放入一个网格中。不要这样做。让JFrame的contentPane使用默认的BorderLayout,为tic tac toe网格创建一个新的JPanel,给它一个GridLayout,将它添加到JFrame BorderLayout.CENTER,然后将底部JPanel添加到JFrame BorderLayout.PAGE_END。 与您的问题无关的附带建议:

消除所有冗余。不必要的复杂代码很难调试代码。 将程序逻辑(tic tac toe游戏的基本逻辑)与GUI代码分开。这也将使调试和增强游戏变得更容易。 在未来,努力提出一个具体的问题,因为你的问题似乎是一个多方参与的问题。
1.消除所有冗余。不必要的复杂代码很难调试代码。2.将程序逻辑(tic tac toe游戏的基本逻辑)与GUI代码分开。这也将使调试和增强游戏变得更容易。3.问一个具体的问题,因为你的问题似乎是多方参与的。谢谢!非常有帮助;我会把我的代码弄得乱七八糟的。
import javax.swing.JFrame;

public class TicTacToeRunner 
{
    public static void main(String[] args) 
    {
    JFrame frame = new TicTacToeFrame();
    frame.setVisible(true);
}
}