好的,我之所以这样写是因为我想为tictactoe编写一个具有多个类而不是一个类的代码。我无法为自己的生活弄清楚如何使谁赢得冠军。如果有人可以提供帮助,我将不胜感激。

跑步课

public class TicTacToe
{
//runs the game
 public static void main(String[] args)
 {
     new createWindow();
 }
}


按钮类

import java.awt.event.*;
import javax.swing.*;
public class XOButton extends JButton implements ActionListener
{

private static int click = 0;
private String letter;


public void actionPerformed(ActionEvent a)
{
    click++;

    //Calculate Who's Turn It Is(X is always first)

    if(click == 1 || click == 3 || click == 5 || click == 7 || click == 9|| click == 11)
    {
        letter = "<html><font color = blue>"+ "X"+"</font></html>";
        this.setText(letter);
        this.removeActionListener(this);
    }
    else if(click == 2 || click == 4 || click == 6 || click == 8 || click == 10)
    {
        letter = "<html><font color = red>"+ "O"+"</font></html>";
        this.setText(letter);

        //removes action listener so button can't be pressed again
        this.removeActionListener(this);
    }




}
public XOButton()
{
    this.addActionListener(this);
}
}


窗户课

import java.awt.*;
import javax.swing.*;
public class createWindow extends JFrame
{

private static JFrame window = new JFrame("Tic-Tac-Toe");

//creates buttons to fill window
private JButton button1 = new XOButton();
private JButton button2 = new XOButton();
private JButton button3 = new XOButton();
private JButton button4 = new XOButton();
private JButton button5 = new XOButton();
private JButton button6 = new XOButton();
private JButton button7 = new XOButton();
private JButton button8 = new XOButton();
private JButton button9 = new XOButton();



public createWindow()
 {
     /*Create Window Parameters*/
        window.setSize(300,300);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setLayout(new GridLayout(3,3));

        //fills window with buttons
        window.add(button1);
        window.add(button2);
        window.add(button3);
        window.add(button4);
        window.add(button5);
        window.add(button6);
        window.add(button7);
        window.add(button8);
        window.add(button9);
        window.setVisible(true);

 }
}

最佳答案

当然,您可以在XOButton中跟踪X和O。只要看看它的名字。 ;)

为此,只需实现一个成员变量,例如

private String label;


也许是吸气剂

public String getLabel()
{
    return this.label;
}


并如下修改您的void actionPerformed(ActionEvent)

public void actionPerformed(ActionEvent a)
{
    click++;

    //Calculate Who's Turn It Is(X is always first)
    if(click % 2 != 0) // click is odd
    {
        this.label = "X";
        // set text
    }
    else // click is even
    {
        this.label = "O";
        // set text
    }
    // remove action listener
}


但是,您知道必须评估模式以查看是否有任何玩家赢了。例如,如果button1button5button9都具有"X".equals(button.getLabel()),则玩家X获胜(全对角线)。与(123),(258)等相同...

以上数字假定按钮按3x3网格排列。

编辑

我只是指出了实际问题。现在仍然存在关于如何评估所有按钮的结果的问题。如果您想做对的话,这会稍微复杂一些。

所以你创建了两个类


createWindow:管理窗口和按钮
XOButton:管理用户输入




问:现在,哪个班级可能应该负责评估哪个球员获胜?

答:createWindow,因为它包含所有按钮。



问:如何从void actionPerformed(ActionEvent)XOButton方法“到达这里”? XOButton不知道createWindow

答:通过实现ActionListener,就像单击XOButton时所做的一样。

因此,createWindow也实现了ActionListener,并且每次创建XOButton时,它都会自己注册:

XOButton buttonN = new XOButton();
buttonN.addActionListener(this);


现在,您可以在void actionPerformed(ActionEvent)中实现带有签名createWindow的方法,并在那里评估游戏结果。

编辑2

现在存在一个问题,我们无法确定将首先执行哪个ActionListener。但是,ActionListeners的执行顺序由JButton决定,尽管它是确定性的(从最后到第一),但我不希望依赖它。

因此,您可以在这里定义自己的ActionListener。实际上,这非常简单,只需扩展interface

interface PostActionListener extends ActionListener
{
    // empty
}


现在,您必须在XOButton中管理此类事件。为此,您通常可以遵循处理ActionListener所需的基本操作。

首先,您需要XOButton中的方法来注册您定义的类型的侦听器。

public void addPostActionListener(PostActionListener l)
{
    this.listenerList.add(PostActionListener.class, l);
}


注意:listenerListprotectedJButton成员(更确切地说是AbstractButton的成员,但最终归结为相同)

其次,您需要在操作发生时通知所有侦听器。您的情况是actionPerformed(ActionEvent a)XOButton的最后一个动作。

public void actionPerformed(ActionEvent a)
{
    // do your magic

    // now as the last action notify 'child' listeners
    for(PostActionListener l : this.listenerList.getListeners(PostActionListener.class))
    {
        l.actionPerformed(a);
    }
}


注意:此简单循环通常被提取为一个单独的方法,按照约定,该方法看起来像protected void firePostActionPerformed(ActionEvent a)

最后但并非最不重要的一点是,您将createWindow中的所有内容都从ActionListener更改为PostActionListener

10-01 14:06