我使用 javafx 的 tic-tac-toe 程序不工作。它没有编译错误或运行时错误。但是还是不行
My tic-tac-toe program that uses javafx isnt working. It has no compile error or runtime error. But it still doesn't work
这是我的代码。我创建了一组 3 x 3 的按钮。单击后每个按钮都会变为 X 或 O。当我 运行 我的程序时,我得到一个 3 x 3 组按钮的可视化显示。但是一旦我点击其中一个按钮,什么也没有发生。
public class tic_tac_toe extends Application {
String token = "X";
public void start(Stage stage) {
Text t = new Text("Hello world");
GridPane p = new GridPane();
p.setAlignment(Pos.TOP_LEFT);
p.setHgap(10);
p.setVgap(10);
Button l0 = new Button("");
Button l01 = new Button("");
Button l02 = new Button("");
Button l1 = new Button("");
Button l11 = new Button("");
Button l12 = new Button("");
Button l2 = new Button("");
Button l21 = new Button("");
Button l22 = new Button("");
l0.setOnAction(e -> {
if(l0.equals("X") | l0.equals("O")) {System.exit(0);}
else if(l0.equals("") && token == "X") {
l0.setText("O");
token = "X";
}
else if(l0.equals("") && token == "O") {
l0.setText("X");
token = "X";
}
});
l01.setOnAction(e -> {
if(l01.equals("X") | l01.equals("O")) {System.exit(0);}
else if(l01.equals("") && token == "X") {
l01.setText("O");
token = "X";
}
else if(l01.equals("") && token == "O") {
l01.setText("X");
token = "X";
}
});
l02.setOnAction( e -> {
if(l02.equals("X") | l02.equals("O")) {System.exit(0);}
else if(l02.equals("") && token == "X") {
l02.setText("O");
token = "X";
}
else if(l02.equals("") && token == "O") {
l02.setText("X");
token = "X";
}
});
l1.setOnAction(e -> {
if(l1.equals("X") | l1.equals("O")) {System.exit(0);}
else if(l1.equals("") && token == "X") {
l1.setText("O");
token = "X";
}
else if(l1.equals("") && token == "O") {
l1.setText("X");
token = "X";
}
});
l11.setOnAction(e -> {
if(l11.equals("X") | l11.equals("O")) {System.exit(0);}
else if(l11.equals("") && token == "X") {
l11.setText("O");
token = "X";
}
else if(l11.equals("") && token == "O") {
l11.setText("X");
token = "X";
}
});
l12.setOnAction( e -> {
if(l12.equals("X") | l12.equals("O")) {System.exit(0);}
else if(l12.equals("") && token == "X") {
l12.setText("O");
token = "X";
}
else if(l12.equals("") && token == "O") {
l12.setText("X");
token = "X";
}
});
l2.setOnAction(e -> {
if(l2.equals("X") | l2.equals("O")) {System.exit(0);}
else if(l2.equals("") && token == "X") {
l2.setText("O");
token = "X";
}
else if(l2.equals("") && token == "O") {
l2.setText("X");
token = "X";
}
});
l21.setOnAction(e -> {
if(l21.equals("X") | l21.equals("O")) {System.exit(0);}
else if(l21.equals("") && token == "X") {
l21.setText("O");
token = "X";
}
else if(l21.equals("") && token == "O") {
l21.setText("X");
token = "X";
}
});
l22.setOnAction( e -> {
if(l22.equals("X") | l22.equals("O")) {System.exit(0);}
else if(l22.equals("") && token == "X") {
l22.setText("O");
token = "X";
}
else if(l22.equals("") && token == "O") {
l22.setText("X");
token = "X";
}
});
p.add(l0, 0, 0);
p.add(l01, 1, 0);
p.add(l02, 2, 0);
p.add(l1, 0, 1);
p.add(l11, 1, 1);
p.add(l12, 2, 1);
p.add(l2, 0, 2);
p.add(l21, 1, 2);
p.add(l22, 2, 2);
Scene s = new Scene(p, 500, 500);
stage.setScene(s);
stage.show();
}
}
您应该学习一些概念来简化您的代码。首先,您应该了解数组和循环(又名循环)。
Dici 正确的另一件事是典型的行,例如
if(l0.equals("") && token == "X")
在一行中包含两个重大逻辑错误:
l0
的类型为 Button
因此永远不会 equals
为空 String
(""
)
要比较 String
,您应该使用 equals
而不仅仅是 ==
此外,如果用户点击错误,我认为 System.exit(0);
没有任何意义。
我修复了这些错误并使用数组和循环简化了代码,但仍然缺少重要的逻辑:游戏何时以及如何结束?这取决于您的实施。请注意,这可能需要对现有代码进行一些更改,而不仅仅是将逻辑放入 checkForEnd
。
还请确保您了解新 createFieldButton
的工作原理,这非常重要。
public class tic_tac_toe extends Application
{
private static final String X = "X"; // named constants are better than copy-paste
private static final String O = "O";
String token = X;
private void checkForEnd()
{
}
private Button createFieldButton()
{
Button b = new Button();
b.setOnAction(e -> {
if ("".equals(b.getText()))
{
b.setText(token);
if (X.equals(token))
token = O;
else
token = X;
checkForEnd();
}
});
return b;
}
public void start(Stage stage)
{
GridPane p = new GridPane();
p.setAlignment(Pos.TOP_LEFT);
p.setHgap(10);
p.setVgap(10);
Button[][] fieldButtons = new Button[3][];
for (int y = 0; y < 3; y++)
{
fieldButtons[y] = new Button[3];
for (int x = 0; x < 3; x++)
{
fieldButtons[y][x] = createFieldButton();
p.add(fieldButtons[y][x], x, y);
}
}
Scene s = new Scene(p, 500, 500);
stage.setScene(s);
stage.show();
}
}
这是我的代码。我创建了一组 3 x 3 的按钮。单击后每个按钮都会变为 X 或 O。当我 运行 我的程序时,我得到一个 3 x 3 组按钮的可视化显示。但是一旦我点击其中一个按钮,什么也没有发生。
public class tic_tac_toe extends Application {
String token = "X";
public void start(Stage stage) {
Text t = new Text("Hello world");
GridPane p = new GridPane();
p.setAlignment(Pos.TOP_LEFT);
p.setHgap(10);
p.setVgap(10);
Button l0 = new Button("");
Button l01 = new Button("");
Button l02 = new Button("");
Button l1 = new Button("");
Button l11 = new Button("");
Button l12 = new Button("");
Button l2 = new Button("");
Button l21 = new Button("");
Button l22 = new Button("");
l0.setOnAction(e -> {
if(l0.equals("X") | l0.equals("O")) {System.exit(0);}
else if(l0.equals("") && token == "X") {
l0.setText("O");
token = "X";
}
else if(l0.equals("") && token == "O") {
l0.setText("X");
token = "X";
}
});
l01.setOnAction(e -> {
if(l01.equals("X") | l01.equals("O")) {System.exit(0);}
else if(l01.equals("") && token == "X") {
l01.setText("O");
token = "X";
}
else if(l01.equals("") && token == "O") {
l01.setText("X");
token = "X";
}
});
l02.setOnAction( e -> {
if(l02.equals("X") | l02.equals("O")) {System.exit(0);}
else if(l02.equals("") && token == "X") {
l02.setText("O");
token = "X";
}
else if(l02.equals("") && token == "O") {
l02.setText("X");
token = "X";
}
});
l1.setOnAction(e -> {
if(l1.equals("X") | l1.equals("O")) {System.exit(0);}
else if(l1.equals("") && token == "X") {
l1.setText("O");
token = "X";
}
else if(l1.equals("") && token == "O") {
l1.setText("X");
token = "X";
}
});
l11.setOnAction(e -> {
if(l11.equals("X") | l11.equals("O")) {System.exit(0);}
else if(l11.equals("") && token == "X") {
l11.setText("O");
token = "X";
}
else if(l11.equals("") && token == "O") {
l11.setText("X");
token = "X";
}
});
l12.setOnAction( e -> {
if(l12.equals("X") | l12.equals("O")) {System.exit(0);}
else if(l12.equals("") && token == "X") {
l12.setText("O");
token = "X";
}
else if(l12.equals("") && token == "O") {
l12.setText("X");
token = "X";
}
});
l2.setOnAction(e -> {
if(l2.equals("X") | l2.equals("O")) {System.exit(0);}
else if(l2.equals("") && token == "X") {
l2.setText("O");
token = "X";
}
else if(l2.equals("") && token == "O") {
l2.setText("X");
token = "X";
}
});
l21.setOnAction(e -> {
if(l21.equals("X") | l21.equals("O")) {System.exit(0);}
else if(l21.equals("") && token == "X") {
l21.setText("O");
token = "X";
}
else if(l21.equals("") && token == "O") {
l21.setText("X");
token = "X";
}
});
l22.setOnAction( e -> {
if(l22.equals("X") | l22.equals("O")) {System.exit(0);}
else if(l22.equals("") && token == "X") {
l22.setText("O");
token = "X";
}
else if(l22.equals("") && token == "O") {
l22.setText("X");
token = "X";
}
});
p.add(l0, 0, 0);
p.add(l01, 1, 0);
p.add(l02, 2, 0);
p.add(l1, 0, 1);
p.add(l11, 1, 1);
p.add(l12, 2, 1);
p.add(l2, 0, 2);
p.add(l21, 1, 2);
p.add(l22, 2, 2);
Scene s = new Scene(p, 500, 500);
stage.setScene(s);
stage.show();
}
}
您应该学习一些概念来简化您的代码。首先,您应该了解数组和循环(又名循环)。
Dici 正确的另一件事是典型的行,例如
if(l0.equals("") && token == "X")
在一行中包含两个重大逻辑错误:
l0
的类型为Button
因此永远不会equals
为空String
(""
)要比较
String
,您应该使用equals
而不仅仅是==
此外,如果用户点击错误,我认为 System.exit(0);
没有任何意义。
我修复了这些错误并使用数组和循环简化了代码,但仍然缺少重要的逻辑:游戏何时以及如何结束?这取决于您的实施。请注意,这可能需要对现有代码进行一些更改,而不仅仅是将逻辑放入 checkForEnd
。
还请确保您了解新 createFieldButton
的工作原理,这非常重要。
public class tic_tac_toe extends Application
{
private static final String X = "X"; // named constants are better than copy-paste
private static final String O = "O";
String token = X;
private void checkForEnd()
{
}
private Button createFieldButton()
{
Button b = new Button();
b.setOnAction(e -> {
if ("".equals(b.getText()))
{
b.setText(token);
if (X.equals(token))
token = O;
else
token = X;
checkForEnd();
}
});
return b;
}
public void start(Stage stage)
{
GridPane p = new GridPane();
p.setAlignment(Pos.TOP_LEFT);
p.setHgap(10);
p.setVgap(10);
Button[][] fieldButtons = new Button[3][];
for (int y = 0; y < 3; y++)
{
fieldButtons[y] = new Button[3];
for (int x = 0; x < 3; x++)
{
fieldButtons[y][x] = createFieldButton();
p.add(fieldButtons[y][x], x, y);
}
}
Scene s = new Scene(p, 500, 500);
stage.setScene(s);
stage.show();
}
}