game: Added map selection and better UI
This commit is contained in:
parent
192570fb47
commit
7c355c8270
@ -7,6 +7,8 @@ import javafx.event.EventHandler;
|
||||
import javafx.scene.Group;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.CheckBox;
|
||||
import javafx.scene.control.ComboBox;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.layout.GridPane;
|
||||
import javafx.scene.layout.HBox;
|
||||
@ -36,6 +38,17 @@ public class Game extends Application {
|
||||
|
||||
Boolean AI;
|
||||
|
||||
private final String DEFAULT_GAME = "a 13 2; c 0 E; i 6 0,0 0,1 0,2 0,3 1,0 1,1 1,2 1,3 1,4 2,0 2,1; i 6 0,5 0,6 0,7 1,6 1,7 1,8 2,6 2,7 2,8 3,7 3,8; i 6 7,12 8,11 9,11 9,12 10,10 10,11 11,10 11,11 11,12 12,10 12,11; i 8 0,9 0,10 0,11 1,10 1,11 1,12 2,10 2,11 3,10 3,11 3,12 4,10 4,11 5,11 5,12; i 8 4,0 5,0 5,1 6,0 6,1 7,0 7,1 7,2 8,0 8,1 8,2 9,0 9,1 9,2; i 8 10,3 10,4 11,0 11,1 11,2 11,3 11,4 11,5 12,0 12,1 12,2 12,3 12,4 12,5; i 10 3,3 3,4 3,5 4,2 4,3 4,4 4,5 5,3 5,4 5,5 5,6 6,3 6,4 6,5 6,6 7,4 7,5 7,6 8,4 8,5; i 10 5,8 5,9 6,8 6,9 7,8 7,9 7,10 8,7 8,8 8,9 9,7 9,8 9,9 10,6 10,7 10,8 11,7 11,8 12,7 12,8; s 0,0 0,5 0,9 1,4 1,8 1,12 2,1 3,5 3,7 3,10 3,12 4,0 4,2 5,9 5,11 6,3 6,6 7,0 7,8 7,12 8,2 8,5 9,0 9,9 10,3 10,6 10,10 11,0 11,5 12,2 12,8 12,11; r C B W P S; p 0 0 0 0 0 0 0 S T; p 1 0 0 0 0 0 0 S T;";
|
||||
private final String WHEELS_GAME = "a 13 2; c 0 E; i 5 0,1 0,2 0,3 0,4 1,1 1,5 2,0 2,5 3,0 3,6 4,0 4,5 5,1 5,5 6,1 6,2 6,3 6,4; i 5 0,8 0,9 0,10 1,8 1,11 2,7 2,11 3,8 3,11 4,8 4,9 4,10; i 7 8,8 8,9 8,10 9,8 9,11 10,7 10,11 11,8 11,11 12,8 12,9 12,10; i 7 10,0 10,1 10,4 10,5 11,0 11,2 11,3 11,4 11,6 12,0 12,1 12,4 12,5; i 9 2,2 2,3 3,2 3,4 4,2 4,3; i 9 2,9; i 9 6,6 6,7 6,8 6,9 6,10 6,11 7,6 8,0 8,1 8,2 8,3 8,4 8,5; i 9 10,9; s 0,1 0,4 0,10 2,2 2,3 2,9 2,11 3,0 3,2 3,4 3,6 4,2 4,3 4,10 6,1 6,4 6,6 6,11 8,0 8,5 8,8 8,10 10,0 10,5 10,7 10,9 10,11 11,3 12,1 12,4 12,8 12,10; r C B W P S; p 0 0 0 0 0 0 0 S T; p 1 0 0 0 0 0 0 S T;";
|
||||
private final String FACE_GAME = "a 13 2; c 0 E; i 6 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 0,10 0,11 1,0 1,12 2,0 2,11 3,0 3,12 4,0 4,11 5,0 5,12 6,0 6,11 7,0 7,12 8,0 8,11 9,0 9,12 10,0 10,11 11,0 11,12 12,0 12,1 12,2 12,3 12,4 12,5 12,6 12,7 12,8 12,9 12,10 12,11; i 6 2,4 2,5 2,6 2,7; i 9 4,4 4,5 4,6 4,7; i 9 6,5 6,6 7,5 7,7 8,5 8,6; i 12 2,2 3,2 3,3 4,2 5,2 5,3 6,2 7,2 7,3; i 12 2,9 3,9 3,10 4,9 5,9 5,10 6,9 7,9 7,10; i 12 9,2 9,10 10,2 10,3 10,4 10,5 10,6 10,7 10,8 10,9; s 0,3 0,8 1,0 1,12 2,2 2,4 2,7 2,9 4,2 4,5 4,6 4,9 5,0 5,12 6,2 6,5 6,6 6,9 8,0 8,5 8,6 8,11 9,2 9,10 10,3 10,5 10,6 10,8 11,0 11,12 12,4 12,7; r C B W P S; p 0 0 0 0 0 0 0 S T; p 1 0 0 0 0 0 0 S T;";
|
||||
private final String SIDES_GAME = "a 7 2; c 0 E; i 4 0,0 0,1 0,2 0,3 1,0 1,1 1,2 1,3 2,0 2,1 2,2 2,3 3,0 3,1 3,2 3,3 4,0 4,1 4,2 4,3 5,0 5,1 5,2 5,3 6,0 6,1 6,2 6,3; i 20 0,5 1,5 1,6 2,5 3,5 3,6 4,5 5,5 5,6 6,5; s 0,0 0,1 0,2 0,3 1,1 1,2 1,3 1,5 1,6 2,0 2,1 2,2 2,3 3,0 3,1 3,2 3,3 3,5 3,6 4,0 4,1 4,2 4,3 5,1 5,2 5,3 5,5 5,6 6,0 6,1 6,2 6,3; r C B W P S; p 0 0 0 0 0 0 0 S T; p 1 0 0 0 0 0 0 S T;";
|
||||
private final String SPACE_INVADERS_GAME = "a 23 2; c 0 E; i 6 0,2 0,7 1,3 1,7 2,2 2,3 2,4 2,5 2,6 2,7 3,2 3,4 3,5 3,6 3,8 4,0 4,1 4,2 4,3 4,4 4,5 4,6 4,7 4,8 4,9 5,0 5,1 5,3 5,4 5,5 5,6 5,7 5,9 5,10 6,0 6,2 6,7 6,9 7,3 7,4 7,6 7,7; i 6 0,14 0,19 1,15 1,19 2,14 2,15 2,16 2,17 2,18 2,19 3,14 3,16 3,17 3,18 3,20 4,12 4,13 4,14 4,15 4,16 4,17 4,18 4,19 4,20 4,21 5,12 5,13 5,15 5,16 5,17 5,18 5,19 5,21 5,22 6,12 6,14 6,19 6,21 7,15 7,16 7,18 7,19; i 6 17,9 18,8 18,9 19,6 19,7 19,8 19,9 19,10 19,11 19,12 20,5 20,6 20,7 20,8 20,9 20,10 20,11 20,12 21,5 21,6 21,7 21,8 21,9 21,10 21,11 21,12 21,13 22,5 22,6 22,7 22,8 22,9 22,10 22,11 22,12; i 8 12,3 12,5 13,3 13,4 13,5 13,6 14,1 14,2 14,3 14,4 14,5 15,1 15,2 15,3 16,1 16,2; i 8 12,17 12,18 12,19 13,17 13,18 13,19 13,20 14,17 14,18 14,19 14,20 15,19 15,20 15,21 16,19 16,20; i 8 13,14 14,13 14,14 15,13 15,14 15,15 16,13 16,14; i 8 14,7 15,7 15,8 16,7; i 10 8,9 9,9 10,9 11,9; i 10 8,12 9,13 10,12 11,13; i 10 9,1 10,1 11,1 12,1; i 10 9,22 10,21 11,22 12,21; i 10 13,10 14,10 15,10; i 10 17,0 18,0 19,0 20,0; i 10 17,16 18,16 19,16 20,16; s 0,2 0,7 0,14 0,19 3,5 3,17 6,0 6,9 6,12 6,21 7,4 7,6 7,16 7,18 11,9 11,13 12,1 12,19 12,21 13,10 15,2 15,8 15,14 15,20 17,9 18,8 18,9 20,0 20,16 21,6 21,9 21,12; r C B W P S; p 0 0 0 0 0 0 0 S T; p 1 0 0 0 0 0 0 S T;";
|
||||
|
||||
// Store the selected map 0 = default, 1 = wheels, 2 = face, 3 = sides, 4 = space invaders
|
||||
private int game_selected = 0;
|
||||
|
||||
Boolean game_over;
|
||||
|
||||
// endregion
|
||||
|
||||
|
||||
@ -68,7 +81,31 @@ public class Game extends Application {
|
||||
* @param numPlayers the number of players
|
||||
*/
|
||||
private void newGame(int numPlayers) {
|
||||
currentGame = new State("a 13 2; c 0 E; i 6 0,0 0,1 0,2 0,3 1,0 1,1 1,2 1,3 1,4 2,0 2,1; i 6 0,5 0,6 0,7 1,6 1,7 1,8 2,6 2,7 2,8 3,7 3,8; i 6 7,12 8,11 9,11 9,12 10,10 10,11 11,10 11,11 11,12 12,10 12,11; i 8 0,9 0,10 0,11 1,10 1,11 1,12 2,10 2,11 3,10 3,11 3,12 4,10 4,11 5,11 5,12; i 8 4,0 5,0 5,1 6,0 6,1 7,0 7,1 7,2 8,0 8,1 8,2 9,0 9,1 9,2; i 8 10,3 10,4 11,0 11,1 11,2 11,3 11,4 11,5 12,0 12,1 12,2 12,3 12,4 12,5; i 10 3,3 3,4 3,5 4,2 4,3 4,4 4,5 5,3 5,4 5,5 5,6 6,3 6,4 6,5 6,6 7,4 7,5 7,6 8,4 8,5; i 10 5,8 5,9 6,8 6,9 7,8 7,9 7,10 8,7 8,8 8,9 9,7 9,8 9,9 10,6 10,7 10,8 11,7 11,8 12,7 12,8; s 0,0 0,5 0,9 1,4 1,8 1,12 2,1 3,5 3,7 3,10 3,12 4,0 4,2 5,9 5,11 6,3 6,6 7,0 7,8 7,12 8,2 8,5 9,0 9,9 10,3 10,6 10,10 11,0 11,5 12,2 12,8 12,11; r C B W P S; p 0 0 0 0 0 0 0 S T; p 1 0 0 0 0 0 0 S T;");
|
||||
game_over = false;
|
||||
|
||||
// Get selected game
|
||||
switch (game_selected){
|
||||
case 0:
|
||||
currentGame = new State(DEFAULT_GAME);
|
||||
break;
|
||||
case 1:
|
||||
currentGame = new State(WHEELS_GAME);
|
||||
break;
|
||||
case 2:
|
||||
currentGame = new State(FACE_GAME);
|
||||
break;
|
||||
case 3:
|
||||
currentGame = new State(SIDES_GAME);
|
||||
break;
|
||||
case 4:
|
||||
currentGame = new State(SPACE_INVADERS_GAME);
|
||||
break;
|
||||
default:
|
||||
currentGame = new State(DEFAULT_GAME);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
switch (numPlayers){
|
||||
case 3:
|
||||
currentGame.addPlayer();
|
||||
@ -81,6 +118,11 @@ public class Game extends Application {
|
||||
break;
|
||||
}
|
||||
currentGame.distributeResources();
|
||||
|
||||
// Send intro message
|
||||
message = "Welcome to Blue Lagoon\nYou have started a new game for " + numPlayers + " players.";
|
||||
if (AI) message += "\nAI is playing";
|
||||
sendMessage(message);
|
||||
refresh();
|
||||
|
||||
}
|
||||
@ -93,13 +135,13 @@ public class Game extends Application {
|
||||
* @param type the type of move 0 = place settler, 1 = place village
|
||||
*/
|
||||
void doMove(int type){
|
||||
if (game_over) return;
|
||||
if (selectedTile.equals(new Coord(-1,-1))){
|
||||
sendMessage("No tile selected");
|
||||
return;
|
||||
}
|
||||
if (currentGame.isPhaseOver()){
|
||||
sendMessage("Phase is over");
|
||||
return;
|
||||
}
|
||||
else {
|
||||
char typeC = 'S';
|
||||
@ -127,7 +169,7 @@ public class Game extends Application {
|
||||
}
|
||||
currentGame.nextPlayer();
|
||||
selectedTile = new Coord(-1,-1);
|
||||
if (AI) {
|
||||
if (AI && currentGame.getCurrentPlayerID() == 1) {
|
||||
String AI = doAIMove();
|
||||
sendMessage(message + "\n" + AI);
|
||||
}
|
||||
@ -146,12 +188,16 @@ public class Game extends Application {
|
||||
if (currentGame.getCurrentPhase() == 'E') {
|
||||
currentGame.cleanBoard();
|
||||
currentGame.distributeResources();
|
||||
if (AI && currentGame.getCurrentPlayerID() == 1){
|
||||
String AI = doAIMove();
|
||||
sendMessage("Next phase!\n" + AI);
|
||||
}
|
||||
}
|
||||
else {
|
||||
sendMessage("Game over");
|
||||
game_over = true;
|
||||
}
|
||||
}
|
||||
|
||||
refresh();
|
||||
}
|
||||
|
||||
@ -160,6 +206,7 @@ public class Game extends Application {
|
||||
* @return the message to be displayed
|
||||
*/
|
||||
String doAIMove(){
|
||||
if (game_over) return "GAME OVER";
|
||||
String message = "";
|
||||
if (!currentGame.isPhaseOver()){
|
||||
Player player = currentGame.getCurrentPlayer();
|
||||
@ -187,9 +234,15 @@ public class Game extends Application {
|
||||
if (currentGame.getCurrentPhase() == 'E') {
|
||||
currentGame.cleanBoard();
|
||||
currentGame.distributeResources();
|
||||
currentGame.nextPhase();
|
||||
if (AI && currentGame.getCurrentPlayerID() == 1){
|
||||
String AI = doAIMove();
|
||||
sendMessage("Next phase!\n" + AI);
|
||||
}
|
||||
}
|
||||
else {
|
||||
message = "Game over";
|
||||
game_over = true;
|
||||
}
|
||||
}
|
||||
refresh();
|
||||
@ -203,7 +256,7 @@ public class Game extends Application {
|
||||
* Send a message to the user without error
|
||||
* @param message the message to send
|
||||
*/
|
||||
void sendMessage(String message){
|
||||
private void sendMessage(String message){
|
||||
sendMessage(message, false);
|
||||
}
|
||||
|
||||
@ -212,13 +265,13 @@ public class Game extends Application {
|
||||
* @param message the message to send
|
||||
* @param error if the message is an error
|
||||
*/
|
||||
void sendMessage(String message, boolean error){
|
||||
private void sendMessage(String message, boolean error){
|
||||
this.message = message;
|
||||
messageError = error;
|
||||
refresh();
|
||||
}
|
||||
|
||||
void tileClick(String coordString){
|
||||
private void tileClick(String coordString){
|
||||
|
||||
int y = Integer.parseInt(coordString.split(",")[0]);
|
||||
int x = Integer.parseInt(coordString.split(",")[1]);
|
||||
@ -228,7 +281,7 @@ public class Game extends Application {
|
||||
refresh();
|
||||
}
|
||||
|
||||
void refresh() {
|
||||
private void refresh() {
|
||||
// When refreshing, it clears the whole thing and update it
|
||||
root.getChildren().clear();
|
||||
root.getChildren().add(controls);
|
||||
@ -280,19 +333,18 @@ public class Game extends Application {
|
||||
currentPhase = "Exploration";
|
||||
break;
|
||||
case 'S':
|
||||
currentPhase = "Settler";
|
||||
currentPhase = "Settlement";
|
||||
break;
|
||||
}
|
||||
|
||||
// Making the Current State Statement text on the window
|
||||
Text currentStateText = new Text();
|
||||
currentStateText.setText("The current player to move is player " +
|
||||
playerId + " in the " + currentPhase +
|
||||
" phase");
|
||||
playerId + "\nCurrent Phase: " + currentPhase);
|
||||
currentStateText.setFont(Font.font("Sans Serif",
|
||||
FontWeight.BOLD, 20));
|
||||
currentStateText.setX(WINDOW_WIDTH / boardHeight * 3.5);
|
||||
currentStateText.setY(50);
|
||||
currentStateText.setX(WINDOW_WIDTH / 2 + (WINDOW_WIDTH/5) - 175);
|
||||
currentStateText.setY(25);
|
||||
currentStateText.setTextAlignment(TextAlignment.CENTER);
|
||||
root.getChildren().add(currentStateText);
|
||||
currentStateText.setFill(Color.GREEN);
|
||||
@ -337,15 +389,14 @@ public class Game extends Application {
|
||||
// Adding the player Statement Text to the window
|
||||
Text playerStateText = new Text();
|
||||
playerStateText.setText(playerData);
|
||||
playerStateText.setFont(Font.font("Sans Serif",
|
||||
FontWeight.BOLD, 15));
|
||||
playerStateText.setFont(Font.font("Sans Serif", FontWeight.BOLD, 25));
|
||||
playerStateText.setX(0);
|
||||
playerStateText.setY(100);
|
||||
playerStateText.setFill(Color.BLACK);
|
||||
root.getChildren().add(playerStateText);
|
||||
|
||||
// Relocate the grid to be more center
|
||||
viewerGrid.relocate((WINDOW_WIDTH/2-viewerGrid.getPrefWidth()/2) + (WINDOW_WIDTH/10), ((WINDOW_HEIGHT+100)/2-viewerGrid.getPrefHeight()/2));
|
||||
viewerGrid.relocate((WINDOW_WIDTH/2-viewerGrid.getPrefWidth()/2) + (WINDOW_WIDTH/5), ((WINDOW_HEIGHT+100)/2-viewerGrid.getPrefHeight()/2));
|
||||
root.getChildren().add(viewerGrid);
|
||||
|
||||
// Add selected tile
|
||||
@ -363,25 +414,54 @@ public class Game extends Application {
|
||||
private void makeControls() {
|
||||
Label newLabel = new Label("New Game:");
|
||||
Button twoPlayer = new Button("2 Player");
|
||||
Button twoPlayerAI = new Button("2 Player with AI");
|
||||
Button threePlayer = new Button("3 Player");
|
||||
Button fourPlayer = new Button("4 Player");
|
||||
Button placeVillage = new Button("Place Village");
|
||||
Button placeSettler = new Button("Place Settler");
|
||||
Label mapLabel = new Label("Select Map:");
|
||||
Label playLabel = new Label("Place piece:");
|
||||
Button placeVillage = new Button("Village");
|
||||
Button placeSettler = new Button("Settler");
|
||||
CheckBox isAI = new CheckBox("AI");
|
||||
|
||||
// Store the selected map 0 = default, 1 = wheels, 2 = face, 3 = sides, 4 = space invaders
|
||||
ComboBox mapSelector = new ComboBox();
|
||||
mapSelector.getItems().add("Default");
|
||||
mapSelector.getItems().add("Wheels");
|
||||
mapSelector.getItems().add("Face");
|
||||
mapSelector.getItems().add("Sides");
|
||||
mapSelector.getItems().add("Space Invaders");
|
||||
mapSelector.setPromptText("Default");
|
||||
|
||||
// Set the map when the map is selected
|
||||
mapSelector.setOnAction(new EventHandler<ActionEvent>() {
|
||||
@Override
|
||||
public void handle(ActionEvent event) {
|
||||
switch (mapSelector.getValue().toString()){
|
||||
case "Default":
|
||||
game_selected = 0;
|
||||
break;
|
||||
case "Wheels":
|
||||
game_selected = 1;
|
||||
break;
|
||||
case "Face":
|
||||
game_selected = 2;
|
||||
break;
|
||||
case "Sides":
|
||||
game_selected = 3;
|
||||
break;
|
||||
case "Space Invaders":
|
||||
game_selected = 4;
|
||||
break;
|
||||
default:
|
||||
game_selected = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
twoPlayer.setOnAction(new EventHandler<ActionEvent>() {
|
||||
@Override
|
||||
public void handle(ActionEvent e) {
|
||||
AI = false;
|
||||
newGame(2);
|
||||
}
|
||||
});
|
||||
|
||||
twoPlayerAI.setOnAction(new EventHandler<ActionEvent>() {
|
||||
@Override
|
||||
public void handle(ActionEvent e) {
|
||||
AI = true;
|
||||
AI = isAI.isSelected();
|
||||
newGame(2);
|
||||
}
|
||||
});
|
||||
@ -389,14 +469,14 @@ public class Game extends Application {
|
||||
threePlayer.setOnAction(new EventHandler<ActionEvent>() {
|
||||
@Override
|
||||
public void handle(ActionEvent e) {
|
||||
AI = false;
|
||||
AI = isAI.isSelected();
|
||||
newGame(3);
|
||||
}
|
||||
});
|
||||
fourPlayer.setOnAction(new EventHandler<ActionEvent>() {
|
||||
@Override
|
||||
public void handle(ActionEvent e) {
|
||||
AI = false;
|
||||
AI = isAI.isSelected();
|
||||
newGame(4);
|
||||
}
|
||||
});
|
||||
@ -416,7 +496,7 @@ public class Game extends Application {
|
||||
});
|
||||
|
||||
HBox hb = new HBox();
|
||||
hb.getChildren().addAll(newLabel, twoPlayer,twoPlayerAI,threePlayer,fourPlayer,placeVillage,placeSettler);
|
||||
hb.getChildren().addAll(newLabel, twoPlayer,threePlayer,fourPlayer, isAI,mapLabel,mapSelector,playLabel,placeVillage,placeSettler);
|
||||
hb.setSpacing(10);
|
||||
hb.setLayoutX(50);
|
||||
hb.setLayoutY(WINDOW_HEIGHT - 50);
|
||||
@ -424,7 +504,7 @@ public class Game extends Application {
|
||||
}
|
||||
|
||||
// Generating the big board tiles such as the water tiles and the island tiles
|
||||
void addBoardTile(GridPane board, int tileSize, String coordString, Color color) {
|
||||
private void addBoardTile(GridPane board, int tileSize, String coordString, Color color) {
|
||||
// If the string empty, stop the function
|
||||
if (coordString.equals("")) return;
|
||||
|
||||
@ -446,7 +526,7 @@ public class Game extends Application {
|
||||
}
|
||||
|
||||
// Generating the small tiles such as resources, stones, etc
|
||||
void addStoneTileToBoard(GridPane board, int tileSize, String coordString, Color color) {
|
||||
private void addStoneTileToBoard(GridPane board, int tileSize, String coordString, Color color) {
|
||||
int tileSize2 = tileSize;
|
||||
tileSize2 -= 15;
|
||||
|
||||
@ -471,7 +551,7 @@ public class Game extends Application {
|
||||
}
|
||||
|
||||
// Adding labels to the resources tiles and stones tiles
|
||||
void addLabelToTile(GridPane board, int tileSize, String coordString, Color color, String labelName){
|
||||
private void addLabelToTile(GridPane board, int tileSize, String coordString, Color color, String labelName){
|
||||
// If the string empty, stop the function
|
||||
if (coordString.equals("")) return;
|
||||
String[] coords = coordString.split(",");
|
||||
@ -492,7 +572,7 @@ public class Game extends Application {
|
||||
tileClick(coordString);
|
||||
});
|
||||
}
|
||||
void addTileSelector(GridPane board, int tileSize, String coordString){
|
||||
private void addTileSelector(GridPane board, int tileSize, String coordString){
|
||||
// If the string empty, stop the function
|
||||
if (coordString.equals("")) return;
|
||||
String[] coords = coordString.split(",");
|
||||
|
Loading…
Reference in New Issue
Block a user