Назначить строковые значения кнопкам - JavaFx - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь настроить игру Tic Tac Toe, и я создал 9 строковых значений для каждой кнопки.Как только кнопка нажата, она присваивает ей строковое значение в зависимости от того, является ли она X или O. В конце я соединила все строки, чтобы вывести сообщение о победе в консоль, но это, похоже, не работает.

Код для кнопки

            // Create a Button
    Button TopLeft = new Button("");
    root.getChildren().add(TopLeft);
    // Move the Button
    TopLeft.setTranslateX(-150);
    TopLeft.setTranslateY(-150);
    // Action for the Button
    // Code from: https://docs.oracle.com/javafx/2/ui_controls/button.htm
    TopLeft.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent e) {
            if (playerX == true) {
                TopLeft.setText("X");
                 tl = "X";

            } else {
                TopLeft.setText("O");
                 tl = "O";

            }

            playerX = !playerX;
            TopLeft.setDisable(true);
        }

    });

Условие выигрыша

//WIN CONDITION, r1 = row 1, c1 = column 1, d1 = diagonal 1, etc        
     r1 = tl + tm + tr;
     r2 = l + m + r;
     r3 = bl + bm + br;
     c1 = tl + l + bl;
     c2 = tm + m + bm;
     c3 = tr + r + br;
     d1 = tl + m + br;
     d2 = tr + m + bl;


    if((r1.equals("XXX") || r2.equals("XXX") || r3.equals("XXX") || c1.equals("XXX") || c2.equals("XXX") || c3.equals("XXX") || d1.equals("XXX") || d2.equals("XXX")) == true){
        System.out.println("Player X Wins");
    } else {
        System.out.println("Player O Wins");
    }

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Попробуйте проверить, выиграл ли игрок сразу после нажатия кнопки.Вы можете захотеть создать метод, который проверяет, выиграл ли игрок, как показано:

private boolean playerWon(){
     r1 = tl + tm + tr;
     r2 = l + m + r;
     r3 = bl + bm + br;
     c1 = tl + l + bl;
     c2 = tm + m + bm;
     c3 = tr + r + br;
     d1 = tl + m + br;
     d2 = tr + m + bl;


     return ((r1.equals("XXX") || r2.equals("XXX") || r3.equals("XXX") || 
              c1.equals("XXX") || c2.equals("XXX") || c3.equals("XXX") || 
              d1.equals("XXX") || d2.equals("XXX") ||

              r1.equals("OOO") || r2.equals("OOO") || r3.equals("OOO") || 
              c1.equals("OOO") || c2.equals("OOO") || c3.equals("OOO") || 
              d1.equals("OOO") || d2.equals("OOO")))
}

, а затем вызывать этот метод непосредственно перед переключением ходов.Это до playerX = !playerX;.Вы могли бы сделать что-то вроде этого

TopLeft.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent e) {
            if (playerX == true) {
                TopLeft.setText("X");
                 tl = "X";

            } else {
                TopLeft.setText("O");
                 tl = "O";

            }

            if(playerWon()){
               if(playerX) System.out.println("Player X Wins");
               else System.out.println("Player O Wins");
            }

            playerX = !playerX;
            TopLeft.setDisable(true);
        }

});
0 голосов
/ 23 декабря 2018

Добавьте команду действия, подобную этой, к вашей кнопке, на которую ссылаются:

    TopLeft.setActionCommand("ButtonX");

В вашем методе управления

    String action = e.getActionCommand();

    if (action.equals("ButtonX") {
           // code here
    }  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...