Java 带GUI的Tic-Tac-Toe
好的,我想用GUI创建一个Tic-Tac-Toe(X-O)游戏,我已经画了它,但不知怎么的,我无法运行它。我知道如何使用.addActionListener,我可以将某个按钮设置为“X”或“O”,但我如何使它在第一次单击按钮时变成X,第二次变成O,依此类推。addActionListener无法正常工作,因为我必须在某个按钮上使用它,但我不知道将按下哪个按钮 这是我写的代码Java 带GUI的Tic-Tac-Toe,java,Java,好的,我想用GUI创建一个Tic-Tac-Toe(X-O)游戏,我已经画了它,但不知怎么的,我无法运行它。我知道如何使用.addActionListener,我可以将某个按钮设置为“X”或“O”,但我如何使它在第一次单击按钮时变成X,第二次变成O,依此类推。addActionListener无法正常工作,因为我必须在某个按钮上使用它,但我不知道将按下哪个按钮 这是我写的代码 public class XO { public static void main(String[] args) {
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);
}
公共类XO{
公共静态void main(字符串[]args){
JFrame myForm=新JFrame(“X-O”);
myForm.setSize(255300);
myForm.setLocation(0,0);
JButton[]按钮=新JButton[10];
int x=40,y=0;
对于主方法之外的(int i=0;i),可以声明一个静态计数器来确定它是谁的移动:
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;
}
for(int i=0;i您可以通过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
// ...
}
好的,它工作得很好,但我不明白为什么我创建了butNum并给了它I的值,为什么我在按钮[I]中添加I时会给出错误,它们具有相同的值。另外,为什么我必须在main之外声明turnCount,为什么我在main内简单地执行“int turnCount=0;时它不工作。你不能使用”turnCount由于作用域的原因,新ActionListener内部。新ActionListener是一个不同的类,为了引用“turnCount”,变量必须是“final”在方法中,或者可以从父类中引用为静态,因为您在静态方法中。或者,如果您在非静态方法中并且具有该类的实例,则它可以是成员变量。