好的,所以我写了这个是因为我想用多个类而不是一个类来编写tictactoe的代码。我不能为我的生活弄清楚如何让我赢得胜利。如果有人可以提供帮助,我将非常感激。
RUNNER CLASS
public class TicTacToe
{
//runs the game
public static void main(String[] args)
{
new createWindow();
}
}
BUTTON CLASS
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);
}
}
WINDOW CLASS
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);
}
}
答案 0 :(得分:1)
当然,您可以跟踪XOButton
中的X和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
,因为它包含所有按钮。
问:如何通过void actionPerformed(ActionEvent)
中的XOButton
方法“到达此处”? XOButton
不知道createWindow
。
答:通过实施ActionListener
,就像点击XOButton
时所做的那样。
因此createWindow
也会实现ActionListener
,每次创建XOButton
时它都会自行注册:
XOButton buttonN = new XOButton();
buttonN.addActionListener(this);
现在,您可以在void actionPerformed(ActionEvent)
中实现一个带有签名createWindow
的方法,并在那里评估游戏结果。
现在问题是我们无法决定首先执行哪个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
的{{1}}成员(更确切地说是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
。
答案 1 :(得分:0)
您可以拥有2 x 2阵列。在每次单击按钮时,您可以在用户单击的阵列位置上设置输入的字母(X或O)。每次点击后,您都可以使用一种方法检查拼图是否被任何一方赢得。
这是我的方法,看到评论后,Gabriele B-David在我面前得到了同样的想法。所以我只是补充他原来的答案。