Task 5 done hopefully
Signed-off-by: Immanuel Alvaro Bhirawa <u7280427@anu.edu.au>
This commit is contained in:
parent
809701c5f6
commit
37b09c5576
@ -22,7 +22,8 @@ import javafx.scene.text.FontWeight;
|
||||
import javafx.scene.text.Text;
|
||||
import javafx.scene.text.TextAlignment;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
import javafx.scene.shape.Polygon;
|
||||
import javafx.scene.paint.Paint;
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
||||
@ -126,36 +127,55 @@ public class Viewer extends Application {
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
|
||||
|
||||
void displayState(String stateString) {
|
||||
// When refreshing, it clears the whole thing and update it
|
||||
root.getChildren().clear();
|
||||
root.getChildren().add(controls);
|
||||
|
||||
// Intizialiation of the grid
|
||||
GridPane viewerGrid = new GridPane();
|
||||
String[] parts = stateString.split("; ?");
|
||||
int boardHeight = 0;
|
||||
int boardHeightPx = 0;
|
||||
int tileSize = 0;
|
||||
|
||||
for ( String part : parts) {
|
||||
String[] parseSplit = part.split(" ");
|
||||
String stateCases = parseSplit[0];
|
||||
|
||||
// Splitting of the states of the game as per the encoded string
|
||||
switch (stateCases) {
|
||||
|
||||
// Game Arrangement Statement
|
||||
case "a":
|
||||
|
||||
// Settting up the board height value and the tile size
|
||||
boardHeight = Integer.parseInt(parseSplit[1]);
|
||||
boardHeightPx = 575;
|
||||
boardHeightPx = 650;
|
||||
tileSize = boardHeightPx / boardHeight;
|
||||
viewerGrid.setPrefWidth(boardHeightPx);
|
||||
viewerGrid.setPrefHeight(boardHeightPx);
|
||||
|
||||
// row major order
|
||||
// Generating the water tiles ( the background water map )
|
||||
for(int i = 0; i < boardHeight; i++){
|
||||
for(int j = 0; j < boardHeight; j++){
|
||||
Rectangle boardMap = new Rectangle(boardHeightPx/boardHeight,
|
||||
boardHeightPx/boardHeight, Color.DARKBLUE);
|
||||
viewerGrid.add(boardMap, i, j);
|
||||
addBoardTile(viewerGrid, boardHeightPx/boardHeight,
|
||||
String.format("%s,%s", i, j), Color.BLUE);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// Current state statement
|
||||
case "c":
|
||||
|
||||
// Getting the player ID from the string
|
||||
int playerId = Integer.parseInt(parseSplit[1]);
|
||||
|
||||
// Getting the two mode of current state either Exploration
|
||||
// or settler
|
||||
String currentPhase = parseSplit[2];
|
||||
switch (currentPhase) {
|
||||
case "E":
|
||||
@ -165,6 +185,8 @@ public class Viewer extends Application {
|
||||
currentPhase = "Settler";
|
||||
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 +
|
||||
@ -177,196 +199,236 @@ public class Viewer extends Application {
|
||||
root.getChildren().add(currentStateText);
|
||||
currentStateText.setFill(Color.GREEN);
|
||||
break;
|
||||
|
||||
// Generating the Island tiles from the Island State Statement
|
||||
case "i":
|
||||
for(int i = 2; i < parseSplit.length; i++){
|
||||
Rectangle island = new Rectangle(boardHeightPx/boardHeight,
|
||||
boardHeightPx/boardHeight, Color.GREEN);
|
||||
String[] coords = parseSplit[i].split(",");
|
||||
int xCoord = Integer.parseInt(coords[0]);
|
||||
int yCoord = Integer.parseInt(coords[1]);
|
||||
viewerGrid.add(island, xCoord, yCoord);
|
||||
addBoardTile(viewerGrid, tileSize, parseSplit[i], Color.GREEN);
|
||||
}
|
||||
break;
|
||||
|
||||
// Generating the Stone Tiles from the Stone Statement
|
||||
case "s":
|
||||
for(int i = 1; i < parseSplit.length; i++){
|
||||
Rectangle theRock = new Rectangle(boardHeightPx/boardHeight
|
||||
- 15, boardHeightPx/boardHeight - 15, Color.GRAY);
|
||||
String[] coords = parseSplit[i].split(",");
|
||||
theRock.setTranslateX(5);
|
||||
viewerGrid.add(theRock, Integer.parseInt(coords[0]),
|
||||
Integer.parseInt(coords[1]));
|
||||
addTileToBoard(viewerGrid, tileSize, parseSplit[i], Color.GRAY);
|
||||
}
|
||||
break;
|
||||
|
||||
// Generating the Resources Tiles from the Resource Statement
|
||||
case "r":
|
||||
for(int i = 1; i < parseSplit.length; i++){
|
||||
switch(parseSplit[i]) {
|
||||
|
||||
// Generating Resource: Coconut Tiles
|
||||
case "C":
|
||||
i++;
|
||||
i++; // To Skip the "C" itself and go to the numbers in the string
|
||||
while(!parseSplit[i].equals("B")){
|
||||
String[] coords = parseSplit[i].split(",");
|
||||
Rectangle coconut = new Rectangle(boardHeightPx/boardHeight
|
||||
- 15, boardHeightPx/boardHeight - 15, Color.BROWN);
|
||||
coconut.setTranslateX(5);
|
||||
Label coconutLabel = new Label("C");
|
||||
coconutLabel.setTextFill(Color.WHITE);
|
||||
coconutLabel.setFont(Font.font("Sans Serif", 12));
|
||||
coconutLabel.setTranslateX(15);
|
||||
viewerGrid.add(coconut, Integer.parseInt(coords[0]),
|
||||
Integer.parseInt(coords[1]));
|
||||
viewerGrid.add(coconutLabel, Integer.parseInt(coords[0]),
|
||||
Integer.parseInt(coords[1]));
|
||||
i++;
|
||||
|
||||
// Tile generation
|
||||
addTileToBoard(viewerGrid, tileSize, parseSplit[i], Color.BROWN);
|
||||
|
||||
// Label for the tiles generation
|
||||
addLabelToTile(viewerGrid,tileSize,parseSplit[i], Color.WHITE, "C");
|
||||
i++; // To continue the iteration for the while loops
|
||||
}
|
||||
i--;
|
||||
i--; // So that i does not go straight to the coords after the letters instead
|
||||
// i stop at the letter "B"
|
||||
break;
|
||||
|
||||
// Generating Resource: Bamboo Tiles
|
||||
case "B":
|
||||
i++;
|
||||
i++; // To Skip the "B" itself and go to the numbers in the string
|
||||
while(!parseSplit[i].equals("W")){
|
||||
String[] coords = parseSplit[i].split(",");
|
||||
Rectangle bamboo = new Rectangle(boardHeightPx/boardHeight
|
||||
- 15, boardHeightPx/boardHeight - 15, Color.YELLOW);
|
||||
bamboo.setTranslateX(5);
|
||||
Label bambooLabel = new Label("B");
|
||||
bambooLabel.setTextFill(Color.BLACK);
|
||||
bambooLabel.setFont(Font.font("Sans Serif", 12));
|
||||
bambooLabel.setTranslateX(15);
|
||||
viewerGrid.add(bamboo, Integer.parseInt(coords[0]),
|
||||
Integer.parseInt(coords[1]));
|
||||
viewerGrid.add(bambooLabel, Integer.parseInt(coords[0]),
|
||||
Integer.parseInt(coords[1]));
|
||||
i++;
|
||||
|
||||
// Tile generation
|
||||
addTileToBoard(viewerGrid, tileSize, parseSplit[i], Color.YELLOW);
|
||||
|
||||
// Label for the tiles generation
|
||||
addLabelToTile(viewerGrid,tileSize,parseSplit[i], Color.BLACK, "B");
|
||||
i++; // To continue the iteration for the while loops
|
||||
}
|
||||
i--;
|
||||
i--; // So that i does not go straight to the coords after the letters instead
|
||||
// i stop at the letter "W"
|
||||
break;
|
||||
|
||||
// Generating Resource: Water tiles
|
||||
case "W":
|
||||
i++;
|
||||
i++; // To Skip the "W" itself and go to the numbers in the string
|
||||
while(!parseSplit[i].equals("P")){
|
||||
String[] coords = parseSplit[i].split(",");
|
||||
Rectangle water = new Rectangle(boardHeightPx/boardHeight
|
||||
- 15, boardHeightPx/boardHeight - 15, Color.CYAN);
|
||||
water.setTranslateX(5);
|
||||
Label waterLabel = new Label("W");
|
||||
waterLabel.setTextFill(Color.BLACK);
|
||||
waterLabel.setFont(Font.font("Sans Serif", 12));
|
||||
waterLabel.setTranslateX(15);
|
||||
viewerGrid.add(water, Integer.parseInt(coords[0]),
|
||||
Integer.parseInt(coords[1]));
|
||||
viewerGrid.add(waterLabel, Integer.parseInt(coords[0]),
|
||||
Integer.parseInt(coords[1]));
|
||||
i++;
|
||||
// Tile Generation
|
||||
addTileToBoard(viewerGrid,tileSize, parseSplit[i], Color.CYAN);
|
||||
|
||||
// Label for the tiles generation
|
||||
addLabelToTile(viewerGrid,tileSize,parseSplit[i], Color.BLACK, "W");
|
||||
i++; // To continue the iteration for the while loops
|
||||
}
|
||||
i--;
|
||||
i--; // So that i does not go straight to the coords after the letters instead
|
||||
// i stop at the letter "P"
|
||||
break;
|
||||
|
||||
// Generating Resource: Precious Stone tiles
|
||||
case "P":
|
||||
i++;
|
||||
i++; // To Skip the "P" itself and go to the numbers in the string
|
||||
while(!parseSplit[i].equals("S")){
|
||||
String[] coords = parseSplit[i].split(",");
|
||||
Rectangle precious = new Rectangle(boardHeightPx/boardHeight
|
||||
- 15, boardHeightPx/boardHeight - 15, Color.GOLD);
|
||||
precious.setTranslateX(5);
|
||||
Label preciousLabel = new Label("P");
|
||||
preciousLabel.setTextFill(Color.BLACK);
|
||||
preciousLabel.setFont(Font.font("Sans Serif", 12));
|
||||
preciousLabel.setTranslateX(15);
|
||||
viewerGrid.add(precious, Integer.parseInt(coords[0]),
|
||||
Integer.parseInt(coords[1]));
|
||||
viewerGrid.add(preciousLabel, Integer.parseInt(coords[0]),
|
||||
Integer.parseInt(coords[1]));
|
||||
i++;
|
||||
|
||||
// Tile Generation
|
||||
addTileToBoard(viewerGrid,tileSize,parseSplit[i], Color.GOLD);
|
||||
|
||||
// Label for the tiles generation
|
||||
addLabelToTile(viewerGrid, tileSize, parseSplit[i], Color.BLACK, "P");
|
||||
i++; // To continue the iteration for the while loops
|
||||
}
|
||||
i--;
|
||||
i--; // So that i does not go straight to the coords after the letters instead
|
||||
// i stop at the letter "S"
|
||||
break;
|
||||
//
|
||||
|
||||
// Generating Resource: Statuettes tiles
|
||||
case "S":
|
||||
i++;
|
||||
i++; // To Skip the "P" itself and go to the numbers in the string
|
||||
while(i < parseSplit.length){
|
||||
String[] coords = parseSplit[i].split(",");
|
||||
Rectangle precious = new Rectangle(boardHeightPx/boardHeight
|
||||
- 15, boardHeightPx/boardHeight - 15, Color.SILVER);
|
||||
precious.setTranslateX(5);
|
||||
Label preciousLabel = new Label("S");
|
||||
preciousLabel.setTextFill(Color.BLACK);
|
||||
preciousLabel.setFont(Font.font("Sans Serif", 12));
|
||||
preciousLabel.setTranslateX(15);
|
||||
viewerGrid.add(precious, Integer.parseInt(coords[0]),
|
||||
Integer.parseInt(coords[1]));
|
||||
viewerGrid.add(preciousLabel, Integer.parseInt(coords[0]),
|
||||
Integer.parseInt(coords[1]));
|
||||
i++;
|
||||
|
||||
// Tile Generation
|
||||
addTileToBoard(viewerGrid, tileSize, parseSplit[i], Color.SILVER);
|
||||
|
||||
// Label for the tiles generation
|
||||
addLabelToTile(viewerGrid, tileSize, parseSplit[i], Color.BLACK, "S");
|
||||
i++; // To continue the iteration for the while loops
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// Player Statement
|
||||
case "p":
|
||||
|
||||
// A container for the String that is printed at the end
|
||||
String container = "";
|
||||
container += "player " + parseSplit[1] + " with score: " +
|
||||
parseSplit[2] + ", coconuts: " + parseSplit[3] +
|
||||
", bambooo: " + parseSplit[4] + ", water: " +
|
||||
parseSplit[5] + ", precious stone: " + parseSplit[6] +
|
||||
", statuettes: " + parseSplit[7] + ", placed settlers at ";
|
||||
|
||||
// Setller tile generator
|
||||
int i = 9;
|
||||
int counter = 0;
|
||||
while(!parseSplit[i].equals("T")){
|
||||
counter++;
|
||||
String[] coords = parseSplit[i].split(",");
|
||||
Rectangle settlers = new Rectangle(boardHeightPx/boardHeight
|
||||
- 15, boardHeightPx/boardHeight - 15, Color.PINK);
|
||||
settlers.setTranslateX(5);
|
||||
Label settlerLabel = new Label("Settlers");
|
||||
settlerLabel.setTextFill(Color.BLACK);
|
||||
settlerLabel.setFont(Font.font("Sans Serif", 9));
|
||||
settlerLabel.setTranslateX(5);
|
||||
viewerGrid.add(settlers, Integer.parseInt(coords[0]),
|
||||
Integer.parseInt(coords[1]));
|
||||
viewerGrid.add(settlerLabel, Integer.parseInt(coords[0]),
|
||||
Integer.parseInt(coords[1]));
|
||||
|
||||
// Tile generator
|
||||
addTileToBoard(viewerGrid, tileSize, parseSplit[i], Color.PINK);
|
||||
|
||||
// Label generator
|
||||
addSmallLabelToTile(viewerGrid, tileSize, parseSplit[i], Color.BLACK, "Settlers");
|
||||
|
||||
// if there's more than 1 settler placed
|
||||
if(counter > 1) container += " and ";
|
||||
container += Integer.parseInt(coords[0]) + "," +
|
||||
Integer.parseInt(coords[1]);
|
||||
i++;
|
||||
i++; // To iterate the while loop
|
||||
}
|
||||
i++;
|
||||
i++; // To continue past the "T" keyword
|
||||
|
||||
// Village tile generator
|
||||
container += ", placed villages at ";
|
||||
int counterT = 0;
|
||||
while(i < parseSplit.length){
|
||||
counterT++;
|
||||
String[] coords = parseSplit[i].split(",");
|
||||
Rectangle village = new Rectangle(boardHeightPx/boardHeight
|
||||
- 15, boardHeightPx/boardHeight - 15, Color.LIGHTGOLDENRODYELLOW);
|
||||
village.setTranslateX(5);
|
||||
Label villageLabel = new Label("Village");
|
||||
villageLabel.setTextFill(Color.BLACK);
|
||||
villageLabel.setFont(Font.font("Sans Serif", 9));
|
||||
villageLabel.setTranslateX(5);
|
||||
viewerGrid.add(village, Integer.parseInt(coords[0]),
|
||||
Integer.parseInt(coords[1]));
|
||||
viewerGrid.add(villageLabel, Integer.parseInt(coords[0]),
|
||||
Integer.parseInt(coords[1]));
|
||||
|
||||
// Tile generator
|
||||
addTileToBoard(viewerGrid, tileSize, parseSplit[i], Color. LIGHTGOLDENRODYELLOW);
|
||||
|
||||
// Label generator
|
||||
addSmallLabelToTile(viewerGrid, tileSize, parseSplit[i], Color.BLACK, "Village");
|
||||
|
||||
// If there's more than 1 village placed
|
||||
if(counterT > 1) container += " and ";
|
||||
container += Integer.parseInt(coords[0]) + "," +
|
||||
Integer.parseInt(coords[1]);
|
||||
i++;
|
||||
}
|
||||
|
||||
// Adding the player Statement Text to the window
|
||||
Text playerStateText = new Text();
|
||||
playerStateText.setText(container);
|
||||
playerStateText.setFont(Font.font("Sans Serif",
|
||||
FontWeight.BOLD, 12));
|
||||
playerStateText.setX(200);
|
||||
playerStateText.setY(645);
|
||||
FontWeight.BOLD, 15));
|
||||
playerStateText.setX(125);
|
||||
playerStateText.setY(600);
|
||||
playerStateText.setTextAlignment(TextAlignment.CENTER);
|
||||
root.getChildren().add(playerStateText);
|
||||
playerStateText.setFill(Color.BLACK);
|
||||
// }
|
||||
}
|
||||
}
|
||||
viewerGrid.relocate((VIEWER_WIDTH/2-viewerGrid.getPrefWidth()/2), (VIEWER_HEIGHT/2-viewerGrid.getPrefHeight()/2));
|
||||
|
||||
// Relocate the grid to be more center
|
||||
viewerGrid.relocate((VIEWER_WIDTH/2-viewerGrid.getPrefWidth()/2), ((VIEWER_HEIGHT+100)/2-viewerGrid.getPrefHeight()/2));
|
||||
root.getChildren().add(viewerGrid);
|
||||
// FIXME Task 5
|
||||
}
|
||||
|
||||
void addBoardTile(GridPane board, int tileSize, String coordString, Color color) {
|
||||
if (coordString.equals("")) return;
|
||||
String[] coords = coordString.split(",");
|
||||
Hexagon hex = new Hexagon(tileSize, color);
|
||||
if (Integer.parseInt(coords[0]) % 2 == 0) hex.setTranslateX(tileSize/2);
|
||||
hex.setTranslateY(Integer.parseInt(coords[0]) * -0.25 * tileSize);
|
||||
board.add(hex, Integer.parseInt(coords[1]), Integer.parseInt(coords[0]));
|
||||
}
|
||||
|
||||
void addTileToBoard(GridPane board, int tileSize, String coordString, Color color) {
|
||||
int tileSize2 = tileSize;
|
||||
tileSize2 -= 15;
|
||||
if (coordString.equals("")) return;
|
||||
String[] coords = coordString.split(",");
|
||||
Hexagon hex = new Hexagon(tileSize2, color);
|
||||
if (Integer.parseInt(coords[0]) % 2 == 0) hex.setTranslateX(tileSize/2);
|
||||
hex.setTranslateY(Integer.parseInt(coords[0]) * -0.25 * tileSize);
|
||||
hex.setTranslateX(7 + hex.getTranslateX());
|
||||
board.add(hex, Integer.parseInt(coords[1]), Integer.parseInt(coords[0]));
|
||||
}
|
||||
|
||||
void addLabelToTile(GridPane board, int tileSize, String coordString, Color color, String labelName){
|
||||
if (coordString.equals("")) return;
|
||||
String[] coords = coordString.split(",");
|
||||
Label newLabel = new Label(labelName);
|
||||
newLabel.setTextFill(color);
|
||||
newLabel.setFont(Font.font("Sans Serif", 12));
|
||||
if (Integer.parseInt(coords[0]) % 2 == 0) newLabel.setTranslateX(tileSize/2);
|
||||
newLabel.setTranslateY(Integer.parseInt(coords[0]) * -0.25 * tileSize);
|
||||
newLabel.setTranslateX(20 + newLabel.getTranslateX());
|
||||
board.add(newLabel, Integer.parseInt(coords[1]), Integer.parseInt(coords[0]));
|
||||
}
|
||||
|
||||
void addSmallLabelToTile(GridPane board, int tileSize, String coordString, Color color, String labelName){
|
||||
if (coordString.equals("")) return;
|
||||
String[] coords = coordString.split(",");
|
||||
Label newLabel = new Label(labelName);
|
||||
newLabel.setTextFill(color);
|
||||
newLabel.setFont(Font.font("Sans Serif", 9));
|
||||
if (Integer.parseInt(coords[0]) % 2 == 0) newLabel.setTranslateX(tileSize/2);
|
||||
newLabel.setTranslateY(Integer.parseInt(coords[0]) * -0.25 * tileSize);
|
||||
newLabel.setTranslateX(9 + newLabel.getTranslateX());
|
||||
board.add(newLabel, Integer.parseInt(coords[1]), Integer.parseInt(coords[0]));
|
||||
}
|
||||
class Hexagon extends Polygon {
|
||||
public Hexagon(double side, Paint fill) {
|
||||
super(
|
||||
0.0, side / 2.0,
|
||||
side / 2.0, side / 4.0,
|
||||
side / 2.0, -side / 4.0,
|
||||
0.0, -side / 2.0,
|
||||
-side / 2.0, -side / 4.0,
|
||||
-side / 2.0, side / 4.0
|
||||
);
|
||||
this.setFill(fill);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a basic text field for input and a refresh button.
|
||||
|
Loading…
Reference in New Issue
Block a user