game-client

Play TicTacToe and Reversi
Log | Files | Refs

TicTacToeMultiPlayerController.java (5495B)


      1 package nl.isygameclient.controllers.games.tictactoe;
      2 
      3 import com.jfoenix.controls.JFXButton;
      4 import com.jfoenix.controls.JFXComboBox;
      5 import java.io.IOException;
      6 import java.net.URL;
      7 import java.util.ArrayList;
      8 import java.util.ResourceBundle;
      9 
     10 import javafx.application.Platform;
     11 import javafx.event.ActionEvent;
     12 import javafx.fxml.FXML;
     13 import javafx.fxml.Initializable;
     14 import javafx.scene.control.Label;
     15 import javafx.scene.control.TextField;
     16 import javafx.scene.layout.GridPane;
     17 import nl.isygameclient.Window;
     18 import nl.isygameclient.controllers.games.GameController;
     19 import nl.isygameclient.models.Game;
     20 import nl.isygameclient.network.GameClient;
     21 import nl.isygameclient.network.GameType;
     22 import nl.isygameclient.network.Match;
     23 import nl.isygameclient.util.StageHandler;
     24 
     25 public class TicTacToeMultiPlayerController implements GameController,  Initializable, Runnable {
     26 	private final ArrayList<JFXButton> boardButtons = new ArrayList<>();
     27 	private final String[] players = { "X", "O" };
     28 	private Game game;
     29 
     30 	@FXML
     31 	private Label playingAgainstLabel;
     32 	@FXML
     33 	private TextField hostField;
     34 	@FXML
     35 	private TextField portField;
     36 	@FXML
     37 	private TextField nameField;
     38 	@FXML
     39 	private TextField opponentField;
     40 	@FXML
     41 	private JFXComboBox<String> playingAsCombo;
     42 	@FXML
     43 	private Label currentPlayer;
     44 	@FXML
     45 	private Label gameOverText;
     46 	@FXML
     47 	private GridPane grid;
     48 
     49 	private GameClient client;
     50 	private Match	   match;
     51 	private String	   playerSelf = "X", playerOther = "O";
     52 	private boolean	   running;
     53 
     54 	private Thread gameThread;
     55 
     56 	@Override
     57 	public void initialize(URL url, ResourceBundle resourceBundle) {
     58 		for (int i = 0; i < 3 * 3; i++) {
     59 			JFXButton button = new JFXButton();
     60 			button.setId(Integer.toString(i));
     61 			button.setMinSize(200.0, 200.0);
     62 			var styleClass = button.getStyleClass();
     63 			styleClass.add("ttt-button");
     64 			styleClass.add("display-large");
     65 			button.setOnAction((ActionEvent event) -> onMoveButtonClick(button));
     66 			boardButtons.set(i, button);
     67 			grid.add(button, i / 3, i % 3);
     68 		}
     69 
     70 		playingAsCombo.getItems().setAll(players);
     71 		playingAsCombo.getSelectionModel().selectFirst();
     72 
     73 		disableBoardButtons();
     74 		//		currentPlayer.setText();
     75 	}
     76 
     77 	public void run() {
     78 		running = true;
     79 		try {
     80 			client = new GameClient(hostField.getText(), Integer.parseInt(portField.getText()));
     81 			client.login(nameField.getText());
     82 
     83 			if (opponentField.getText().length() == 0)
     84 				match = client.match(GameType.TICTACTOE);
     85 			else
     86 				match = client.match(GameType.TICTACTOE, opponentField.getText());
     87 
     88 			while (running) {
     89 				match.update();
     90 
     91 				if (!match.isStarted())
     92 					continue;
     93 
     94 				// game.setCurrentPlayer(match.isYourTurn() ? playerSelf : playerOther);
     95 				// game.move(Integer.parseInt(moveMap.get("move")));
     96 				Platform.runLater(() -> {
     97 					playingAgainstLabel.setText(match.getOpponent());
     98 
     99 					if (match.isYourTurn()) {
    100 						currentPlayer.setText(playerSelf);
    101 						enableBoardButtons();
    102 					} else {
    103 						currentPlayer.setText(playerOther);
    104 						disableBoardButtons();
    105 					}
    106 					for (int i = 0; i < 3 * 3; i++) {
    107 						switch (match.getMove(i)) {
    108 							case -1 -> boardButtons.get(i).setText(playerOther);
    109 							case 0 -> boardButtons.get(i).setText("");
    110 							case 1 -> boardButtons.get(i).setText(playerSelf);
    111 						}
    112 					}
    113 				});
    114 
    115 				if (match.getOutcome() == null)
    116 					continue;
    117 
    118 				running = false;
    119 
    120 				Platform.runLater(() -> {
    121 					switch (match.getOutcome().type) {
    122 						case DRAW:
    123 							System.out.println("Draw!");
    124 							gameOverText.setText("Draw!");
    125 							gameOverText.setVisible(true);
    126 							break;
    127 						case LOSS:
    128 							System.out.printf("%s, Is the Winner!\n\n", playerOther);
    129 							gameOverText.setText(String.format("%s, is the Winner!\n\n", playerOther));
    130 							gameOverText.setVisible(true);
    131 							break;
    132 						case WIN:
    133 							System.out.printf("%s, Is the Winner!\n\n", playerSelf);
    134 							gameOverText.setText(String.format("%s, is the Winner!\n\n", playerSelf));
    135 							gameOverText.setVisible(true);
    136 						default:
    137 					}
    138 				});
    139 			}
    140 			match.abort();
    141 			client.close();
    142 		} catch (IOException e) {
    143 			e.printStackTrace();
    144 		}
    145 	}
    146 
    147 
    148 
    149 	private void onMoveButtonClick(JFXButton button) {
    150 		try {
    151 			// Move
    152 			int pos = Integer.parseInt(button.getId());
    153 			//			if (game.isMoveValid(pos))
    154 			match.move(pos);
    155 			//	currentPlayer.setText(playerOther);
    156 
    157 			//			updateBoard();
    158 			//			currentPlayer.setText(playerSelf);
    159 		} catch (Exception exc) {
    160 			throw new RuntimeException(exc);
    161 		}
    162 	}
    163 
    164 	private void disableBoardButtons() {
    165 		for (JFXButton button : boardButtons) {
    166 			button.setDisable(true);
    167 		}
    168 	}
    169 
    170 	private void enableBoardButtons() {
    171 		for (JFXButton button : boardButtons) {
    172 			button.setDisable(false);
    173 		}
    174 	}
    175 
    176 	@FXML
    177 	protected void onPlayingAsComboSelect() {
    178 		System.out.printf("Now playing As: %s\n", playingAsCombo.getValue());
    179 		switch (playingAsCombo.getValue()) {
    180 			case "X" -> {
    181 				playerSelf = "X";
    182 				playerOther = "O";
    183 			}
    184 			case "O" -> {
    185 				playerSelf = "O";
    186 				playerOther = "X";
    187 			}
    188 		}
    189 	}
    190 
    191 	@Override
    192 	public void onNewGameButtonClick(ActionEvent e) throws NumberFormatException, InterruptedException {
    193 		gameOverText.setVisible(false);
    194 
    195 		if (gameThread != null && running) {
    196 			running = false;
    197 			gameThread.join();
    198 		}
    199 		gameThread = new Thread(this);
    200 		gameThread.start();
    201 	}
    202 
    203 	@Override
    204 	public void onMainMenuButtonClick(ActionEvent e) {
    205 		StageHandler.get().changeSceneOfStage(Window.GAME,"/nl/isygameclient/views/games/tictactoe/TicTacToeMainMenu.fxml");
    206 	}
    207 }