diff --git a/.gitignore b/.gitignore index 9dd832c..65d8b37 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,8 @@ /build .gradle /gameCache -JavaCheckers.jar \ No newline at end of file +JavaCheckers.jar +.classpath +.project +.settings/ +bin/ \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 3f27e90..3738f72 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ language: java dist: trusty jdk: - - oraclejdk8 + - oraclejdk14 script: - ./gradlew build diff --git a/README.md b/README.md index fde3ec4..bb9cdca 100644 --- a/README.md +++ b/README.md @@ -24,3 +24,12 @@ R and N keys - restart game ## Author Dawid "Sloenthran" Nogacz + + +## Running + +``` +gradle build + +gradle run +``` diff --git a/build.gradle b/build.gradle index 0aba1f6..06a99d7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,11 @@ plugins { - id 'java' + id 'application' + id 'org.openjfx.javafxplugin' version '0.0.9' + + // https://imperceptiblethoughts.com/shadow/getting-started/#default-java-groovy-tasks + id 'com.github.johnrengelman.shadow' version '6.1.0' + + id 'jacoco' } group 'pl.nogacz' @@ -12,7 +18,25 @@ repositories { } dependencies { - testCompile group: 'junit', name: 'junit', version: '4.12' + testImplementation group: 'junit', name: 'junit', version: '4.12' + implementation 'javax.xml.bind:jaxb-api:2.3.1' + + implementation 'commons-cli:commons-cli:1.4' + + implementation 'com.fasterxml.jackson.core:jackson-databind:2.6.6' + implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.11.3' + + implementation 'commons-io:commons-io:2.6' + + implementation 'org.apache.commons:commons-lang3:3.11' + + implementation 'com.h2database:h2:1.4.200' + + implementation 'org.slf4j:slf4j-log4j12:1.7.30' + + implementation 'org.apache.commons:commons-collections4:4.4' + + testImplementation 'org.mockito:mockito-core:2.22.0' } jar { @@ -21,4 +45,23 @@ jar { 'Main-Class': 'pl.nogacz.checkers.Checkers', ) } -} \ No newline at end of file +} + +mainClassName = 'pl.nogacz.checkers.Checkers' + +javafx { + version = "15.0.1" + modules = [ 'javafx.controls' ] +} + +test { + testLogging { + showStandardStreams = true + } + + finalizedBy jacocoTestReport +} + +jacocoTestReport { + dependsOn test +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 94336fc..62d4c05 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e7ab745..4d9ca16 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Sat May 18 21:40:07 CEST 2019 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-all.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index cccdd3d..fbd7c51 100755 --- a/gradlew +++ b/gradlew @@ -1,5 +1,21 @@ #!/usr/bin/env sh +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + ############################################################################## ## ## Gradle start up script for UN*X @@ -28,7 +44,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -66,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -109,10 +126,11 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath @@ -138,19 +156,19 @@ if $cygwin ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi @@ -159,14 +177,9 @@ save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index e95643d..a9f778a 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -13,8 +29,11 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -65,6 +84,7 @@ set CMD_LINE_ARGS=%* set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% diff --git a/src/main/java/pl/nogacz/checkers/Checkers.java b/src/main/java/pl/nogacz/checkers/Checkers.java index 0304c16..bc5a312 100644 --- a/src/main/java/pl/nogacz/checkers/Checkers.java +++ b/src/main/java/pl/nogacz/checkers/Checkers.java @@ -6,6 +6,7 @@ import javafx.stage.Stage; import pl.nogacz.checkers.application.Design; import pl.nogacz.checkers.board.Board; +import pl.nogacz.checkers.application.Menu; /** * @author Dawid Nogacz on 17.05.2019 @@ -28,5 +29,6 @@ public void start(Stage primaryStage) { primaryStage.setScene(scene); primaryStage.setResizable(false); primaryStage.show(); + Menu menu = new Menu(board); } } diff --git a/src/main/java/pl/nogacz/checkers/application/Menu.java b/src/main/java/pl/nogacz/checkers/application/Menu.java new file mode 100644 index 0000000..a86c3f4 --- /dev/null +++ b/src/main/java/pl/nogacz/checkers/application/Menu.java @@ -0,0 +1,80 @@ +package pl.nogacz.checkers.application; + +import pl.nogacz.checkers.board.Board; +import java.awt.Color; +import javax.swing.JFrame; +import javax.swing.JButton; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowEvent; + +public class Menu extends JFrame implements ActionListener { + private static final int WIDTH = 500; + private static final int HEIGHT = 500; + private Board startBoard; + private JButton startGameButton = new JButton(Board.Commands.START.name()); + private JButton quitButton = new JButton(Board.Commands.EXIT.name()); + private boolean menuOpen; + + public JButton getStartGameButton() { + return startGameButton; + } + + public void setStartGameButton(JButton startGameButton) { + this.startGameButton = startGameButton; + } + + public Board getStartBoard() { + return startBoard; + } + + public boolean isMenuOpen() { + return menuOpen; + } + + public void setStartBoard(Board startBoard) { + this.startBoard = startBoard; + } + + public JButton getquitButton() { + return quitButton; + } + + public void setQuitButton(JButton quitButton) { + this.quitButton = quitButton; + } + + public Menu(Board board) { + super("Menu"); + startBoard = board; + startBoard.setMenuActive(true); + menuOpen = true; + setSize(WIDTH, HEIGHT); + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + this.setUndecorated(true); + this.setBackground(new Color(102, 51, 0, 200)); + this.add(startGameButton); + this.add(quitButton); + startGameButton.setIcon(board.getImageIconForFileName("start-game.png")); + quitButton.setIcon(board.getImageIconForFileName("quit-game.png")); + startGameButton.setBounds(150, 125, 190, 50); + quitButton.setBounds(150, 300, 180, 50); + startGameButton.addActionListener(this); + quitButton.addActionListener(this); + setLocationRelativeTo(null); + setLayout(null); + setVisible(true); + } + + @Override + public void actionPerformed(ActionEvent actionEvent) { + String command = actionEvent.getActionCommand(); + if (command.equalsIgnoreCase(Board.Commands.START.name())) { + startBoard.setMenuActive(false); + menuOpen = false; + this.dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)); + } else if (command.equalsIgnoreCase(Board.Commands.EXIT.name())) { + System.exit(7777); + } + } +} \ No newline at end of file diff --git a/src/main/java/pl/nogacz/checkers/application/RestartGame.java b/src/main/java/pl/nogacz/checkers/application/RestartGame.java new file mode 100644 index 0000000..7949618 --- /dev/null +++ b/src/main/java/pl/nogacz/checkers/application/RestartGame.java @@ -0,0 +1,55 @@ +package pl.nogacz.checkers.application; + +import pl.nogacz.checkers.board.Board; +import pl.nogacz.checkers.board.Coordinates; +import pl.nogacz.checkers.pawns.Pawn; +import pl.nogacz.checkers.pawns.PawnClass; +import pl.nogacz.checkers.pawns.PawnColor; +import javafx.application.Platform; +import java.util.Map; + +public class RestartGame { + public static Design design; + public static Board board; + public Design testDesign; + public Board testBoard; + + public RestartGame() { + + } + + public RestartGame(Board board,Design design){ + this.design = design; + this.board = board; + this.testBoard = board; + this.testDesign = design; + } + + public static void restartGame() { + Platform.runLater(() -> { + for (Map.Entry entry : board.getBoard().entrySet()) { + design.removePawn(entry.getKey()); + } + board.getBoard().clear(); + for (int i = 1; i <= 7; i += 2) { + for (int j = 0; j <= 2; j += 2) { + board.getBoard().put(new Coordinates(i, j), new PawnClass(Pawn.PAWN, PawnColor.BLACK)); + } + } + for (int i = 0; i <= 6; i += 2) { + board.getBoard().put(new Coordinates(i, 1), new PawnClass(Pawn.PAWN, PawnColor.BLACK)); + } + for (int i = 0; i <= 6; i += 2) { + for (int j = 5; j <= 7; j += 2) { + board.getBoard().put(new Coordinates(i, j), new PawnClass(Pawn.PAWN, PawnColor.WHITE)); + } + } + for (int i = 1; i <= 7; i += 2) { + board.getBoard().put(new Coordinates(i, 6), new PawnClass(Pawn.PAWN, PawnColor.WHITE)); + } + for (Map.Entry entry : board.getBoard().entrySet()) { + design.addPawn(entry.getKey(), entry.getValue()); + } + }); + } +} diff --git a/src/main/java/pl/nogacz/checkers/board/Board.java b/src/main/java/pl/nogacz/checkers/board/Board.java index 81ecc71..23da34c 100644 --- a/src/main/java/pl/nogacz/checkers/board/Board.java +++ b/src/main/java/pl/nogacz/checkers/board/Board.java @@ -9,11 +9,19 @@ import pl.nogacz.checkers.application.Design; import pl.nogacz.checkers.application.Computer; import pl.nogacz.checkers.application.EndGame; +import pl.nogacz.checkers.application.RestartGame; import pl.nogacz.checkers.pawns.Pawn; import pl.nogacz.checkers.pawns.PawnClass; import pl.nogacz.checkers.pawns.PawnColor; import pl.nogacz.checkers.pawns.PawnMoves; - +import javax.swing.JFrame; +import javax.swing.JButton; +import javax.swing.ImageIcon; +import java.awt.Color; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowEvent; +import java.awt.event.WindowAdapter; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -35,7 +43,7 @@ public class Board { private boolean isGameEnd = false; private int roundWithoutKick = 0; - + private boolean isMenuActive = false; private boolean isComputerRound = false; private Computer computer = new Computer(); @@ -74,31 +82,35 @@ private void addStartPawn() { board.put(new Coordinates(4, 7), new PawnClass(Pawn.PAWN, PawnColor.WHITE)); board.put(new Coordinates(6, 7), new PawnClass(Pawn.PAWN, PawnColor.WHITE)); - for(Map.Entry entry : board.entrySet()) { + for (Map.Entry entry : board.entrySet()) { Design.addPawn(entry.getKey(), entry.getValue()); } } public void readMouseEvent(MouseEvent event) { - if(isComputerRound) { + if (isMenuActive) { + return; + } + if (isComputerRound) { return; } checkGameEnd(); - if(isGameEnd) { + if (isGameEnd) { return; } - Coordinates eventCoordinates = new Coordinates((int) ((event.getX() - 37) / 85), (int) ((event.getY() - 37) / 85)); + Coordinates eventCoordinates = new Coordinates((int) ((event.getX() - 37) / 85), + (int) ((event.getY() - 37) / 85)); - if(isSelected) { - if(selectedCoordinates.equals(eventCoordinates) && !newKick) { + if (isSelected) { + if (selectedCoordinates.equals(eventCoordinates) && !newKick) { unLightSelect(selectedCoordinates); selectedCoordinates = null; isSelected = false; - } else if(possibleMoves.contains(eventCoordinates)) { + } else if (possibleMoves.contains(eventCoordinates)) { roundWithoutKick++; unLightSelect(selectedCoordinates); @@ -107,12 +119,12 @@ public void readMouseEvent(MouseEvent event) { isSelected = false; computerMove(); - } else if(possibleKick.contains(eventCoordinates) && !isFieldNotNull(eventCoordinates)) { + } else if (possibleKick.contains(eventCoordinates) && !isFieldNotNull(eventCoordinates)) { roundWithoutKick = 0; unLightSelect(selectedCoordinates); - if(!kickPawn(selectedCoordinates, eventCoordinates)) { + if (!kickPawn(selectedCoordinates, eventCoordinates)) { isSelected = false; newKick = false; computerMove(); @@ -121,9 +133,10 @@ public void readMouseEvent(MouseEvent event) { selectedCoordinates = eventCoordinates; } } - } else if(eventCoordinates.isValid()) { - if(isFieldNotNull(eventCoordinates)) { - if(getPawn(eventCoordinates).getColor().isWhite() && isPossiblePawn(eventCoordinates, PawnColor.WHITE)) { + } else if (eventCoordinates.isValid()) { + if (isFieldNotNull(eventCoordinates)) { + if (getPawn(eventCoordinates).getColor().isWhite() + && isPossiblePawn(eventCoordinates, PawnColor.WHITE)) { isSelected = true; selectedCoordinates = eventCoordinates; lightSelect(eventCoordinates); @@ -133,15 +146,21 @@ public void readMouseEvent(MouseEvent event) { } public void readKeyboard(KeyEvent event) { - if(event.getCode().equals(KeyCode.R) || event.getCode().equals(KeyCode.N)) { - EndGame.restartApplication(); + if (event.getCode().equals(KeyCode.R) || event.getCode().equals(KeyCode.N)) { + RestartGame.restartGame(); + } + if (event.getCode().equals(KeyCode.ESCAPE) && !isMenuActive) { + isMenuActive = true; + Menu menu = new Menu(); } } private void computerMove() { checkGameEnd(); - - if(isGameEnd) { + if (isMenuActive) { + return; + } + if (isGameEnd) { return; } @@ -164,8 +183,8 @@ public void handle(WorkerStateEvent event) { Coordinates moveCoordinates = computer.chooseMove(selectedCoordinates); unLightSelect(selectedCoordinates); - if(computer.isKickedMove()) { - if(!kickPawn(selectedCoordinates, moveCoordinates)) { + if (computer.isKickedMove()) { + if (!kickPawn(selectedCoordinates, moveCoordinates)) { newKick = false; isComputerRound = false; selectedCoordinates = null; @@ -181,14 +200,13 @@ public void handle(WorkerStateEvent event) { selectedCoordinates = null; } - } }); isComputerRound = true; computer.getGameData(); - if(!newKick) { + if (!newKick) { selectedCoordinates = computer.choosePawn(); } @@ -200,17 +218,17 @@ public void handle(WorkerStateEvent event) { private boolean isPossiblePawn(Coordinates coordinates, PawnColor color) { Set possiblePawn = new HashSet<>(); - for(Map.Entry entry : board.entrySet()) { - if(entry.getValue().getColor() == color) { + for (Map.Entry entry : board.entrySet()) { + if (entry.getValue().getColor() == color) { PawnMoves pawnMoves = new PawnMoves(entry.getKey(), entry.getValue()); - if(pawnMoves.getPossibleKick().size() > 0) { + if (pawnMoves.getPossibleKick().size() > 0) { possiblePawn.add(entry.getKey()); } } } - if(possiblePawn.size() == 0 || possiblePawn.contains(coordinates)) { + if (possiblePawn.size() == 0 || possiblePawn.contains(coordinates)) { return true; } @@ -220,7 +238,7 @@ private boolean isPossiblePawn(Coordinates coordinates, PawnColor color) { private void movePawn(Coordinates oldCoordinates, Coordinates newCoordinates) { PawnClass pawn = getPawn(oldCoordinates); - if(possiblePromote.contains(newCoordinates)) { + if (possiblePromote.contains(newCoordinates)) { pawn = new PawnClass(Pawn.QUEEN, pawn.getColor()); } @@ -235,7 +253,7 @@ private void movePawn(Coordinates oldCoordinates, Coordinates newCoordinates) { private boolean kickPawn(Coordinates oldCoordinates, Coordinates newCoordinates) { PawnClass pawn = getPawn(oldCoordinates); - if(possiblePromote.contains(newCoordinates)) { + if (possiblePromote.contains(newCoordinates)) { pawn = new PawnClass(Pawn.QUEEN, pawn.getColor()); } @@ -251,7 +269,7 @@ private boolean kickPawn(Coordinates oldCoordinates, Coordinates newCoordinates) PawnMoves pawnMoves = new PawnMoves(newCoordinates, pawn); - if(pawnMoves.getPossibleKick().size() > 0) { + if (pawnMoves.getPossibleKick().size() > 0) { lightNewKick(newCoordinates); return true; } @@ -262,25 +280,25 @@ private boolean kickPawn(Coordinates oldCoordinates, Coordinates newCoordinates) private Coordinates getEnemyCoordinates(Coordinates coordinates) { Coordinates checkUpLeft = new Coordinates(coordinates.getX() - 1, coordinates.getY() - 1); - if(possibleKick.contains(checkUpLeft)) { + if (possibleKick.contains(checkUpLeft)) { return checkUpLeft; } Coordinates checkUpRight = new Coordinates(coordinates.getX() + 1, coordinates.getY() - 1); - if(possibleKick.contains(checkUpRight)) { + if (possibleKick.contains(checkUpRight)) { return checkUpRight; } Coordinates checkBottomLeft = new Coordinates(coordinates.getX() - 1, coordinates.getY() + 1); - if(possibleKick.contains(checkBottomLeft)) { + if (possibleKick.contains(checkBottomLeft)) { return checkBottomLeft; } Coordinates checkBottomRight = new Coordinates(coordinates.getX() + 1, coordinates.getY() + 1); - if(possibleKick.contains(checkBottomRight)) { + if (possibleKick.contains(checkBottomRight)) { return checkBottomRight; } @@ -294,7 +312,7 @@ private void lightSelect(Coordinates coordinates) { possibleKick = pawnMoves.getPossibleKick(); possiblePromote = pawnMoves.getPossiblePromote(); - if(possibleKick.size() > 0) { + if (possibleKick.size() > 0) { possibleMoves.clear(); } @@ -329,7 +347,7 @@ private void lightMove(Coordinates coordinates) { private void lightKick(Coordinates coordinates) { PawnClass pawn = getPawn(coordinates); - if(pawn == null) { + if (pawn == null) { lightMove(coordinates); } } @@ -354,7 +372,7 @@ private void unLightMove(Coordinates coordinates) { private void unLightKick(Coordinates coordinates) { PawnClass pawn = getPawn(coordinates); - if(pawn != null) { + if (pawn != null) { unLightPawn(coordinates); } else { unLightMove(coordinates); @@ -367,10 +385,10 @@ public void checkGameEnd() { int pawnWhiteCount = 0; int pawnBlackCount = 0; - for(Map.Entry entry : board.entrySet()) { + for (Map.Entry entry : board.entrySet()) { PawnMoves moves = new PawnMoves(entry.getKey(), entry.getValue()); - if(entry.getValue().getColor().isBlack()) { + if (entry.getValue().getColor().isBlack()) { pawnBlackCount++; possibleMovesBlack.addAll(moves.getPossibleKick()); possibleMovesBlack.addAll(moves.getPossibleMoves()); @@ -381,13 +399,13 @@ public void checkGameEnd() { } } - if(roundWithoutKick == 12) { + if (roundWithoutKick == 12) { isGameEnd = true; new EndGame("Draw. Maybe you try again?"); - } else if(possibleMovesWhite.size() == 0 || pawnWhiteCount <= 1) { + } else if (possibleMovesWhite.size() == 0 || pawnWhiteCount <= 1) { isGameEnd = true; new EndGame("You loss. Maybe you try again?"); - } else if(possibleMovesBlack.size() == 0 || pawnBlackCount <= 1) { + } else if (possibleMovesBlack.size() == 0 || pawnBlackCount <= 1) { isGameEnd = true; new EndGame("You win! Congratulations! :)"); } @@ -401,7 +419,80 @@ public static boolean isThisSameColor(Coordinates coordinates, PawnColor color) return getPawn(coordinates).getColor() == color; } + public static void setBoard(HashMap board) { + Board.board = board; + } + public static PawnClass getPawn(Coordinates coordinates) { return board.get(coordinates); } -} + + public void setMenuActive(boolean menuActive) { + isMenuActive = menuActive; + } + + public boolean isMenuActive() { + return isMenuActive; + } + + public ImageIcon getImageIconForFileName(String name) { + String fileString = this.getClass().getClassLoader().getResource(name).getFile(); + return new ImageIcon(fileString); + } + + public class Menu extends JFrame implements ActionListener { + public static final int WIDTH = 500; + public static final int HEIGHT = 500; + private JButton resumeButton = new JButton(Commands.RESUME.name()); + private JButton newGameButton = new JButton(Commands.NEW_GAME.name()); + private JButton quitButton = new JButton(Commands.EXIT.name()); + + public Menu() { + super("Menu"); + setSize(WIDTH, HEIGHT); + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + this.setUndecorated(true); + this.setBackground(new Color(102, 51, 0, 200)); + this.add(resumeButton); + this.add(newGameButton); + this.add(quitButton); + quitButton.setIcon(getImageIconForFileName("quit-game.png")); + resumeButton.setIcon(getImageIconForFileName("resume.png")); + newGameButton.setIcon(getImageIconForFileName("new-game.png")); + resumeButton.setBounds(150, 50, 180, 50); + newGameButton.setBounds(150, 200, 180, 50); + quitButton.setBounds(150, 350, 180, 50); + resumeButton.addActionListener(this); + newGameButton.addActionListener(this); + quitButton.addActionListener(this); + setLocationRelativeTo(null); + setLayout(null); + setVisible(true); + this.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + isMenuActive = false; + } + }); + } + + @Override + public void actionPerformed(ActionEvent actionEvent) { + String command = actionEvent.getActionCommand(); + if (command.equalsIgnoreCase(Commands.RESUME.name())) { + isMenuActive = false; + this.dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)); + } else if (command.equalsIgnoreCase(Commands.NEW_GAME.name())) { + RestartGame.restartGame(); + } else if (command.equalsIgnoreCase(Commands.EXIT.name())) { + System.exit(0); + } + } + } + + public enum Commands { + // Add your Command names here + // For use them as string call Commands.EXIT.name() or for another class + // Board.Commands.Resume.toString() + RESUME, EXIT, NEW_GAME, START; + } +} \ No newline at end of file diff --git a/src/main/resources/new-game.png b/src/main/resources/new-game.png new file mode 100644 index 0000000..4f618fc Binary files /dev/null and b/src/main/resources/new-game.png differ diff --git a/src/main/resources/quit-game.png b/src/main/resources/quit-game.png new file mode 100644 index 0000000..c532162 Binary files /dev/null and b/src/main/resources/quit-game.png differ diff --git a/src/main/resources/resume.png b/src/main/resources/resume.png new file mode 100644 index 0000000..d8c7fa5 Binary files /dev/null and b/src/main/resources/resume.png differ diff --git a/src/main/resources/start-game.png b/src/main/resources/start-game.png new file mode 100644 index 0000000..4c1c5d6 Binary files /dev/null and b/src/main/resources/start-game.png differ