程序:
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();
}
}
我最初有它显示字母,但我希望它显示图像。为了检查它,我做了一个String数组。我在for循环中显示了图标,同时还将字母添加到字符串数组中,因此我可以对它们进行比较。
在它应该的时候没有检测到胜利者,所以看起来win
没有成为现实。它正在检测何时按下所有按钮。
System.out.println(i + letters[i]);
应该检查值是什么,我得到
0X
1O
2X
3O
4X
5O
6X
7O
8X
很明显这些字母都在数组中。 if条件没有正确比较。有什么帮助吗?
答案 0 :(得分:2)
您正在每letters
个初始化actionPerformed
数组。
String[] letters = new String[9];
for (int i = 0; i < 9; i++) {
letters[i] = "";
}
因此,对于每次单击,阵列中实际只有一个值,并且您只打印当前的转弯选择,这会让您产生存储移动的错觉。
要验证这一点,您可以尝试添加
System.out.println("Current moves: " + Arrays.toString(letters));
你会更直观地看到问题。
要修复此问题,请将数组移动到类范围,然后在构造函数中初始化它。
答案 1 :(得分:1)
您不会存储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();
}
}