Skip to content
Snippets Groups Projects
Commit 55db5452 authored by Robert Goldmann's avatar Robert Goldmann
Browse files

initial commit

parents
Branches
Tags
No related merge requests found
Showing
with 605 additions and 0 deletions
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry combineaccessrules="false" kind="src" path="/_Tools"/>
<classpathentry kind="output" path="bin"/>
</classpath>
.project 0 → 100644
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>Mines</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.8
File added
File added
File added
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>
<AnchorPane fx:id="mainPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="650.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.mines.application.Controller">
<children>
<Button fx:id="buttonStart" layoutX="374.0" layoutY="48.0" mnemonicParsing="false" onAction="#buttonStart" text="Start">
<font>
<Font name="System Bold" size="14.0" />
</font>
</Button>
<MenuBar layoutX="-9.0" layoutY="2.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<menus>
<Menu mnemonicParsing="false" text="Menu">
<items>
<MenuItem mnemonicParsing="false" onAction="#openSettings" text="Settings" />
<MenuItem mnemonicParsing="false" onAction="#about" text="About" />
</items>
</Menu>
</menus>
</MenuBar>
</children>
</AnchorPane>
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Slider?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="310.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.mines.application.SettingsController">
<children>
<VBox layoutX="45.0" layoutY="40.0" prefHeight="246.0" prefWidth="511.0">
<children>
<HBox prefHeight="44.0" prefWidth="412.0">
<children>
<Label alignment="TOP_RIGHT" contentDisplay="TOP" prefHeight="20.0" prefWidth="150.0" text="Width:" textAlignment="RIGHT">
<font>
<Font name="System Bold" size="14.0" />
</font>
</Label>
<Slider fx:id="sliderWidth" blockIncrement="1.0" majorTickUnit="1.0" max="20.0" min="3.0" minorTickCount="0" prefHeight="44.0" prefWidth="230.0" showTickLabels="true" showTickMarks="true" snapToTicks="true">
<HBox.margin>
<Insets left="50.0" />
</HBox.margin>
</Slider>
</children>
</HBox>
<HBox prefHeight="44.0" prefWidth="412.0">
<children>
<Label alignment="TOP_RIGHT" contentDisplay="TOP" prefHeight="20.0" prefWidth="150.0" text="Height:">
<font>
<Font name="System Bold" size="14.0" />
</font>
</Label>
<Slider fx:id="sliderHeight" blockIncrement="1.0" majorTickUnit="1.0" max="20.0" min="3.0" minorTickCount="0" prefHeight="44.0" prefWidth="233.0" showTickLabels="true" showTickMarks="true" snapToTicks="true">
<HBox.margin>
<Insets left="50.0" />
</HBox.margin>
</Slider>
</children>
<VBox.margin>
<Insets top="25.0" />
</VBox.margin>
</HBox>
<HBox prefHeight="44.0" prefWidth="412.0">
<children>
<Label alignment="TOP_RIGHT" contentDisplay="TOP" prefHeight="20.0" prefWidth="150.0" text="Number of Mines:">
<font>
<Font name="System Bold" size="14.0" />
</font>
<HBox.margin>
<Insets />
</HBox.margin>
</Label>
<TextField fx:id="textfieldNumberOfBombs" prefHeight="25.0" prefWidth="175.0">
<HBox.margin>
<Insets left="50.0" />
</HBox.margin>
</TextField>
<Label fx:id="labelBombs" prefHeight="24.0" prefWidth="45.0" text="(1-255)">
<font>
<Font name="System Bold" size="13.0" />
</font>
<HBox.margin>
<Insets left="15.0" />
</HBox.margin>
</Label>
</children>
<VBox.margin>
<Insets top="25.0" />
</VBox.margin>
</HBox>
</children>
</VBox>
<Button layoutX="264.0" layoutY="253.0" mnemonicParsing="false" onAction="#save" text="Save">
<font>
<Font name="System Bold" size="12.0" />
</font>
</Button>
</children>
</AnchorPane>
File added
File added
File added
app.name=Minesweeper
version.code=1
version.name=1.0.0
version.date=24.06.16
\ No newline at end of file
bin/de/deadlocker8/mines/application/icon.png

