Java 我怎样才能让我写的Tictaoe代码告诉我谁是最后的赢家?

Java 我怎样才能让我写的Tictaoe代码告诉我谁是最后的赢家?,java,tic-tac-toe,Java,Tic Tac Toe,好的,我写这篇文章是因为我想用多个类而不是一个类为TictaToe编写代码。我一辈子都想不出如何让我成为赢家。如果有人能帮忙,我将非常感激 跑步班 public class TicTacToe { //runs the game public static void main(String[] args) { new createWindow(); } } 按钮类 import java.awt.event.*; import javax.swing.

好的,我写这篇文章是因为我想用多个类而不是一个类为TictaToe编写代码。我一辈子都想不出如何让我成为赢家。如果有人能帮忙,我将非常感激

跑步班

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);
}
}

你可以有一个2乘2的数组。每次单击按钮时,您都会在用户单击的数组位置上设置输入的字母(X或O)。在每次点击之后,你可以有一个方法来检查拼图是否由任何一方赢了


这就是我的方法,在看了评论后,加布里埃尔·B-David在我之前也有同样的想法。所以我只是补充他最初的答案

当然,您可以在
XOButton
中跟踪Xs和Os。看看它的名字就知道了

要实现这一点,只需实现一个成员变量,如

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
}
然而,你知道,你必须评估模式,看看是否有球员赢了。例如,如果
button1
button5
button9
都有
“X”.equals(button.getLabel())
,则玩家
X
获胜(完全对角线行)。同样适用于(
1
2
3
)、(
2
5
8
)等等

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

编辑 我只是指出了实际的问题。现在仍然存在如何评估所有按钮的结果的问题。如果你想做对的话,这会有点复杂

所以你创建了两个类

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

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

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


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

答:通过实现一个
ActionListener
,就像您在单击
XOButton
时所做的那样

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

XOButton buttonN = new XOButton();
buttonN.addActionListener(this);
现在,您可以在
createWindow
中使用签名
void actionPerformed(ActionEvent)
实现一个方法,并在那里评估游戏结果

编辑2 现在的问题是,我们无法决定首先执行哪个
ActionListener
。然而,
ActionListeners
的执行顺序是由
JButton
决定的,尽管它是确定性的(从最后到第一),但我不喜欢依赖它

因此,您可以在这里定义自己的
ActionListener
。事实上,这很简单-只需扩展
接口

interface PostActionListener extends ActionListener
{
    // empty
}
现在,您必须在
XOButton
中管理此类事件。为此,您主要可以遵循处理
ActionListener
所需的基本操作

首先,您需要在
XOButton
中使用一个方法来注册所定义类型的侦听器

public void addPostActionListener(PostActionListener l)
{
    this.listenerList.add(PostActionListener.class, l);
}
注意:
listenerList
JButton
受保护的
成员(更确切地说是
AbstractButton
,但归根结底是相同的)

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

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);
    }
}
注意:这个简单的循环通常被提取到一个单独的方法中,按照惯例,这个方法看起来像
protectedvoidfirestostationperformed(ActionEvent a)


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

在执行
actionIsPerformed
函数后,您可以调用
checkStatusOfBoard
函数来检查是否有人赢过,具体情况如何?我以前试过这样做,但我不知道如何在XOButton类中这样做。你可以使用矩阵跟踪棋盘,然后通过矩阵查找谁玩过,我该如何跟踪每个X和O的位置?我不能在XOButton类中真正做到这一点。您可以在XOButton类中保留一个静态2D数组(尽管这在架构上并不正确),并在用户单击的X/O位置添加一个X或O。然后检查Xs和Os的位置,这样几乎可以很好地工作,但是createWindow()的动作监听器发生在XOButton()的动作监听器之前,这使得当玩家获胜时,必须单击另一个按钮才能注册fact@MrRubiksMinecraft是的,这是另一个设计问题。我们对用户输入和游戏结束评估使用了相同的事件。但这些是独立的事情,必须相应地处理。请参阅更新的答案。
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);
    }
}