2016-07-30 75 views
0

我正在尝试在JavaFX中为TicTacToe游戏制作此代码。但是现在即使有赢家(也就是说有人把他的三个X或O排成一排/一列/对角线),该程序仍然允许另一个玩家将他的牌放在棋盘上。只有在获胜按钮被更改并且按钮被设置为禁用之后。我该如何改变它?TicTacToe游戏中的一个不必要的转向

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); 
    } 

    } 

}

+0

用调试程序运行该程序以检查它出错的位置。 – Henry

回答

0

由玩家设定的最后输入之前要检查的板,所以如果玩家已经作出一个成功的举动,只会被检查完获奖条件设定,所以该节目不知道最后一名球员是否赢了。为了解决这个问题,你首先需要处理输入,然后检查获胜条件。要做到这一点,只需将this.find3InARow();移至方法buttonClickHandler()的末尾即可。

+0

非常感谢!它确实有帮助! – Felix

+0

@Felix如果你喜欢我的回答,你能接受吗? –

+0

对不起,我是新来的。我标记了。 – Felix