我使用 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")

在一行中包含两个重大逻辑错误:

  1. l0 的类型为 Button 因此永远不会 equals 为空 String ("")

  2. 要比较 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();
    }   
}