Java 我怎样才能让我写的Tictaoe代码告诉我谁是最后的赢家?
好的,我写这篇文章是因为我想用多个类而不是一个类为TictaToe编写代码。我一辈子都想不出如何让我成为赢家。如果有人能帮忙,我将非常感激 跑步班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.
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);
}
}