8.67 KiB

File added
File added
File added
File added
package de.deadlocker8.mines.application;
import java.io.IOException;
import java.util.Locale;
import java.util.ResourceBundle;
import de.deadlocker8.mines.logic.Board;
import de.deadlocker8.mines.logic.Settings;
import de.deadlocker8.mines.logic.Tile;
import fontAwesome.FontIcon;
import fontAwesome.FontIconType;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.geometry.HPos;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.RowConstraints;
import javafx.scene.paint.Color;
import javafx.stage.Modality;
import javafx.stage.Stage;
public class Controller
{
@FXML AnchorPane mainPane;
@FXML Button buttonStart;
public Stage stage;
public Image icon = new Image("de/deadlocker8/mines/application/icon.png");
private final ResourceBundle bundle = ResourceBundle.getBundle("de/deadlocker8/mines/application/", Locale.GERMANY);
private Board board;
public Settings settings;
private GridPane grid;
public void setStage(Stage stage)
{
this.stage = stage;
}
public void init()
{
if(settings == null)
{
settings = new Settings(10, 10, 10);
}
}
public void buttonStart()
{
board = new Board(settings.getWidth(), settings.getHeight(), settings.getNumberOfBombs());
clearGrid();
setGrid();
}
private void clearGrid()
{
mainPane.getChildren().remove(grid);
}
private void setGrid()
{
grid = new GridPane();
double itemWidth = 750 / board.getWidth();
double itemHeight = 675 / board.getHeight();
for(int y = 0; y < board.getHeight(); y++)
{
for(int x = 0; x < board.getWidth(); x++)
{
final int row = y;
final int column = x;
Label currentLabel = new Label();
currentLabel.setAlignment(Pos.CENTER);
currentLabel.setPrefWidth(itemWidth);
currentLabel.setPrefHeight(itemHeight);
currentLabel.setStyle("-fx-background-color: lightgrey; -fx-border-width: 1; -fx-border-color: black;");
currentLabel.setOnMouseClicked(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent event)
{
if(!board.getTiles()[row][column].isRevealed())
{
if(event.getButton().equals(MouseButton.PRIMARY))
{
//open tile
if(board.getTiles()[row][column].isBomb())
{
//lose
clearGrid();
showGrid(row, column, false);
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Game Over");
alert.setHeaderText("");
alert.setContentText("You have lost");
alert.initOwner(stage);
Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow();
dialogStage.getIcons().add(icon);
alert.showAndWait();
}
else
{
//open tile
int numberOfNearBombs = board.getTiles()[row][column].getNumberOfNearBombs();
if(numberOfNearBombs == 0)
{
flood(row, column);
}
else
{
board.getTiles()[row][column].setRevealed(true);
openTile(currentLabel, numberOfNearBombs, true);
}
}
}
else if(event.getButton().equals(MouseButton.SECONDARY))
{
//toggle flag
if(board.getTiles()[row][column].isFlagged())
{
currentLabel.setGraphic(null);
board.getTiles()[row][column].setFlagged(false);
}
else
{
FontIcon iconFlag = new FontIcon(FontIconType.FLAG);
iconFlag.setColor(Color.RED);
iconFlag.setSize(18);
currentLabel.setGraphic(iconFlag);
board.getTiles()[row][column].setFlagged(true);
}
}
}
}
});
grid.add(currentLabel, x, y);
GridPane.setHalignment(currentLabel, HPos.CENTER);
}
ColumnConstraints columnConstraints = new ColumnConstraints();
columnConstraints.setPrefWidth(itemWidth);
columnConstraints.setMinWidth(itemWidth);
grid.getColumnConstraints().add(columnConstraints);
RowConstraints rowConstraints = new RowConstraints();
rowConstraints.setPrefHeight(itemHeight);
rowConstraints.setMinHeight(itemHeight);
grid.getRowConstraints().add(rowConstraints);
}
mainPane.getChildren().add(grid);
AnchorPane.setTopAnchor(grid, 100.0);
AnchorPane.setLeftAnchor(grid, 25.0);
AnchorPane.setRightAnchor(grid, 25.0);
AnchorPane.setBottomAnchor(grid, 25.0);
}
private void showGrid(int row, int column, boolean paintBombsGreen)
{
grid = new GridPane();
double itemWidth = 750 / board.getWidth();
double itemHeight = 675 / board.getHeight();
for(int y = 0; y < board.getHeight(); y++)
{
for(int x = 0; x < board.getWidth(); x++)
{
Label currentLabel = new Label();
if(board.getTiles()[y][x].isBomb())
{
FontIcon iconBomb = new FontIcon(FontIconType.BOMB);
currentLabel.setText("");
currentLabel.setGraphic(iconBomb);
currentLabel.setStyle("-fx-border-width: 1; -fx-border-color: black;");
if(paintBombsGreen)
{
currentLabel.setStyle("-fx-background-color: green; -fx-border-width: 1; -fx-border-color: black;");
}
else
{
if(y == row && x == column)
{
currentLabel.setStyle("-fx-background-color: red; -fx-border-width: 1; -fx-border-color: black;");
}
}
}
else
{
int numberOfNearBombs = board.getTiles()[y][x].getNumberOfNearBombs();
openTile(currentLabel, numberOfNearBombs, false);
}
currentLabel.setAlignment(Pos.CENTER);
currentLabel.setPrefWidth(itemWidth);
currentLabel.setPrefHeight(itemHeight);
grid.add(currentLabel, x, y);
GridPane.setHalignment(currentLabel, HPos.CENTER);
}
ColumnConstraints columnConstraints = new ColumnConstraints();
columnConstraints.setPrefWidth(itemWidth);
columnConstraints.setMinWidth(itemWidth);
grid.getColumnConstraints().add(columnConstraints);
RowConstraints rowConstraints = new RowConstraints();
rowConstraints.setPrefHeight(itemHeight);
rowConstraints.setMinHeight(itemHeight);
grid.getRowConstraints().add(rowConstraints);
}
mainPane.getChildren().add(grid);
AnchorPane.setTopAnchor(grid, 100.0);
AnchorPane.setLeftAnchor(grid, 25.0);
AnchorPane.setRightAnchor(grid, 25.0);
AnchorPane.setBottomAnchor(grid, 25.0);
}
public void openSettings()
{
try
{
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/de/deadlocker8/mines/application/Settings.fxml"));
Parent root = (Parent)fxmlLoader.load();
Stage newStage = new Stage();
newStage.setScene(new Scene(root, 600, 300));
newStage.setTitle("Settings");
newStage.initOwner(stage);
newStage.getIcons().add(icon);
SettingsController newController = fxmlLoader.getController();
newController.init(newStage, icon, this);
newStage.initModality(Modality.APPLICATION_MODAL);
newStage.setResizable(false);
newStage.showAndWait();
}
catch(IOException e1)
{
e1.printStackTrace();
}
}
private void openTile(Label currentLabel, int numberOfNearBombs, boolean checkWinning)
{
switch(numberOfNearBombs)
{
case 0:
currentLabel.setText(" ");
currentLabel.setStyle("-fx-background-color: transparent; -fx-border-width: 1; -fx-border-color: black;");
break;
case 1:
currentLabel.setText("1");
currentLabel.setStyle("-fx-font-size: 16; -fx-text-fill: blue; -fx-font-weight: bold; -fx-background-color: transparent; -fx-border-width: 1; -fx-border-color: black;");
break;
case 2:
currentLabel.setText("2");
currentLabel.setStyle("-fx-font-size: 16; -fx-text-fill: green; -fx-font-weight: bold; -fx-background-color: transparent; -fx-border-width: 1; -fx-border-color: black;");
break;
case 3:
currentLabel.setText("3");
currentLabel.setStyle("-fx-font-size: 16; -fx-text-fill: red; -fx-font-weight: bold; -fx-background-color: transparent; -fx-border-width: 1; -fx-border-color: black;");
break;
case 4:
currentLabel.setText("4");
currentLabel.setStyle("-fx-font-size: 16; -fx-text-fill: darkblue; -fx-font-weight: bold; -fx-background-color: transparent; -fx-border-width: 1; -fx-border-color: black;");
break;
case 5:
currentLabel.setText("5");
currentLabel.setStyle("-fx-font-size: 16; -fx-text-fill: darkred; -fx-font-weight: bold; -fx-background-color: transparent; -fx-border-width: 1; -fx-border-color: black;");
break;
default:
currentLabel.setText("" + numberOfNearBombs);
currentLabel.setStyle("-fx-font-size: 16; -fx-text-fill: darkred; -fx-font-weight: bold; -fx-background-color: transparent; -fx-border-width: 1; -fx-border-color: black;");
break;
}
if(checkWinning)
{
checkWinning();
}
}
private void flood(int row, int column)
{
if(row < 0 || row > board.getHeight() - 1)
{
return;
}
if(column < 0 || column > board.getWidth() - 1)
{
return;
}
Tile currentTile = board.getTiles()[row][column];
if(currentTile.isRevealed())
{
return;
}
if(currentTile.getNumberOfNearBombs() != 0)
{
if(currentTile.getNumberOfNearBombs() != -1)
{
currentTile.setRevealed(true);
openTile((Label)grid.getChildren().get((row * board.getWidth() + column)), currentTile.getNumberOfNearBombs(), true);
return;
}
else
{
return;
}
}
currentTile.setRevealed(true);
openTile((Label)grid.getChildren().get((row * board.getWidth() + column)), 0, true);
flood(row - 1, column);
flood(row + 1, column);
flood(row, column - 1);
flood(row, column + 1);
}
private void checkWinning()
{
if(board.getNumberofUnrevealedTiles() == settings.getNumberOfBombs())
{
clearGrid();
showGrid(0, 0, true);
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Victory!");
alert.setHeaderText("");
alert.setContentText("You successfully defused all mines");
alert.initOwner(stage);
Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow();
dialogStage.getIcons().add(icon);
alert.showAndWait();
}
}
public void about()
{
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("About " + bundle.getString("app.name"));
alert.setHeaderText(bundle.getString("app.name"));
alert.setContentText("Version: " + bundle.getString("version.name") + "\r\nDate: " + bundle.getString("version.date") + "\r\nAuthor: Robert Goldmann\r\n");
alert.initOwner(stage);
Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow();
dialogStage.getIcons().add(icon);
alert.showAndWait();
}
}
\ No newline at end of file
package de.deadlocker8.mines.application;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;
public class Main extends Application
{
@Override
public void start(Stage stage)
{
try
{
FXMLLoader loader = new FXMLLoader(getClass().getResource("/de/deadlocker8/mines/application/MainGUI.fxml"));
Parent root = (Parent)loader.load();
Scene scene = new Scene(root, 800, 800);
stage.setResizable(true);
stage.setTitle("Minesweeper");
stage.setScene(scene);
stage.setResizable(false);
Controller controller = (Controller)loader.getController();
controller.setStage(stage);
controller.init();
stage.getIcons().add(new Image("de/deadlocker8/mines/application/icon.png"));
stage.show();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
launch(args);
}
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>
<AnchorPane fx:id="mainPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="650.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.deadlocker8.mines.application.Controller">
<children>
<Button fx:id="buttonStart" layoutX="374.0" layoutY="48.0" mnemonicParsing="false" onAction="#buttonStart" text="Start">
<font>
<Font name="System Bold" size="14.0" />
</font>
</Button>
<MenuBar layoutX="-9.0" layoutY="2.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<menus>
<Menu mnemonicParsing="false" text="Menu">
<items>
<MenuItem mnemonicParsing="false" onAction="#openSettings" text="Settings" />
<MenuItem mnemonicParsing="false" onAction="#about" text="About" />
</items>
</Menu>
</menus>
</MenuBar>
</children>
</AnchorPane>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment