【问题标题】:TicTacToe Swing game not detecting winnerTicTacToe Swing 游戏未检测到获胜者
【发布时间】:2017-06-19 03:26:39
【问题描述】:

程序:

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();
    }
}

我最初让它显示字母,但我希望它显示图像。为了检查它,我制作了一个字符串数组。我在 for 循环中显示了图标,同时还将字母添加到字符串数组中,以便比较它们。

它没有在应该检测到获胜者的时候,所以看起来win 没有变成真的。它正在检测何时按下所有按钮。

System.out.println(i + letters[i]);

应该检查值是什么,我得到了

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

很明显,这些字母在数组中。 if 条件没有正确比较。请帮忙?

【问题讨论】:

  • 虽然this example是连接四,基本思路是一样的
  • 您是否在调试器中单步调试代码以查看值是什么以及如何评估条件?请在发布之前至少这样做。
  • 您在每个actionPerformed 上初始化您的letters 数组。因此,对于每次点击,数组中实际上只有一个值。尝试将您的数组移动到类范围
  • @JavaDevil 这应该是一个答案,而不是评论。我正要发布一个答案,但既然你先得到它,我会让你去做。
  • @JimGarrison 是的,我是这么认为的,但它似乎很简单,不值得一个完整的答案

标签: java swing


【解决方案1】:

您正在对每个 actionPerformed 初始化您的 letters 数组。

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

因此,对于每次点击,数组中实际上只有一个值,并且您只打印当前的回合选择,这会给您一种您已存储移动的错觉。

要验证这一点,您可以尝试添加

System.out.println("Current moves: " + Arrays.toString(letters));

你会更直观地看到问题。

要解决这个问题,请将您的数组移动到类范围,您可以在构造函数中对其进行初始化。

【讨论】:

    【解决方案2】:

    您没有存储letters,因此每次单击按钮时,除了您单击的单元格之外,该数组在每个单元格中都包含""

    为避免此问题,您可以将letters 设置为您的类的属性,并在构造函数中使用"" 对其进行初始化。它看起来像这样:

    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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多