【发布时间】: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 是的,我是这么认为的,但它似乎很简单,不值得一个完整的答案