diff --git a/bin/de/deadlocker8/roadgame/logic/Board.class b/bin/de/deadlocker8/roadgame/logic/Board.class index b0cad02dd0c19c783c02615a51dc74bcff218e5a..d98dedf6e198e2131c10ee4bbacd6e4483d7784a 100644 Binary files a/bin/de/deadlocker8/roadgame/logic/Board.class and b/bin/de/deadlocker8/roadgame/logic/Board.class differ diff --git a/bin/de/deadlocker8/roadgame/ui/Controller$1.class b/bin/de/deadlocker8/roadgame/ui/Controller$1.class index fac104422568b470fecae66091041010efa41bb4..cfb79b3ebe672258cd982406cfe74a6e79ff7743 100644 Binary files a/bin/de/deadlocker8/roadgame/ui/Controller$1.class and b/bin/de/deadlocker8/roadgame/ui/Controller$1.class differ diff --git a/bin/de/deadlocker8/roadgame/ui/Controller$2.class b/bin/de/deadlocker8/roadgame/ui/Controller$2.class index e08927c5a6515dd52686bd09aa54fa43cf73acaf..34fbdfc7aefd4d041e5cb62f6dec9a90b3d2bf9a 100644 Binary files a/bin/de/deadlocker8/roadgame/ui/Controller$2.class and b/bin/de/deadlocker8/roadgame/ui/Controller$2.class differ diff --git a/bin/de/deadlocker8/roadgame/ui/Controller$3.class b/bin/de/deadlocker8/roadgame/ui/Controller$3.class new file mode 100644 index 0000000000000000000000000000000000000000..b026c7f86ee07594bf44fed040ce539d89a6215e Binary files /dev/null and b/bin/de/deadlocker8/roadgame/ui/Controller$3.class differ diff --git a/bin/de/deadlocker8/roadgame/ui/Controller.class b/bin/de/deadlocker8/roadgame/ui/Controller.class index 44de8aa4615b85fc86feaccaa7df2feaab9db619..6e265d0979e69ea2319d25d6a4e0a313b0dfb1d6 100644 Binary files a/bin/de/deadlocker8/roadgame/ui/Controller.class and b/bin/de/deadlocker8/roadgame/ui/Controller.class differ diff --git a/bin/de/deadlocker8/roadgame/ui/GUI.fxml b/bin/de/deadlocker8/roadgame/ui/GUI.fxml index 0b3219e3994897a4d2113727d45a2dd713e31408..c1748997b89dd8d49f474bf3d52bd3d8fa7c98c4 100644 --- a/bin/de/deadlocker8/roadgame/ui/GUI.fxml +++ b/bin/de/deadlocker8/roadgame/ui/GUI.fxml @@ -6,6 +6,7 @@ <?import javafx.scene.control.Menu?> <?import javafx.scene.control.MenuBar?> <?import javafx.scene.control.MenuItem?> +<?import javafx.scene.control.SeparatorMenuItem?> <?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.HBox?> <?import javafx.scene.layout.StackPane?> @@ -52,9 +53,12 @@ <menus> <Menu mnemonicParsing="false" text="Menu"> <items> - <MenuItem mnemonicParsing="false" onAction="#reset" text="Reset" /> - <MenuItem mnemonicParsing="false" onAction="#selectTilePack" text="Select Tilepack" /> - <MenuItem mnemonicParsing="false" onAction="#about" text="About" /> + <MenuItem fx:id="menuItemReset" mnemonicParsing="false" onAction="#reset" text="Reset" /> + <MenuItem fx:id="menuItemSelectTilePack" mnemonicParsing="false" onAction="#selectTilePack" text="Select Tilepack" /> + <SeparatorMenuItem mnemonicParsing="false" /> + <MenuItem fx:id="menuItemAutomaticTilePlacement" mnemonicParsing="false" onAction="#automaticTilePlacement" text="Automatic Tile Placement" /> + <SeparatorMenuItem mnemonicParsing="false" /> + <MenuItem fx:id="menuItemAbout" mnemonicParsing="false" onAction="#about" text="About" /> </items> </Menu> </menus> diff --git a/bin/de/deadlocker8/roadgame/ui/SelectTilePackController$2.class b/bin/de/deadlocker8/roadgame/ui/SelectTilePackController$2.class index 86b2a5605f9b12afb3e9ab47b5b0898dde48a07b..f95ba0457b8968ec53293ba9e86314b84ce9ccbb 100644 Binary files a/bin/de/deadlocker8/roadgame/ui/SelectTilePackController$2.class and b/bin/de/deadlocker8/roadgame/ui/SelectTilePackController$2.class differ diff --git a/bin/de/deadlocker8/roadgame/ui/SelectTilePackController.class b/bin/de/deadlocker8/roadgame/ui/SelectTilePackController.class index 6467685473a262965fdbfe36eff88916ae202b39..50b98332774f368733d82a9873f843b890d75d87 100644 Binary files a/bin/de/deadlocker8/roadgame/ui/SelectTilePackController.class and b/bin/de/deadlocker8/roadgame/ui/SelectTilePackController.class differ diff --git a/src/de/deadlocker8/roadgame/logic/Board.java b/src/de/deadlocker8/roadgame/logic/Board.java index 81e42e873469d309cff7b698e66095c5fa829cff..f95fe9dc96c6fb424827a40e02ace549dbff1bec 100644 --- a/src/de/deadlocker8/roadgame/logic/Board.java +++ b/src/de/deadlocker8/roadgame/logic/Board.java @@ -171,34 +171,32 @@ public class Board public boolean tileCanBePlaced(Tile tile) { - if(getPossibleLocations(tile).size() == 0) - { - return false; - } - - tile.rotateRight(); - if(getPossibleLocations(tile).size() == 0) - { - tile.rotateLeft(); - return false; - } - - tile.rotateRight(); - if(getPossibleLocations(tile).size() == 0) - { - tile.rotateLeft(); - tile.rotateLeft(); - return false; - } - - tile.rotateRight(); if(getPossibleLocations(tile).size() == 0) { tile.rotateRight(); - return false; + if(getPossibleLocations(tile).size() == 0) + { + tile.rotateRight(); + if(getPossibleLocations(tile).size() == 0) + { + tile.rotateRight(); + if(getPossibleLocations(tile).size() == 0) + { + tile.rotateRight(); + return false; + } + } + else + { + tile.rotateLeft(); + tile.rotateLeft(); + } + } + else + { + tile.rotateLeft(); + } } - - tile.rotateRight(); return true; } diff --git a/src/de/deadlocker8/roadgame/ui/Controller.java b/src/de/deadlocker8/roadgame/ui/Controller.java index 311f0aebcbb1195fe743a70148d5fc57d1dfe415..529a1177743ba7a3638b19e10b18b2a67741f40c 100644 --- a/src/de/deadlocker8/roadgame/ui/Controller.java +++ b/src/de/deadlocker8/roadgame/ui/Controller.java @@ -3,6 +3,7 @@ package de.deadlocker8.roadgame.ui; import java.io.IOException; import java.util.ArrayList; import java.util.Locale; +import java.util.Random; import java.util.ResourceBundle; import de.deadlocker8.roadgame.logic.Board; @@ -11,6 +12,7 @@ import de.deadlocker8.roadgame.logic.Game; import de.deadlocker8.roadgame.logic.Textures; import de.deadlocker8.roadgame.logic.Tile; import de.deadlocker8.roadgame.tilepacks.TilePack; +import javafx.application.Platform; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; @@ -21,6 +23,7 @@ import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.Button; import javafx.scene.control.Label; +import javafx.scene.control.MenuItem; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.input.MouseButton; @@ -30,8 +33,10 @@ import javafx.scene.layout.GridPane; import javafx.scene.layout.StackPane; import javafx.stage.Modality; import javafx.stage.Stage; +import javafx.stage.WindowEvent; import logger.LogLevel; import logger.Logger; +import tools.Worker; public class Controller { @@ -39,7 +44,11 @@ public class Controller @FXML private StackPane stackPaneCurrentTile; @FXML private Button buttonRotate; @FXML private Label labelTilesRemaining; - + @FXML private MenuItem menuItemReset; + @FXML private MenuItem menuItemSelectTilePack; + @FXML private MenuItem menuItemAutomaticTilePlacement; + @FXML private MenuItem menuItemAbout; + private Stage stage; private Image icon = new Image("de/deadlocker8/roadgame/resources/icon.png"); private final ResourceBundle bundle = ResourceBundle.getBundle("de/deadlocker8/roadgame/main/", Locale.GERMANY); @@ -48,30 +57,41 @@ public class Controller private Textures textures; private ZoomableScrollPane scrollPane; private StackPane stackPanePlaceHolder; - + private final int SLEEP_TIME = 100; + public void init(Stage stage) { this.stage = stage; + + this.stage.setOnCloseRequest(new EventHandler<WindowEvent>() + { + @Override + public void handle(WindowEvent event) + { + Worker.shutdown(); + System.exit(0); + } + }); textures = new Textures(); anchorPaneGame.setStyle("-fx-border-color: #333333; -fx-border-width: 2px"); stackPaneCurrentTile.setStyle("-fx-border-color: #333333; -fx-border-width: 2px"); - + labelTilesRemaining.setText("0"); - + grid = new GridPane(); - grid.setFocusTraversable(false); - - scrollPane = new ZoomableScrollPane(grid); - scrollPane.setPannable(true); + grid.setFocusTraversable(false); + + scrollPane = new ZoomableScrollPane(grid); + scrollPane.setPannable(true); scrollPane.setFitToHeight(true); - scrollPane.setFitToWidth(true); + scrollPane.setFitToWidth(true); anchorPaneGame.getChildren().add(scrollPane); AnchorPane.setTopAnchor(scrollPane, 0.0); AnchorPane.setRightAnchor(scrollPane, 0.0); AnchorPane.setBottomAnchor(scrollPane, 0.0); - AnchorPane.setLeftAnchor(scrollPane, 0.0); - + AnchorPane.setLeftAnchor(scrollPane, 0.0); + anchorPaneGame.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override @@ -80,10 +100,10 @@ public class Controller if(event.getButton().equals(MouseButton.SECONDARY)) { rotateRight(); - } + } } }); - + buttonRotate.setDisable(true); Label labelPlaceHolder = new Label("Please select Tilepack first."); labelPlaceHolder.setStyle("-fx-font-weight: bold; -fx-font-size: 16;"); @@ -160,7 +180,7 @@ public class Controller private void placeTile(int x, int y) { game.placeTile(game.getCurrentTile(), new Point2D(x, y)); - nextTile(); + nextTile(false); } public StackPane createStackPaneForTile(Tile tile, boolean possible, int x, int y) @@ -190,28 +210,28 @@ public class Controller else { stack.getChildren().add(new ImageView(textures.getImageGrass())); - - //North - stack.getChildren().add(getImageForEdge(tile.getN())); - //East + // North + stack.getChildren().add(getImageForEdge(tile.getN())); + + // East ImageView imageViewEast = getImageForEdge(tile.getE()); imageViewEast.setRotate(90); - stack.getChildren().add(imageViewEast); + stack.getChildren().add(imageViewEast); - //South + // South ImageView imageViewSouth = getImageForEdge(tile.getS()); imageViewSouth.setRotate(180); - stack.getChildren().add(imageViewSouth); + stack.getChildren().add(imageViewSouth); - //West + // West ImageView imageViewWest = getImageForEdge(tile.getW()); imageViewWest.setRotate(270); - stack.getChildren().add(imageViewWest); - - //Center + stack.getChildren().add(imageViewWest); + + // Center ImageView imageViewCenter = getImageForCenter(tile); - stack.getChildren().add(imageViewCenter); + stack.getChildren().add(imageViewCenter); } stack.setStyle("-fx-border-color: #cccccc; -fx-border-width: 1px;"); @@ -225,64 +245,64 @@ public class Controller case GRASS: return new ImageView(textures.getImageEmpty()); case ROAD: - return new ImageView(textures.getImageRoad()); + return new ImageView(textures.getImageRoad()); case CASTLE: - return new ImageView(textures.getImageCastle()); + return new ImageView(textures.getImageCastle()); default: return new ImageView(textures.getImageEmpty()); } } - + public ImageView getImageForCenter(Tile tile) - { + { switch(tile.getC()) { case EMPTY: return new ImageView(textures.getImageEmpty()); case CASTLE: - return new ImageView(textures.getImageCenterCastle()); + return new ImageView(textures.getImageCenterCastle()); case CASTLE_TRIANGLE: - ImageView iv = new ImageView(textures.getImageCenterCastleTriangle()); + ImageView iv = new ImageView(textures.getImageCenterCastleTriangle()); if(tile.getN().equals(EdgeType.CASTLE)) { if(tile.getW().equals(EdgeType.CASTLE)) { - //North and West + // North and West iv.setRotate(270); } } - + if(tile.getS().equals(EdgeType.CASTLE)) - { + { if(tile.getE().equals(EdgeType.CASTLE)) { - //South and East + // South and East iv.setRotate(90); } else { - //South and West + // South and West iv.setRotate(180); } - } + } return iv; case CHURCH: return new ImageView(textures.getImageCenterChurch()); case ROAD: - ImageView ivRoad = new ImageView(textures.getImageCenterRoad()); - + ImageView ivRoad = new ImageView(textures.getImageCenterRoad()); + if(tile.getE().equals(EdgeType.CASTLE)) - { + { ivRoad.setRotate(90); } - + if(tile.getS().equals(EdgeType.CASTLE)) - { + { ivRoad.setRotate(180); } - + if(tile.getW().equals(EdgeType.CASTLE)) - { + { ivRoad.setRotate(270); } return ivRoad; @@ -306,45 +326,48 @@ public class Controller return false; } - private void nextTile() + private void nextTile(boolean automaticPlacing) { Tile nextTile = game.getNextTile(); - if(nextTile == null) - { + if(nextTile == null) + { game.setCurrentTile(null); - stackPaneCurrentTile.getChildren().clear(); + stackPaneCurrentTile.getChildren().clear(); updateGrid(game.getBoard(), null); return; } - + game.setCurrentTile(nextTile); - + if(game.tileCanBePlaced(game.getCurrentTile())) { stackPaneCurrentTile.getChildren().clear(); stackPaneCurrentTile.getChildren().add(createStackPaneForTile(game.getCurrentTile(), false, 0, 0)); - + labelTilesRemaining.setText(String.valueOf(game.getBoard().getTilePack().getNumberOfTiles())); - updateGrid(game.getBoard(), game.getPossibleLocations(game.getCurrentTile())); - } + updateGrid(game.getBoard(), game.getPossibleLocations(game.getCurrentTile())); + } else { - Alert alert = new Alert(AlertType.INFORMATION); - alert.setTitle("Tile skipped"); - alert.setHeaderText(""); - alert.setContentText("The following tile has been skipped because it doesn't fit the current board:"); - Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow(); - alert.getDialogPane().setExpandableContent(createStackPaneForTile(game.getCurrentTile(), false, 0, 0)); - alert.getDialogPane().setExpanded(true); - dialogStage.getIcons().add(icon); - dialogStage.centerOnScreen(); - alert.showAndWait(); - + if(!automaticPlacing) + { + Alert alert = new Alert(AlertType.INFORMATION); + alert.setTitle("Tile skipped"); + alert.setHeaderText(""); + alert.setContentText("The following tile has been skipped because it doesn't fit the current board:"); + Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow(); + alert.getDialogPane().setExpandableContent(createStackPaneForTile(game.getCurrentTile(), false, 0, 0)); + alert.getDialogPane().setExpanded(true); + dialogStage.getIcons().add(icon); + dialogStage.centerOnScreen(); + alert.showAndWait(); + } + labelTilesRemaining.setText(String.valueOf(game.getBoard().getTilePack().getNumberOfTiles())); - - nextTile(); - } + + nextTile(automaticPlacing); + } } public void rotateRight() @@ -354,16 +377,16 @@ public class Controller game.getCurrentTile().rotateRight(); stackPaneCurrentTile.getChildren().clear(); stackPaneCurrentTile.getChildren().add(createStackPaneForTile(game.getCurrentTile(), false, 0, 0)); - + updateGrid(game.getBoard(), game.getPossibleLocations(game.getCurrentTile())); } } - + public void reset() { init(stage); } - + public void selectTilePack() { try @@ -387,7 +410,7 @@ public class Controller Logger.log(LogLevel.ERROR, Logger.exceptionToString(io)); } } - + public void setTilePack(TilePack tilePack) { buttonRotate.setDisable(false); @@ -395,12 +418,107 @@ public class Controller { anchorPaneGame.getChildren().remove(stackPanePlaceHolder); } - + game = new Game(tilePack); - + updateGrid(game.getBoard(), null); - nextTile(); + nextTile(false); + } + + public void automaticTilePlacement() + { + if(game != null && game.getBoard() != null) + { + buttonRotate.setDisable(true); + menuItemReset.setDisable(true); + menuItemSelectTilePack.setDisable(true); + menuItemAutomaticTilePlacement.setDisable(true); + menuItemAbout.setDisable(true); + + Worker.runLater(() -> { + while(game.getCurrentTile() != null) + { + if(couldPlaceTileAutomatically()) + { + try + { + Thread.sleep(SLEEP_TIME); + } + catch(Exception e) + { + } + continue; + } + + game.getCurrentTile().rotateRight(); + if(couldPlaceTileAutomatically()) + { + try + { + Thread.sleep(SLEEP_TIME); + } + catch(Exception e) + { + } + continue; + } + + game.getCurrentTile().rotateRight(); + if(couldPlaceTileAutomatically()) + { + try + { + Thread.sleep(SLEEP_TIME); + } + catch(Exception e) + { + } + continue; + } + + game.getCurrentTile().rotateRight(); + if(couldPlaceTileAutomatically()) + { + try + { + Thread.sleep(SLEEP_TIME); + } + catch(Exception e) + { + } + continue; + } + } + + Platform.runLater(()->{ + buttonRotate.setDisable(false); + menuItemReset.setDisable(false); + menuItemSelectTilePack.setDisable(false); + menuItemAutomaticTilePlacement.setDisable(false); + menuItemAbout.setDisable(false); + }); + }); + } + } + + private boolean couldPlaceTileAutomatically() + { + ArrayList<Point2D> possibleLocations = game.getPossibleLocations(game.getCurrentTile()); + + if(possibleLocations.size() > 0) + { + Random random = new Random(); + int index = random.nextInt(possibleLocations.size()); + + Platform.runLater(() -> { + placeTile((int)possibleLocations.get(index).getX(), (int)possibleLocations.get(index).getY()); + nextTile(true); + }); + return true; + } + + return false; } public void about() diff --git a/src/de/deadlocker8/roadgame/ui/GUI.fxml b/src/de/deadlocker8/roadgame/ui/GUI.fxml index 0b3219e3994897a4d2113727d45a2dd713e31408..c1748997b89dd8d49f474bf3d52bd3d8fa7c98c4 100644 --- a/src/de/deadlocker8/roadgame/ui/GUI.fxml +++ b/src/de/deadlocker8/roadgame/ui/GUI.fxml @@ -6,6 +6,7 @@ <?import javafx.scene.control.Menu?> <?import javafx.scene.control.MenuBar?> <?import javafx.scene.control.MenuItem?> +<?import javafx.scene.control.SeparatorMenuItem?> <?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.HBox?> <?import javafx.scene.layout.StackPane?> @@ -52,9 +53,12 @@ <menus> <Menu mnemonicParsing="false" text="Menu"> <items> - <MenuItem mnemonicParsing="false" onAction="#reset" text="Reset" /> - <MenuItem mnemonicParsing="false" onAction="#selectTilePack" text="Select Tilepack" /> - <MenuItem mnemonicParsing="false" onAction="#about" text="About" /> + <MenuItem fx:id="menuItemReset" mnemonicParsing="false" onAction="#reset" text="Reset" /> + <MenuItem fx:id="menuItemSelectTilePack" mnemonicParsing="false" onAction="#selectTilePack" text="Select Tilepack" /> + <SeparatorMenuItem mnemonicParsing="false" /> + <MenuItem fx:id="menuItemAutomaticTilePlacement" mnemonicParsing="false" onAction="#automaticTilePlacement" text="Automatic Tile Placement" /> + <SeparatorMenuItem mnemonicParsing="false" /> + <MenuItem fx:id="menuItemAbout" mnemonicParsing="false" onAction="#about" text="About" /> </items> </Menu> </menus> diff --git a/src/de/deadlocker8/roadgame/ui/SelectTilePackController.java b/src/de/deadlocker8/roadgame/ui/SelectTilePackController.java index d64c4973371d2c73e89f5b566d0bd3e7b2b6b988..c48eee0760a78ee1c8e8968dea3d6489efaa1a47 100644 --- a/src/de/deadlocker8/roadgame/ui/SelectTilePackController.java +++ b/src/de/deadlocker8/roadgame/ui/SelectTilePackController.java @@ -113,8 +113,8 @@ public class SelectTilePackController { if(event.getButton().equals(MouseButton.PRIMARY)) { - controller.setTilePack(currentPack); stage.close(); + controller.setTilePack(currentPack); } } });