好的,我之所以这样写是因为我想为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
}
但是,您知道必须评估模式以查看是否有任何玩家赢了。例如,如果
button1
,button5
和button9
都具有"X".equals(button.getLabel())
,则玩家X
获胜(全对角线)。与(1
,2
,3
),(2
,5
,8
)等相同...以上数字假定按钮按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);
}
注意:
listenerList
是protected
的JButton
成员(更确切地说是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
。