使用JavaFX图形API,编写游戏——TICTACTOE三子棋。
时间: 2023-10-10 13:06:33 浏览: 83
好的,我可以为您提供一些基本的步骤和代码示例来帮助您编写TicTacToe游戏。
1. 创建JavaFX应用程序
首先,我们需要创建一个JavaFX应用程序来承载我们的TicTacToe游戏。您可以使用以下模板代码:
```
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class TicTacToe extends Application {
@Override
public void start(Stage primaryStage) {
GridPane gridPane = new GridPane();
Scene scene = new Scene(gridPane, 300, 300);
primaryStage.setTitle("TicTacToe");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
```
2. 添加游戏棋盘
接下来,我们需要在应用程序中添加一个棋盘。您可以使用JavaFX的GridPane布局来实现这一点。在TicTacToe类的start方法中添加以下代码:
```
GridPane gridPane = new GridPane();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
Tile tile = new Tile();
gridPane.add(tile, i, j);
}
}
```
Tile类是一个自定义的JavaFX组件,我们稍后会定义它。
3. 实现Tile类
Tile类表示棋盘上的每个方格。我们需要定义它来显示一个空格子,并在玩家单击时显示X或O。
```
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
public class Tile extends StackPane {
private Label label;
public Tile() {
this.label = new Label();
this.label.setStyle("-fx-font-size: 40px;");
this.getChildren().add(this.label);
this.setOnMouseClicked(event -> {
if (this.label.getText().isEmpty()) {
this.label.setText("X");
} else {
this.label.setText("");
}
});
}
}
```
4. 实现游戏逻辑
最后,我们需要添加游戏逻辑来检查是否有玩家赢得了比赛。您可以在Tile类中添加一个isX()方法来检查该Tile是否显示了X。
然后,在TicTacToe类中,您可以添加一个isGameOver()方法来检查是否有任何一方赢得了比赛。如果是这样,您可以显示一个弹出窗口,宣布获胜者,并要求玩家开始新游戏。
这里有一个完整的实现,包括isX()和isGameOver()方法:
```
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class TicTacToe extends Application {
private Tile[][] tiles = new Tile[3][3];
@Override
public void start(Stage primaryStage) {
GridPane gridPane = new GridPane();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
Tile tile = new Tile();
tiles[i][j] = tile;
gridPane.add(tile, i, j);
}
}
Scene scene = new Scene(gridPane, 300, 300);
primaryStage.setTitle("TicTacToe");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
private boolean isX(int row, int col) {
return tiles[row][col].getLabel().getText().equals("X");
}
private boolean isGameOver() {
// Check rows
for (int i = 0; i < 3; i++) {
if (!tiles[i][0].getLabel().getText().isEmpty() &&
tiles[i][0].getLabel().getText().equals(tiles[i][1].getLabel().getText()) &&
tiles[i][0].getLabel().getText().equals(tiles[i][2].getLabel().getText())) {
return true;
}
}
// Check columns
for (int i = 0; i < 3; i++) {
if (!tiles[0][i].getLabel().getText().isEmpty() &&
tiles[0][i].getLabel().getText().equals(tiles[1][i].getLabel().getText()) &&
tiles[0][i].getLabel().getText().equals(tiles[2][i].getLabel().getText())) {
return true;
}
}
// Check diagonal
if (!tiles[0][0].getLabel().getText().isEmpty() &&
tiles[0][0].getLabel().getText().equals(tiles[1][1].getLabel().getText()) &&
tiles[0][0].getLabel().getText().equals(tiles[2][2].getLabel().getText())) {
return true;
}
// Check reverse diagonal
if (!tiles[0][2].getLabel().getText().isEmpty() &&
tiles[0][2].getLabel().getText().equals(tiles[1][1].getLabel().getText()) &&
tiles[0][2].getLabel().getText().equals(tiles[2][0].getLabel().getText())) {
return true;
}
return false;
}
private void showGameOverAlert(String winner) {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Game over");
alert.setHeaderText(winner + " wins!");
alert.setContentText("Do you want to play again?");
ButtonType playAgainButtonType = new ButtonType("Play again");
ButtonType exitButtonType = new ButtonType("Exit");
alert.getButtonTypes().setAll(playAgainButtonType, exitButtonType);
alert.showAndWait().ifPresent(buttonType -> {
if (buttonType == playAgainButtonType) {
resetGame();
} else {
System.exit(0);
}
});
}
private void resetGame() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
tiles[i][j].getLabel().setText("");
}
}
}
private class Tile extends StackPane {
private Label label;
public Tile() {
this.label = new Label();
this.label.setStyle("-fx-font-size: 40px;");
this.getChildren().add(this.label);
this.setOnMouseClicked(event -> {
if (this.label.getText().isEmpty()) {
this.label.setText("X");
if (isGameOver()) {
showGameOverAlert("X");
}
} else {
this.label.setText("O");
if (isGameOver()) {
showGameOverAlert("O");
}
}
});
}
public Label getLabel() {
return label;
}
}
}
```
希望这可以帮助您开始编写TicTacToe游戏!
阅读全文