2016-07-30 13 views
0

Ich versuche, diesen Code für ein TicTacToe Spiel in JavaFX zu machen. Aber jetzt, selbst wenn es einen Gewinner gibt (was bedeutet, dass jemand seine drei X oder O in einer Reihe/Spalte/Diagonale platziert), erlaubt das Programm dem anderen Spieler immer noch, sein Zeichen auf das Brett zu setzen. Erst danach werden die Gewinnerschaltflächen geändert und die Schaltflächen werden deaktiviert. Wie ändere ich das?Eine unnötige Drehung in TicTacToe Spiel

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

führen Sie das Programm mit dem Debugger, um zu überprüfen, wo es schief geht. – Henry

Antwort

0

Du bist gerade das Brett vor der letzte Eingabe durch den Spieler einstellen, so dass, wenn der Spieler einen Gewinn Zug gemacht hat, wird es nur dann gesetzt werden, wenn Sie die Siegbedingungen überprüft haben, so Das Programm weiß nicht, ob der letzte Spieler gewonnen hat. Um dies zu beheben, müssen Sie zuerst die Eingabe bearbeiten und dann nach der Gewinnbedingung suchen. Um dies zu tun, bewegen Sie einfach this.find3InARow(); an das Ende der Methode buttonClickHandler().

+0

Vielen Dank! Es hat geholfen! – Felix

+0

@Felix Wenn Sie meine Antwort mögen, können Sie es als akzeptiert markieren? –

+0

Entschuldigung, ich bin neu hier. Ich habe markiert. – Felix