Я работаю над заданием, в котором мне нужно создать простую игру в крестики-нолики.У меня все в основном сделано, НО одно из требований приложения позволяет игрокам снова играть и обновлять игру.Я буквально все перепробовал, и приведенный ниже код - самый близкий к нему.Когда я делаю это, он создает новое окно, но фактически не позволяет мне играть снова.
Кто-нибудь знает, как перезапустить ваше приложение в JavaFX?Любая помощь приветствуется!
public class TicTacToe extends Application{
private boolean gameOver = false;
private int nFilled = 0;
private char whoseTurn = 'X'; // 'X' or 'O'
private Image imageX = new Image("file:x.jpg");
private Image imageO = new Image("file:o.jpg");
private Cell[][] cell = new Cell[3][3];
private Label statusLabel = new Label("X's turn to play");
private Stage primaryStage;
BorderPane borderPane = new BorderPane();
void startGame(Stage stage, BorderPane bP)
{
GridPane pane = new GridPane();
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
pane.add(cell[i][j] = new Cell(), j, i);
borderPane.setCenter(pane);
borderPane.setBottom(statusLabel);
pane.setStyle("-fx-background-color:#ffffff; -fx-opacity:1;");
Scene scene = new Scene(borderPane, 600, 600);
stage.setTitle("TicTacToe");
stage.setScene(scene);
stage.show();
}
@Override
public void start(Stage primaryStage) {
this.primaryStage = primaryStage;
this.borderPane = new BorderPane();
startGame(this.primaryStage, this.borderPane);
}
public boolean isFull() {
return nFilled >= 9; // > should never happen
}
public boolean hasWon(char tkn) {
for (int i = 0; i < 3; i++)
if (cell[i][0].getToken() == tkn &&
cell[i][1].getToken() == tkn &&
cell[i][2].getToken() == tkn)
return true;
for (int j = 0; j < 3; j++)
if (cell[0][j].getToken() == tkn &&
cell[1][j].getToken() == tkn &&
cell[2][j].getToken() == tkn)
return true;
if (cell[0][0].getToken() == tkn &&
cell[1][1].getToken() == tkn &&
cell[2][2].getToken() == tkn)
return true;
if (cell[0][2].getToken() == tkn &&
cell[1][1].getToken() == tkn &&
cell[2][0].getToken() == tkn)
return true;
return false;
}
public class Cell extends Pane {
private char token = ' '; // one of blank, X, or O
public Cell() {
setStyle("-fx-border-color: black");
setPrefSize(200, 200);
setOnMouseClicked(e -> handleMouseClick());
}
public char getToken() {
return token;
}
public void drawX() {
if(token == ' ') {
ImageView imageV = new ImageView(imageX);
imageV.setFitHeight(100);
imageV.setFitWidth(100);
imageV.setTranslateX(50);
imageV.setTranslateY(50);
getChildren().add(imageV);
}
}
public void drawO() {
if(token == ' ') {
ImageView imageV = new ImageView(imageO);
imageV.setFitHeight(100);
imageV.setFitWidth(100);
imageV.setTranslateX(50);
imageV.setTranslateY(50);
getChildren().add(imageV);
}
}
public void setToken(char c) {
if (c == 'X')
drawX();
else
drawO();
token = c;
nFilled ++;
}
private void handleMouseClick() {
String s = "";
if (!gameOver) {
setToken(whoseTurn);
if (hasWon(whoseTurn)) {
gameOver = true;
s = "Congratulations, " + whoseTurn + " wins the game!";
Button btnNewGame = new Button("Play Again?");
btnNewGame.setOnAction( event ->
{
Stage pStage = new Stage();
start(pStage);
});
ToolBar toolBar = new ToolBar();
toolBar.getItems().addAll( new Separator(), btnNewGame);
borderPane.setTop(toolBar);
primaryStage.show();
}
else if (isFull()) {
gameOver = true;
s = "Draw!";
Button btnNewGame = new Button("Play Again?");
btnNewGame.setOnAction( event ->
{
Stage pStage = new Stage();
start(pStage);
});
ToolBar toolBar = new ToolBar();
toolBar.getItems().addAll( new Separator(), btnNewGame);
borderPane.setTop(toolBar);
primaryStage.show();
}
else {
whoseTurn = (whoseTurn == 'X') ? 'O' : 'X';
s = whoseTurn + "'s turn";
}
statusLabel.setText(s);
}
}
}
public static void main(String[] args) {
launch(args);
}
}