我怎么能制作这个我写的TicTacToe代码告诉我最后谁是胜利者?

时间:2017-02-06 23:25:09

标签: java tic-tac-toe

好的,所以我写了这个是因为我想用多个类而不是一个类来编写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);

 }
}

2 个答案:

答案 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
}

然而,你知道必须评估模式,看看是否有任何球员获胜。例如,如果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);
}

注意:listenerListprotected的{​​{1}}成员(更确切地说是JButton,但最终归结为相同)

其次,您需要在操作发生时通知所有侦听器。在您的情况下,作为AbstractButtonactionPerformed(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在我面前得到了同样的想法。所以我只是补充他原来的答案。