Java Tictaoe Swing游戏未检测到赢家

Java Tictaoe Swing游戏未检测到赢家,java,swing,Java,Swing,节目: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TicTacToe implements ActionListener { JFrame window = new JFrame("Tic Tac Toe"); JButton b[] = new JButton[9]; String letter = ""; ImageIcon X;

节目:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class TicTacToe implements ActionListener {
    JFrame window = new JFrame("Tic Tac Toe");
    JButton b[] = new JButton[9];

    String letter = "";
    ImageIcon X;
    ImageIcon O;
    ImageIcon ltr;
    int value = 0;
    boolean win = false;

    public TicTacToe() {
        // Assign images
        X = new ImageIcon(getClass().getResource("X.png"));
        O = new ImageIcon(getClass().getResource("O.png"));
        // Create the Window
        window.setSize(500,500);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setLayout(new GridLayout(3,3));

        // Add Buttons
        for (int i = 0; i < 9; i++) {
            b[i] = new JButton();
            window.add(b[i]);
        }

        // Add ActionListener
        for (int i = 0; i < 9; i++) {
            b[i].addActionListener(this);
        }

        window.setVisible(true);
    }

    public void actionPerformed(ActionEvent a) {
        value++;
        // Who's Turn
        if (value % 2 == 1) {
            ltr = X;
            letter = "X";
        }
        if (value % 2 == 0) {
            ltr = O;
            letter = "O";
        }

        String[] letters = new String[9];
        for (int i = 0; i < 9; i++) {
            letters[i] = "";
        }

        // Display Letters
        for (int i = 0; i < 9; i++) {
            if (a.getSource() == b[i]) {
                b[i].setIcon(ltr);
                b[i].setDisabledIcon(ltr);
                b[i].setEnabled(false);
                letters[i] = letter;
                // Check what is printing
                System.out.println(i + letters[i]);
            }
        }

        // Who Won

        // Horizontal
        if (letters[0].equals(letters[1]) && letters[1].equals(letters[2]) && !letters[0].equals("")) {
            win = true;
        } else if (letters[3].equals(letters[4]) && letters[4].equals(letters[5]) && !letters[3].equals("")) {
            win = true;
        } else if (letters[6].equals(letters[7]) && letters[7].equals(letters[8]) && !letters[6].equals("")) {
            win = true;
        }

        // Vertical
        if (letters[0].equals(letters[3]) && letters[3].equals(letters[6]) && !letters[0].equals("")) {
            win = true;
        } else if (letters[1].equals(letters[4]) && letters[4].equals(letters[7]) && !letters[1].equals("")) {
            win = true;
        } else if (letters[2].equals(letters[5]) && letters[5].equals(letters[8]) && !letters[2].equals("")) {
            win = true;
        }

        // Diagonal
        if (letters[0].equals(letters[4]) && letters[4].equals(letters[8]) && !letters[0].equals("")) {
            win = true;
        } else if (letters[2].equals(letters[4]) && letters[4].equals(letters[6]) && !letters[2].equals("")) {
            win = true;
        }

        if (win) {
            JOptionPane.showMessageDialog(null, "Player " + letter + " wins!");
            for (JButton i : b) {
                i.setEnabled(false);
            }
        } else if (!win && value == 9) {
            JOptionPane.showMessageDialog(null, "The game ended in a tie.");
        }
    }

    public static void main(String[] args) {
        new TicTacToe();
    }
}
应该检查值是多少,我得到

0X
1O
2X
3O
4X
5O
6X
7O
8X

很明显,字母在数组中。如果条件比较不正确。有什么帮助吗?

您没有存储
字母
,因此每次单击按钮时,数组中的每个单元格都包含
,除了您单击的单元格

为了避免这个问题,您可以将
字母
设置为类的属性,并在构造函数中用
初始化它。它看起来是这样的:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class TicTacToe implements ActionListener {
    JFrame window = new JFrame("Tic Tac Toe");
    JButton b[] = new JButton[9];

    String[] letters = new String[9];
    String letter = "";
    ImageIcon X;
    ImageIcon O;
    ImageIcon ltr;
    int value = 0;
    boolean win = false;

    public TicTacToe() {
        // Assign images
        X = new ImageIcon(getClass().getResource("X.png"));
        O = new ImageIcon(getClass().getResource("O.png"));
        // Create the Window
        window.setSize(500,500);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setLayout(new GridLayout(3,3));

        // Initialize letters
        for (int i = 0; i < 9; i++) {
            letters[i] = "";
        }

        // Add Buttons
        for (int i = 0; i < 9; i++) {
            b[i] = new JButton();
            window.add(b[i]);
        }

        // Add ActionListener
        for (int i = 0; i < 9; i++) {
            b[i].addActionListener(this);
        }

        window.setVisible(true);
    }

    public void actionPerformed(ActionEvent a) {
        value++;
        // Who's Turn
        if (value % 2 == 1) {
            ltr = X;
            letter = "X";
        }
        if (value % 2 == 0) {
            ltr = O;
            letter = "O";
        }

        // Display Letters
        for (int i = 0; i < 9; i++) {
            if (a.getSource() == b[i]) {
                b[i].setIcon(ltr);
                b[i].setDisabledIcon(ltr);
                b[i].setEnabled(false);
                letters[i] = letter;
                // Check what is printing
                System.out.println(i + letters[i]);
            }
        }

        // Who Won

        // Horizontal
        if (letters[0].equals(letters[1]) && letters[1].equals(letters[2]) && !letters[0].equals("")) {
            win = true;
        } else if (letters[3].equals(letters[4]) && letters[4].equals(letters[5]) && !letters[3].equals("")) {
            win = true;
        } else if (letters[6].equals(letters[7]) && letters[7].equals(letters[8]) && !letters[6].equals("")) {
            win = true;
        }

        // Vertical
        if (letters[0].equals(letters[3]) && letters[3].equals(letters[6]) && !letters[0].equals("")) {
            win = true;
        } else if (letters[1].equals(letters[4]) && letters[4].equals(letters[7]) && !letters[1].equals("")) {
            win = true;
        } else if (letters[2].equals(letters[5]) && letters[5].equals(letters[8]) && !letters[2].equals("")) {
            win = true;
        }

        // Diagonal
        if (letters[0].equals(letters[4]) && letters[4].equals(letters[8]) && !letters[0].equals("")) {
            win = true;
        } else if (letters[2].equals(letters[4]) && letters[4].equals(letters[6]) && !letters[2].equals("")) {
            win = true;
        }

        if (win) {
            JOptionPane.showMessageDialog(null, "Player " + letter + " wins!");
            for (JButton i : b) {
                i.setEnabled(false);
            }
        } else if (!win && value == 9) {
            JOptionPane.showMessageDialog(null, "The game ended in a tie.");
        }
    }

    public static void main(String[] args) {
        new TicTacToe();
    }
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类TicTacToe实现ActionListener{
JFrame窗口=新JFrame(“Tic Tac Toe”);
JButton b[]=新JButton[9];
字符串[]字母=新字符串[9];
字符串字母=”;
图像图标X;
图像图标O;
ImageIcon ltr;
int值=0;
布尔赢=假;
公共交通{
//分配图像
X=新的图像图标(getClass().getResource(“X.png”);
O=新的图像图标(getClass().getResource(“O.png”);
//创建窗口
窗口设置大小(500500);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(新的GridLayout(3,3));
//初始化字母
对于(int i=0;i<9;i++){
字母[i]=”;
}
//添加按钮
对于(int i=0;i<9;i++){
b[i]=新的JButton();
加上(b[i]);
}
//添加ActionListener
对于(int i=0;i<9;i++){
b[i].addActionListener(此);
}
window.setVisible(true);
}
已执行的公共无效操作(操作事件a){
值++;
//轮到谁了
如果(值%2==1){
ltr=X;
字母=“X”;
}
如果(值%2==0){
ltr=O;
字母=“O”;
}
//显示字母
对于(int i=0;i<9;i++){
如果(a.getSource()==b[i]){
b[i].setIcon(ltr);
b[i].设置禁用DICON(ltr);
b[i].setEnabled(假);
字母[i]=字母;
//检查正在打印的内容
System.out.println(i+字母[i]);
}
}
//谁赢了
//水平的
如果(字母[0]。等于(字母[1])&&字母[1]。等于(字母[2])&&!字母[0]。等于(“”){
赢=真;
}else如果(字母[3]。等于(字母[4])&&字母[4]。等于(字母[5])&&!字母[3]。等于(“”){
赢=真;
}else如果(字母[6]。等于(字母[7])&&字母[7]。等于(字母[8])&&字母[6]。等于(“”){
赢=真;
}
//垂直的
如果(字母[0]。等于(字母[3])&&字母[3]。等于(字母[6])&&!字母[0]。等于(“”){
赢=真;
}else如果(字母[1]。等于(字母[4])&&字母[4]。等于(字母[7])&&!字母[1]。等于(“”){
赢=真;
}else如果(字母[2]。等于(字母[5])&&字母[5]。等于(字母[8])&&!字母[2]。等于(“”){
赢=真;
}
//对角线的
如果(字母[0]。等于(字母[4])&&字母[4]。等于(字母[8])&&!字母[0]。等于(“”){
赢=真;
}else如果(字母[2]。等于(字母[4])&&字母[4]。等于(字母[6])&&!字母[2]。等于(“”){
赢=真;
}
如果(赢){
showMessageDialog(空,“玩家”+字母+“获胜!”);
用于(按钮i:b){
i、 setEnabled(假);
}
}如果(!win&&value==9),则为else{
showMessageDialog(null,“游戏以平局结束”);
}
}
公共静态void main(字符串[]args){
新的TicTacToe();
}
}

您正在初始化每个执行的
操作上的
字母
数组

String[] letters = new String[9];
for (int i = 0; i < 9; i++) {
    letters[i] = "";
}
你会更直观地看到这个问题


要解决此问题,请将数组移动到类作用域,然后可以在构造函数中对其进行初始化。

对于connect four,基本思想是在调试器中单步执行代码以查看值是什么以及如何计算条件?请在发布之前至少这样做。您正在初始化每个执行的
操作上的
字母
数组。因此,对于每次单击,实际上数组中只有一个值。尝试将数组移动到类中scope@JavaDevil这应该是一个答案,而不是评论。我正要发布一个答案,但既然你先得到了答案,我就让你去做。@JimGarrison是的,我想是的,但似乎很简单,它不值得一个完整的答案
String[] letters = new String[9];
for (int i = 0; i < 9; i++) {
    letters[i] = "";
}
System.out.println("Current moves: " + Arrays.toString(letters));