diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Car.java b/src/main/java/ch/zhaw/pm2/racetrack/Car.java index 8e9255e..da73693 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Car.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Car.java @@ -3,14 +3,12 @@ package ch.zhaw.pm2.racetrack; import ch.zhaw.pm2.racetrack.given.CarSpecification; import ch.zhaw.pm2.racetrack.strategy.MoveStrategy; -import java.util.Vector; - /** * Class representing a car on the racetrack. * Uses {@link PositionVector} to store current position on the track grid and current velocity vector. - * Each car has an identifier character which represents the car on the race track board. + * Each car has an identifier character which represents the car on the racetrack board. * Also keeps the state, if the car is crashed (not active anymore). The state can not be changed back to uncrashed. - * The velocity is changed by providing an acelleration vector. + * The velocity is changed by providing an acceleration vector. * The car is able to calculate the endpoint of its next position and on request moves to it. */ public class Car implements CarSpecification { @@ -46,7 +44,8 @@ public class Car implements CarSpecification { /** * Constructor for class Car - * @param id unique Car identification + * + * @param id unique Car identification * @param position initial position of the Car */ public Car(char id, PositionVector position) { @@ -59,16 +58,16 @@ public class Car implements CarSpecification { * * @return id of the car. */ - public char getID(){ + public char getID() { return id; } public void increaseWinPoints() { - winPoints ++; + winPoints++; } public void deductWinPoints() { - winPoints --; + winPoints--; } public int getWinPoints() { @@ -80,9 +79,10 @@ public class Car implements CarSpecification { * * @return velocity current velocity of the car. */ - public PositionVector getVelocity(){ + public PositionVector getVelocity() { return velocity; } + /** * Set this Car position directly, regardless of current position and velocity. * This should only be used by the game controller in rare cases to set the crash or winning position. @@ -95,8 +95,7 @@ public class Car implements CarSpecification { public void setPosition(final PositionVector position) { if (position.getX() < 0 || position.getY() < 0) { throw new IllegalArgumentException(); - } - else { + } else { this.position = position; } } @@ -109,7 +108,7 @@ public class Car implements CarSpecification { */ @Override public PositionVector nextPosition() { - return new PositionVector(position.getX() + velocity.getX(),position.getY() + velocity.getY()); + return new PositionVector(position.getX() + velocity.getX(), position.getY() + velocity.getY()); } /** @@ -123,11 +122,10 @@ public class Car implements CarSpecification { */ @Override public void accelerate(PositionVector.Direction acceleration) { - if(acceleration.vector.getX() < -1 || acceleration.vector.getX() > 1|| + if (acceleration.vector.getX() < -1 || acceleration.vector.getX() > 1 || acceleration.vector.getY() < -1 || acceleration.vector.getY() > 1) { throw new IllegalArgumentException(); - } - else { + } else { velocity = new PositionVector(velocity.getX() + acceleration.vector.getX(), velocity.getY() + acceleration.vector.getY()); } @@ -161,6 +159,7 @@ public class Car implements CarSpecification { /** * Set move strategy + * * @param moveStrategy Strategy to be implemented */ public void setMoveStrategy(MoveStrategy moveStrategy) { @@ -169,6 +168,7 @@ public class Car implements CarSpecification { /** * Get current move strategy + * * @return MoveStrategy */ public MoveStrategy getMoveStrategy() { diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Game.java b/src/main/java/ch/zhaw/pm2/racetrack/Game.java index 265cd15..1486983 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Game.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Game.java @@ -275,7 +275,6 @@ public class Game implements GameSpecification { } - private void calculateWinner(PositionVector start, PositionVector finish, int carIndex) { List path = calculatePath(start, finish); for (PositionVector point : path) { diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Main.java b/src/main/java/ch/zhaw/pm2/racetrack/Main.java index aec65bd..83bf6d8 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Main.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Main.java @@ -1,6 +1,5 @@ package ch.zhaw.pm2.racetrack; -import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; @@ -17,19 +16,17 @@ public class Main { optionsNewGame.add("exit"); optionsNewGame.add("new game"); String winnerText; - if(winner == null){ + if (winner == null) { winnerText = "There was no winner."; - } - else { + } else { winnerText = "The Winner was Car " + winner; } int selectedOption = userInterface.selectOption(winnerText + "\nStart new Game?", optionsNewGame); - if(selectedOption == 0) { + if (selectedOption == 0) { userInterface.quit("Thank you and goodbye\npress enter to close the application."); break; } - } - else { + } else { userInterface.quit("The initialisation of the game failed. Press enter to close the application."); break; } diff --git a/src/main/java/ch/zhaw/pm2/racetrack/PositionVector.java b/src/main/java/ch/zhaw/pm2/racetrack/PositionVector.java index 10209a3..4f3eafe 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/PositionVector.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/PositionVector.java @@ -7,8 +7,8 @@ package ch.zhaw.pm2.racetrack; * Created by mach 21.01.2020 */ public final class PositionVector { - private int x; // horizontal component (position / velocity) - private int y; // vertical component (position / velocity) + private final int x; // horizontal component (position / velocity) + private final int y; // vertical component (position / velocity) /** * Enum representing a direction on the track grid. diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Track.java b/src/main/java/ch/zhaw/pm2/racetrack/Track.java index e0a6ff4..79f5e70 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Track.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Track.java @@ -3,7 +3,10 @@ package ch.zhaw.pm2.racetrack; import ch.zhaw.pm2.racetrack.given.ConfigSpecification; import ch.zhaw.pm2.racetrack.given.TrackSpecification; -import java.io.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Scanner; @@ -57,8 +60,8 @@ import java.util.Scanner; public class Track implements TrackSpecification { public static final char CRASH_INDICATOR = 'X'; - private List track; - private List cars; + private final List track; + private final List cars; private final List finishLine; private ConfigSpecification.SpaceType finishTyp; @@ -85,13 +88,17 @@ public class Track implements TrackSpecification { * @throws FileNotFoundException if the FilePath is invalid. */ private void readFile(File trackFile) throws FileNotFoundException { - Scanner scanner = new Scanner(new FileInputStream(trackFile),"UTF-8"); + Scanner scanner = new Scanner(new FileInputStream(trackFile), StandardCharsets.UTF_8); while (scanner.hasNextLine()) { track.add(scanner.nextLine()); } } - + /** + * Goes through the track ArrayList and determines the locations of each cars and initializes them at the location. + * + * @throws InvalidTrackFormatException is thrown if a car is found more than once inside the track. + */ private void addCars() throws InvalidTrackFormatException { ConfigSpecification.SpaceType[] spaceTypes = ConfigSpecification.SpaceType.values(); List allSpaceTypesAsChar = new ArrayList<>(); @@ -101,23 +108,26 @@ public class Track implements TrackSpecification { allSpaceTypesAsChar.add(spaceType.getValue()); } - - for (int j = 0; j < track.size(); j++) { - String line = track.get(j); - for (int i = 0; i < line.length(); i++) { - char possibleCarChar = line.charAt(i); + for (int yPosition = 0; yPosition < track.size(); yPosition++) { + String line = track.get(yPosition); + for (int xPosition = 0; xPosition < line.length(); xPosition++) { + char possibleCarChar = line.charAt(xPosition); if (!allSpaceTypesAsChar.contains(possibleCarChar)) { if (usedSymbolForCar.contains(possibleCarChar)) { throw new InvalidTrackFormatException(); } usedSymbolForCar.add(possibleCarChar); - cars.add(new Car(possibleCarChar, new PositionVector(i, j))); + cars.add(new Car(possibleCarChar, new PositionVector(xPosition, yPosition))); } } } } - + //TODO: THIS + /** + * + * @throws InvalidTrackFormatException + */ private void findFinish() throws InvalidTrackFormatException { for (int i = 0; i < track.size(); i++) { String line = track.get(i); @@ -141,6 +151,12 @@ public class Track implements TrackSpecification { } } + /** + * Method to find the PositionVector of a chosen character + * + * @param symbol char that we are looking for on the track + * @return the PositionVector of the desired char + */ private PositionVector findChar(char symbol) { PositionVector vector = null; for (int i = 0; i < track.size(); i++) { @@ -154,37 +170,47 @@ public class Track implements TrackSpecification { return vector; } + /** + * Method that places a character at a chosen position + * + * @param positionVector position where char will be placed + * @param symbol char that should be placed at desired position + */ private void drawCharOnTrackIndicator(PositionVector positionVector, char symbol) { String line = track.get(positionVector.getY()); line = line.substring(0, positionVector.getX()) + symbol + line.substring(positionVector.getX() + 1); 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 PositionVectorNotValid if the PositionVector does not lie on the track. + */ private void isPositionVectorOnTrack(PositionVector positionVector) throws PositionVectorNotValid { - try{ + try { track.get(positionVector.getY()).charAt(positionVector.getX()); - }catch (IndexOutOfBoundsException e) { + } catch (IndexOutOfBoundsException e) { throw new PositionVectorNotValid(); } } - /** - * @return all Cars - */ - public List getCars() { - return cars; - } /** - * @return finishLine + * Method that returns the finishline as a List + * + * @return finishLine List */ public List getFinishLine() { return finishLine; } /** - * @return the track + * Returns the whole Track as List of Strings + * + * @return track as List of Strings */ public List getTrack() { return track; @@ -203,7 +229,7 @@ public class Track implements TrackSpecification { } /** - * This class does change the Position of the car only in the track. + * This Method does change the Position of the car inside the track object. * * @param carIndex of the current car */ @@ -213,8 +239,8 @@ public class Track implements TrackSpecification { drawCharOnTrackIndicator(carPositionVector, ConfigSpecification.SpaceType.TRACK.getValue()); //Redraw finishline if Car was on finish-line Position - for(PositionVector finishLinePositionVector : finishLine){ - if(finishLinePositionVector.equals(carPositionVector)){ + for (PositionVector finishLinePositionVector : finishLine) { + if (finishLinePositionVector.equals(carPositionVector)) { drawCharOnTrackIndicator(carPositionVector, finishTyp.getValue()); } } @@ -225,10 +251,10 @@ public class Track implements TrackSpecification { } /** - * This Method will check if the Car could crash at the specific position + * This Method will check if the Car would crash at the specific position * - * @param positionVector the position to check if the car could crash - * @return true if car would crash. Else false. + * @param positionVector the position to check if the car would crash + * @return true if crash otherwise false */ public boolean willCrashAtPosition(int carIndex, PositionVector positionVector) throws PositionVectorNotValid { isPositionVectorOnTrack(positionVector); //TODO: remove this line? Or Method? @@ -242,12 +268,12 @@ public class Track implements TrackSpecification { } /** - * This Method will make the Car Crash. In Track and in the Car Object + * This Method will mark the Car as crashed inside the track and the car Object. * - * @param carIndex representing current Car - * @param crashPositionVector where the Crash did happen + * @param carIndex of car that will be marked as crashed + * @param crashPositionVector of the location of the crash */ - public void carDoesCrash(int carIndex, PositionVector crashPositionVector) throws PositionVectorNotValid{ + public void carDoesCrash(int carIndex, PositionVector crashPositionVector) throws PositionVectorNotValid { isPositionVectorOnTrack(crashPositionVector); //TODO: remove this line? and Method? PositionVector currentCarPosition = getCarPos(carIndex); drawCharOnTrackIndicator(new PositionVector(currentCarPosition.getX(), currentCarPosition.getY()), ConfigSpecification.SpaceType.TRACK.getValue()); @@ -262,7 +288,7 @@ public class Track implements TrackSpecification { * If the location is outside the track bounds, it is considered a wall. * * @param position The coordinates of the position to examine - * @return The type of track position at the given location + * @return The type of space at the desired position */ @Override public Config.SpaceType getSpaceType(PositionVector position) { @@ -279,9 +305,9 @@ public class Track implements TrackSpecification { } /** - * Return the number of cars. + * Return the number of cars that are located in a track * - * @return Number of cars + * @return number of cars as int */ @Override public int getCarCount() { @@ -355,6 +381,13 @@ public class Track implements TrackSpecification { return currentSpace.getValue(); } + /** + * Determines all points that lie between the two position vectors including the endpoint VectorPosition using the Bresenham algorithm. + * + * @param startPosition PositionVector of the finish coordinate + * @param endPosition PositionVector of the start coordinate + * @return ArrayList containing PositionVectors of all position that are between the start and finish including the finish position. + */ public ArrayList calculatePointsOnPath(PositionVector startPosition, PositionVector endPosition) { ArrayList pathList = new ArrayList<>(); // Use Bresenham's algorithm to determine positions. diff --git a/src/main/java/ch/zhaw/pm2/racetrack/UserInterface.java b/src/main/java/ch/zhaw/pm2/racetrack/UserInterface.java index 96a8c04..b6c9e02 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/UserInterface.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/UserInterface.java @@ -6,13 +6,20 @@ import org.beryx.textio.TextTerminal; import java.util.List; +/** + * Class representing the Userinterface. + * Used to get inputs from users via textio. + * + * @author Roman Schenk + */ public class UserInterface { private final TextIO textIO; private final TextTerminal textTerminal; /** - * Opens a new Terminal Window and prints the welcome Text + * Opens a new Terminal Window and prints the welcome Text. + * * @param welcomeText The Text which will be printed after the windows is opened. */ public UserInterface(String welcomeText) { @@ -24,6 +31,7 @@ public class UserInterface { /** * Prints the given Text in textTerminal + * * @param text The Text which should be printed. */ public void printInformation(String text) { @@ -31,23 +39,25 @@ public class UserInterface { } /** - * asks the user to choose one of the options given. - * @param text Text which is printed befor the options are printed. Example: "Select Track file:" + * Method which asks the user to choose one of the options given. + * + * @param text Text which is printed before the options are printed. Example: "Select Track file:" * @param options List with the options which can be selected. * @return the list index of the selected option */ public int selectOption(String text, List options) { textTerminal.println(text + ":"); - for(int option = 0; option < options.size(); option ++) { - textTerminal.println(" " + (option + 1) + ": " + options.get(option)); + for (int option = 0; option < options.size(); option++) { + textTerminal.println(" " + (option + 1) + ": " + options.get(option)); } return textIO.newIntInputReader().withMinVal(1).withMaxVal(options.size()).read("Enter your choice: ") - 1; } /** - * gives information which player's turn it is and asks for the direction to accelerate + * Gives information which player is at turn and asks for the direction to accelerate or quit the game. + * * @param playingCarIndex the index of the player - * @param playingCarID the ID of the player + * @param playingCarID the ID of the player * @return the direction which is selected by the player. If null -> quit game */ public PositionVector.Direction selectDirection(int playingCarIndex, char playingCarID) { @@ -70,7 +80,8 @@ public class UserInterface { } /** - * returns the the associated direction Object + * Method which returns the associated direction Object. + * * @param number the number which was typed by the user * @return the associated direction. If null -> unknown number */ @@ -90,22 +101,21 @@ public class UserInterface { } /** - * prints the given Track in the terminal + * Method to print the given Track in the terminal + * * @param track the track which should be printed */ public void printTrack(Track track) { - textTerminal.println(track.toString()); + textTerminal.println(track.toString()); } /** - * Method to dispose the Textterminal - * @param text OUtput Text + * Method to dispose of the Textterminal + * + * @param text Output Text */ - public void quit(String text){ + public void quit(String text) { textIO.newStringInputReader().withMinLength(0).read(text); textTerminal.dispose(); } - - - } diff --git a/src/main/java/ch/zhaw/pm2/racetrack/strategy/MoveListStrategy.java b/src/main/java/ch/zhaw/pm2/racetrack/strategy/MoveListStrategy.java index 3de3f23..4966184 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/strategy/MoveListStrategy.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/strategy/MoveListStrategy.java @@ -5,13 +5,14 @@ import ch.zhaw.pm2.racetrack.PositionVector.Direction; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class MoveListStrategy implements MoveStrategy { - private List moveList; + private final List moveList; private int pointer; public MoveListStrategy(String path) throws FileNotFoundException{ @@ -21,7 +22,7 @@ public class MoveListStrategy implements MoveStrategy { } private void readFile(File trackFile) throws FileNotFoundException { - Scanner scanner = new Scanner(new FileInputStream(trackFile), "UTF-8"); + Scanner scanner = new Scanner(new FileInputStream(trackFile), StandardCharsets.UTF_8); Direction[] directions = Direction.values(); while (scanner.hasNextLine()) { String line = scanner.nextLine(); diff --git a/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFollowerMoveStrategy.java b/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFollowerMoveStrategy.java index 807ddc8..f1ab6a8 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFollowerMoveStrategy.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/strategy/PathFollowerMoveStrategy.java @@ -6,6 +6,7 @@ import ch.zhaw.pm2.racetrack.PositionVector.Direction; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Scanner; @@ -25,7 +26,7 @@ public class PathFollowerMoveStrategy implements MoveStrategy { /** * List of all points on the path. */ - private ArrayList pointList; + private final ArrayList pointList; /** * The index of the next point on the path. */ @@ -51,7 +52,7 @@ public class PathFollowerMoveStrategy implements MoveStrategy { * @throws FileNotFoundException If the file with the given path does not exist. */ public void readFile(File trackFile) throws FileNotFoundException { - Scanner scanner = new Scanner(new FileInputStream(trackFile), "UTF-8"); + Scanner scanner = new Scanner(new FileInputStream(trackFile), StandardCharsets.UTF_8); while (scanner.hasNextLine()) { String line = scanner.nextLine(); String[] coordinates = line.split("(\\(X:|, Y:|\\))"); diff --git a/src/main/java/ch/zhaw/pm2/racetrack/strategy/UserMoveStrategy.java b/src/main/java/ch/zhaw/pm2/racetrack/strategy/UserMoveStrategy.java index 06589ff..d0755aa 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/strategy/UserMoveStrategy.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/strategy/UserMoveStrategy.java @@ -7,9 +7,9 @@ import ch.zhaw.pm2.racetrack.UserInterface; * Let the user decide the next move. */ public class UserMoveStrategy implements MoveStrategy { - private UserInterface userInterface; - private int carIndex; - private char carID; + private final UserInterface userInterface; + private final int carIndex; + private final char carID; public UserMoveStrategy(UserInterface userInterface, int carIndex, char carID) { this.userInterface = userInterface; diff --git a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java index ebac56c..6a94e09 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/CarTest.java @@ -101,7 +101,7 @@ class CarTest { @Test void movement() { // add all possible directions in a List - List directions = Arrays.asList(PositionVector.Direction.values()); + PositionVector.Direction[] directions = PositionVector.Direction.values(); //position shouldn't be changed because velocity should be 0. car.move(); diff --git a/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java b/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java index 0c1dea3..908375c 100644 --- a/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java +++ b/src/test/java/ch/zhaw/pm2/racetrack/GameTest.java @@ -20,9 +20,9 @@ class GameTest { private Game game; private Track track; - private String TRACK_FILE_PATH = ".\\tracks\\challenge.txt"; - private int CAR_INDEX_ONE = 0; - private int CAR_INDEX_TWO = 1; + private final String TRACK_FILE_PATH = ".\\tracks\\challenge.txt"; + private final int CAR_INDEX_ONE = 0; + private final int CAR_INDEX_TWO = 1; /** * This nested Class tests if the game gets initiatet correctly