2016-07-30 6 views
0

私はJavaFXでTicTacToeゲーム用にこのコードを作成しようとしています。しかし、勝者(誰かが3つのXまたはOを行/列/対角線に置くことを意味する)があるときでさえ、プログラムは依然として他のプレイヤーが彼のサインをボードに置くことを可能にする。その後、勝利ボタンが変更され、ボタンが無効に設定されます。それをどうやって変えるの?TicTacToeゲームで1回は不要です。

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

関連する問題