【问题标题】:How to shorten Tic Tac Toe code by avoiding repetition如何通过避免重复来缩短井字游戏代码
【发布时间】:2019-11-04 00:09:52
【问题描述】:

这是我的第一个 JavaFX 项目。

我使用 JavaFx 创建了一个井字游戏。该游戏适用于玩家对玩家模式,非常完美,但我使用的代码太长了。

这里有一些明显的重复,但它们完全不同:

Tic-tac-toe code help improve

Code Golf: Tic Tac Toe

这是我的按钮一的代码,我必须重复八个按钮:

one.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent actionEvent) {
        System.out.println(1);
        System.out.println("my state is " + state[0]);
        if (state[0] == 0){
            state[0]  = 1 ;
            for (int a: state ) {
            System.out.print(a);}
            if(i%2==0){
                one.setText("X"); i+= 1;
                System.out.println(i+"recorded");
                turn.setText("O turn");
                result[0] = 'x';
                win() ;
            }
            else{
                one.setText("O"); i+= 1 ;
                System.out.println(i+"recorded");
                turn.setText("X turn");
                result[0] = 'o';
                win() ;
            }
        }
    }
});

截图:

是否可以选择避免为另外 8 个按钮重复代码?

您可以在屏幕截图中看到也有重复的 for 循环。

这是我的第一个 gui 项目,但我不打算成为初学者。

编辑

在我没有在代码中看到任何 for 循环之后。也许您的意思是 if 语句? – NiVer

是的,我的意思是 if 语句。

【问题讨论】:

  • 我在代码中看不到任何 for 循环。也许您的意思是 if 语句?
  • 以防万一您不知道,如果您有工作代码并且正在寻找改进它的方法,那么Code Review 可能(阅读他们的指南)更合适。
  • @Slaw 我有一个代码,谢谢,我会检查一下

标签: java user-interface intellij-idea javafx redundancy


【解决方案1】:

尝试这样做:

void makeMove(Button button, JLabel turn, int cell){
    System.out.println(cell);
    System.out.println("my state is " + state[cell-1]);
    if (state[cell-1] == 0){
        state[cell-1]  = 1 ;
        for (int a: state ) {
        System.out.print(a);}
        if(i%2==0){
            button.setText("X"); i+= 1;
            System.out.println(i+"recorded");
            turn.setText("O turn");
            result[cell-1] = 'x';
            win() ;
        }
        else{
            button.setText("O"); i+= 1 ;
            System.out.println(i+"recorded");
            turn.setText("X turn");
            result[cell-1] = 'o';
            win() ;
        }
    }
}

one.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent actionEvent) {
        makeMove(one,turn,1);
    }
);

并通过将 1 更改为 2...9 对其他按钮重复此操作

这段代码实际上还可以改进,但是,既然你说你刚刚开始,这是开始考虑模块化代码的好方法。

我不确定turn 是什么,所以我将它设为makeMove 定义中的标签,将其更改为实际的任何内容。

【讨论】:

  • 我只是在看这个,我的值在哪里设置?
  • 我没有添加该代码,但我设置它并每次添加 1,这样当它是偶数时它是 X 轮,当它是奇数时它是 O 轮,如果你需要那个部分代码回复我
  • i 是全局变量吗?
  • i 在 public "class Controller implements Initializable{}" 内部声明,但在 "public void initialize(URL url, ResourceBundle resourceBundle) {}" 外部声明
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
相关资源
最近更新 更多