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