diff --git a/Klassendiagramm.drawio b/Klassendiagramm.drawio index 99e08e5..987ce13 100644 --- a/Klassendiagramm.drawio +++ b/Klassendiagramm.drawio @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Game.java b/src/main/java/ch/zhaw/pm2/racetrack/Game.java index c8383df..4e8f8a8 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Game.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Game.java @@ -26,8 +26,11 @@ public class Game implements GameSpecification { this.userInterface = userInterface; } - - public boolean initPhase() throws InvalidTrackFormatException { + /** + * This method will initialize the game. Therefore it interacts with the user via UserInterface + * @return true if the initialization is completed. Returns false if there is an error. + */ + public boolean initPhase() { File folder = new File("tracks"); File[] listOfFiles = folder.listFiles(); if (listOfFiles.length > 0) { @@ -35,8 +38,17 @@ public class Game implements GameSpecification { for (File file : listOfFiles) { tracks.add(file.getName()); } + File selectedTrack = listOfFiles[userInterface.selectOption("Select Track file", tracks)]; - selectTrack(selectedTrack); + try { + selectTrack(selectedTrack); + } catch (FileNotFoundException e) { + userInterface.printInformation("There is an unexpected Error with the trackfile Path. Add trackfiles only to tracks path. Exit the Game and Fix the Problem"); + return false; + } catch (InvalidTrackFormatException e) { + userInterface.printInformation("There is an unexpected Error with the trackfile. Format does not match specifications! Exit the Game and Fix the Problem"); + return false; + } List moveStrategies = new ArrayList<>(); moveStrategies.add("Do not move Strategy"); moveStrategies.add("User Move Strategy"); @@ -64,7 +76,6 @@ public class Game implements GameSpecification { } catch (FileNotFoundException e) { userInterface.printInformation("There is no Move-List implemented. Choose another Strategy!"); } - //TODO: Backslash kompatibel für Linux break; case 3: filePath = ".\\follower\\" + selectedTrack.getName().split("\\.")[0] + "_points.txt"; @@ -90,17 +101,11 @@ public class Game implements GameSpecification { /** * The functionality was taken out of init to automate testing - * * @param selectedTrack */ - Track selectTrack(File selectedTrack) { - try { - track = new Track(selectedTrack); - return track; - } catch (FileNotFoundException | PositionVectorNotValid | InvalidTrackFormatException e) { - e.printStackTrace(); - } - return null; + Track selectTrack(File selectedTrack) throws InvalidTrackFormatException,FileNotFoundException { + track = new Track(selectedTrack); + return track; } /** @@ -202,9 +207,8 @@ public class Game implements GameSpecification { * for this turn */ @Override - public void doCarTurn(Direction acceleration) throws PositionVectorNotValid { + public void doCarTurn(Direction acceleration) { track.getCar(currentCarIndex).accelerate(acceleration); - PositionVector crashPosition = null; List positionList = calculatePath(track.getCarPos(currentCarIndex), track.getCar(currentCarIndex).nextPosition()); for (int i = 0; i < positionList.size(); i++) { @@ -230,7 +234,12 @@ public class Game implements GameSpecification { } } - public String gamePhase() throws PositionVectorNotValid { + /** + * This method implements the gameflow in a while loop. If there is a winner. The method will return its carid. + * + * @return the ID of the winning car return null if there is no winner. + */ + public String gamePhase() { while (carsMoving() && getWinner() == NO_WINNER) { userInterface.printTrack(track); Direction direction; @@ -284,7 +293,14 @@ public class Game implements GameSpecification { } - + /** + * This method will check if a car is passing the finishline. + * If the car is passing the finishline in the wrong direction, the car will lose a winpoint. + * If the car is passing the finishline in the correct direction, the car will gain a winpoint. + * @param start the startposition of the car + * @param finish the expected finishpositon of the car after the move + * @param carIndex of the current player. + */ private int calculateNewWinPoints(PositionVector start, PositionVector finish) { List path = calculatePath(start, finish); for (PositionVector point : path) { @@ -336,7 +352,7 @@ public class Game implements GameSpecification { * @return A boolean indicator if the car would crash with a WALL or another car. */ @Override - public boolean willCarCrash(int carIndex, PositionVector position) throws PositionVectorNotValid { + public boolean willCarCrash(int carIndex, PositionVector position) { return track.willCrashAtPosition(carIndex, position); } diff --git a/src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValidException.java b/src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValidException.java deleted file mode 100644 index e3d75b2..0000000 --- a/src/main/java/ch/zhaw/pm2/racetrack/PositionVectorNotValidException.java +++ /dev/null @@ -1,9 +0,0 @@ -package ch.zhaw.pm2.racetrack; - -public class PositionVectorNotValidException extends Throwable { - public PositionVectorNotValidException(String message) { - super(message); - } - - public PositionVectorNotValidException() {} -} diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Track.java b/src/main/java/ch/zhaw/pm2/racetrack/Track.java index 4cd8a29..56cc5f4 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Track.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Track.java @@ -182,22 +182,6 @@ public class Track implements TrackSpecification { track.remove(positionVector.getY()); track.add(positionVector.getY(), line); } - //TODO: check if this method is okay and needed - - /** - * Determines if a location is valid PositionVector inside the track - * - * @param positionVector of location that has to be checked - * @throws PositionVectorNotValidException if the PositionVector does not lie on the track. - */ - private void isPositionVectorOnTrack(PositionVector positionVector) throws PositionVectorNotValidException { - try { - track.get(positionVector.getY()).charAt(positionVector.getX()); - } catch (IndexOutOfBoundsException e) { - throw new PositionVectorNotValidException(); - } - } - /** * Method that returns the finishline as a List @@ -257,8 +241,7 @@ public class Track implements TrackSpecification { * @param positionVector the position to check if the car could crash * @return true if car would crash. Else false. */ - public boolean willCrashAtPosition(int carIndex, PositionVector positionVector) throws PositionVectorNotValidException { - isPositionVectorOnTrack(positionVector); //TODO: remove this line? Or Method? + public boolean willCrashAtPosition(int carIndex, PositionVector positionVector) { char charAtPosition = track.get(positionVector.getY()).charAt(positionVector.getX()); if (getCarId(carIndex) == charAtPosition) return false; return !(charAtPosition == ConfigSpecification.SpaceType.TRACK.value || @@ -274,8 +257,7 @@ public class Track implements TrackSpecification { * @param carIndex representing current Car * @param crashPositionVector where the Crash did happen */ - public void carDoesCrash(int carIndex, PositionVector crashPositionVector) throws PositionVectorNotValidException { - isPositionVectorOnTrack(crashPositionVector); //TODO: remove this line? and Method? + public void carDoesCrash(int carIndex, PositionVector crashPositionVector) { PositionVector currentCarPosition = getCarPos(carIndex); drawCharOnTrackIndicator(new PositionVector(currentCarPosition.getX(), currentCarPosition.getY()), ConfigSpecification.SpaceType.TRACK.getValue()); Car car = cars.get(carIndex); diff --git a/src/main/java/ch/zhaw/pm2/racetrack/given/GameSpecification.java b/src/main/java/ch/zhaw/pm2/racetrack/given/GameSpecification.java index 4810ad1..3596335 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/given/GameSpecification.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/given/GameSpecification.java @@ -1,7 +1,6 @@ package ch.zhaw.pm2.racetrack.given; import ch.zhaw.pm2.racetrack.PositionVector; -import ch.zhaw.pm2.racetrack.PositionVectorNotValidException; import java.util.List; @@ -19,11 +18,11 @@ public interface GameSpecification { int getWinner(); - void doCarTurn(PositionVector.Direction acceleration) throws PositionVectorNotValidException; + void doCarTurn(PositionVector.Direction acceleration); void switchToNextActiveCar(); List calculatePath(PositionVector startPosition, PositionVector endPosition); - boolean willCarCrash(int carIndex, PositionVector position) throws PositionVectorNotValidException; + boolean willCarCrash(int carIndex, PositionVector position); } diff --git a/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java b/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java index a19e607..4d88811 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/TrackTest.java @@ -109,28 +109,19 @@ public class TrackTest { @Test @DisplayName("Will Car Crash") void willCarCrash() { - try { - //Car will Crash - Assertions.assertTrue(trackObj.willCrashAtPosition(0, new PositionVector(25, 21))); - //Car will not Crash and is on track - Assertions.assertFalse(trackObj.willCrashAtPosition(0, new PositionVector(7, 22))); - //Car will not Crash and is on finishLine - Assertions.assertFalse(trackObj.willCrashAtPosition(0, trackObj.getFinishLine().get(0))); - } catch (PositionVectorNotValidException positionVectorNotValidException) { - positionVectorNotValidException.printStackTrace(); - Assertions.fail("Test should not throw error"); - } + //Car will Crash + Assertions.assertTrue(trackObj.willCrashAtPosition(0, new PositionVector(25, 21))); + //Car will not Crash and is on track + Assertions.assertFalse(trackObj.willCrashAtPosition(0, new PositionVector(7, 22))); + //Car will not Crash and is on finishLine + Assertions.assertFalse(trackObj.willCrashAtPosition(0, trackObj.getFinishLine().get(0))); + } @Test @DisplayName("Make Car Crash") void makeCarCrash() { - try { - trackObj.carDoesCrash(0, new PositionVector(6, 22)); - } catch (PositionVectorNotValidException positionVectorNotValidException) { - positionVectorNotValidException.printStackTrace(); - Assertions.fail("Test should not throw exception"); - } + trackObj.carDoesCrash(0, new PositionVector(6, 22)); Assertions.assertEquals(Track.CRASH_INDICATOR, trackObj.getTrack().get(22).charAt(6)); Assertions.assertTrue(trackObj.getCar(0).isCrashed()); } @@ -140,7 +131,6 @@ public class TrackTest { @DisplayName("Negative TestCase") class negativeClass { File file; - @BeforeEach void setup() { file = new File(".\\tracks\\challenge.txt"); @@ -165,14 +155,5 @@ public class TrackTest { File testfile = new File(".\\src\\test\\InvalidTracks\\sameCar.txt"); Assertions.assertThrows(InvalidTrackFormatException.class, () -> new Track(testfile)); } - - @Test - @DisplayName("Invalid Position Vector used") - void invalidPositionVector() { - Assertions.assertThrows(PositionVectorNotValidException.class, () -> trackObj.willCrashAtPosition(0, new PositionVector(100, 200))); - Assertions.assertThrows(PositionVectorNotValidException.class, () -> trackObj.carDoesCrash(1,new PositionVector(200,100))); - } - } - }