簡體   English   中英

井字游戲中的一個不必要的轉彎

[英]One unnecessary turn in TicTacToe game

我正在嘗試為JavaFX中的TicTacToe游戲編寫此代碼。 但是現在,即使有贏家(意味着有人將他的三個X或O連續/列/對角線地放置),該程序仍允許其他玩家將其牌子放在板上。 僅在更改獲勝按鈕並將按鈕設置為禁用之后。 我該如何改變?

package tictactoe;

import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.GridPane;

public class TicTacToeController {
private boolean isFirstPlayer = true;

public void buttonClickHandler(ActionEvent evt) { 
    this.find3InARow();  

    Button clickedButton = (Button) evt.getTarget();
    String buttonLabel = clickedButton.getText();

    if ("".equals(buttonLabel) && isFirstPlayer){
        clickedButton.setText("X");
        isFirstPlayer = false;
    } else if("".equals(buttonLabel) && !isFirstPlayer) {
        clickedButton.setText("O");
        isFirstPlayer = true;
    }

}
@FXML Button b1; 
@FXML Button b2;
@FXML Button b3;
@FXML Button b4;
@FXML Button b5;
@FXML Button b6;
@FXML Button b7;
@FXML Button b8;
@FXML Button b9;   
@FXML GridPane gameBoard;
@FXML MenuItem Play; 

private boolean find3InARow() {
    if (""!=b1.getText() && b1.getText() == b2.getText() 
        && b2.getText() == b3.getText()){
        highlightWinningCombo(b1,b2,b3);
        return true; 
    }

    if (""!=b4.getText() && b4.getText() == b5.getText() 
        && b5.getText() == b6.getText()){
        highlightWinningCombo(b4,b5,b6);
        return true; 
    }

    if (""!=b7.getText() && b7.getText() == b8.getText() 
        && b8.getText() == b9.getText()){
        highlightWinningCombo(b7,b8,b9);
        return true; 
    }

    if (""!=b1.getText() && b1.getText() == b4.getText() 
        && b4.getText() == b7.getText()){
        highlightWinningCombo(b1,b4,b7);
        return true; 
    }

    if (""!=b2.getText() && b2.getText() == b5.getText() 
        && b5.getText() == b8.getText()){
        highlightWinningCombo(b2,b5,b8);
        return true; 
    }

    if (""!=b3.getText() && b3.getText() == b6.getText() 
        && b6.getText() == b9.getText()){
        highlightWinningCombo(b3,b6,b9);
        return true; 
    }

    if (""!=b1.getText() && b1.getText() == b5.getText() 
        && b5.getText() == b9.getText()){
        highlightWinningCombo(b1,b5,b9);
        return true; 
    }

    if (""!=b3.getText() && b3.getText() == b5.getText() 
        && b5.getText() == b7.getText()){
        highlightWinningCombo(b3,b5,b7);
        return true; 
    }
    return false;

    }

    private void highlightWinningCombo(Button first, Button second, Button third) {
        gameBoard.setDisable(true);
        first.getStyleClass().add("winning-button");
        second.getStyleClass().add("winning-button");
        third.getStyleClass().add("winning-button");
    }

    public void menuClickHandler(ActionEvent evt){
        MenuItem clickedMenu = (MenuItem) evt.getTarget();
        String menuLabel = clickedMenu.getText();

        if ("Play".equals(menuLabel)){ 
            ObservableList<Node> buttons =  gameBoard.getChildren(); 
gameBoard.setDisable(false);

            buttons.forEach(btn -> { 
                ((Button) btn).setText("");  
                btn.getStyleClass().remove("winning-button");
            });
            isFirstPlayer = true;  
        }
        else if("Quit".equals(menuLabel)) {
            System.exit(0);
   }

    }

}

您在設置玩家的最后輸入之前正在檢查棋盤,因此,如果玩家做出了獲勝的舉動,則只有在您檢查獲勝條件后才能進行設置,因此程序不知道最后一位玩家是否獲勝了。 要解決此問題,您首先需要處理輸入,然后檢查獲勝條件。 為此,只需移動this.find3InARow(); 到方法buttonClickHandler()的末尾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM