我只需要让它在“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);
}
}
答案 0 :(得分:0)
查看您的actionPerformed
方法。每次点击发生时,您都会将turns
设置为1.因此,!(turns % 2 == 0)
将始终评估为true,并且您将始终绘制X.
答案 1 :(得分:0)
只需快速查看代码,我猜是因为您的turn
变量在所有ActionListener
个对象中都是本地的。因此,turn
变量始终为1,并且您始终遇到第一个if情况。因此,只要在turn
方法中获得回调,就会在堆栈上重新创建actionPerformed
变量。要快速修复和测试,请尝试将转弯变量放在tictactoe
类中,看看是否有帮助。
答案 2 :(得分:0)
麻烦在于actionPerformed中的turns变量。如果你想跟踪它,你应该从你的方法中移出它。
答案 3 :(得分:0)
首先,正如其他人也说的那样,你希望在所有循环之外初始化“转弯”。
其次,我想指出一个错字:
if(clicked == gameButton[countTurns] && turns < 10)
应该是
if(clicked == gameButton[p] && turns < 10)
...除非你真的想在每次点击一个按钮时将每个按钮的文字从X改为O九次。
但即使修正错字也毫无意义。为什么要循环查找特定按钮,当它与哪个特定按钮无关?无论如何,所有按钮都有相同的动作处理程序,只有九个单独的副本,因为每次创建九个相同的副本。
相反,因为所有按钮都做同样的事情,所以你应该为所有按钮都有一个动作处理程序。如果你不确定是怎么做的,你可以在按钮制作循环之外创建它并将其分配给变量,然后在分配每个按钮的动作处理程序时输入该变量,例如。
gameButton[i].addActionListener(myActionListener);