Как сократить код Tic Tac Toe, избегая повторения

Это мой первый проект JavaFX.

Я создал игру «Крестики-нолики» с помощью JavaFx. Игра работает в режиме «игрок против игрока» и идеальна, но код, который я использовал, слишком длинный.

Вот несколько очевидных дубликатов, но они совершенно разные:

Код крестики-нолики помогает улучшить

Кодовый гольф: крестики-нолики

Это мой код для первой кнопки, который я должен повторить еще для восьми кнопок:

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.

Это мой самый первый проект с графическим интерфейсом, но я не собираюсь оставаться новичком.

Редактировать

После того, как я не вижу в коде цикла for. Возможно, вы имели в виду if-утверждения? - NiVeR

Да, я имел в виду утверждения if.


person Community    schedule 21.06.2019    source источник
comment
я не вижу в коде цикла for. Возможно, вы имели в виду if-утверждения?   -  person NiVeR    schedule 21.06.2019
comment
На всякий случай, если вы не в курсе, если у вас есть рабочий код и вы ищете способы его улучшить, Проверка кода может (прочтите их руководящие принципы) лучше подходят.   -  person Slaw    schedule 21.06.2019
comment
@Slaw у меня есть код, спасибо, проверю   -  person    schedule 21.06.2019


Ответы (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, изменив его на то, что он есть на самом деле.

person isstiaung    schedule 21.06.2019
comment
Я только что просматривал это, где устанавливается значение i? - person isstiaung; 21.06.2019
comment
Я не добавлял этот код, но я устанавливаю его и добавляю 1 каждый раз, так что когда он четный, это поворот X, а когда он нечетный, это поворот O, если вам нужна эта часть кода, ответьте мне - person ; 21.06.2019
comment
i глобальная переменная? - person isstiaung; 21.06.2019
comment
i объявлен внутри открытого класса. Контроллер реализует Initializable {}, но вне общедоступной инициализации void (URL-адрес, ResourceBundle resourceBundle) {} - person ; 21.06.2019