Strategy #31
			
				
			
		
		
		
	
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| 
						 | 
					@ -26,8 +26,11 @@ public class Game implements GameSpecification {
 | 
				
			||||||
        this.userInterface = userInterface;
 | 
					        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 folder = new File("tracks");
 | 
				
			||||||
        File[] listOfFiles = folder.listFiles();
 | 
					        File[] listOfFiles = folder.listFiles();
 | 
				
			||||||
        if (listOfFiles.length > 0) {
 | 
					        if (listOfFiles.length > 0) {
 | 
				
			||||||
| 
						 | 
					@ -35,8 +38,17 @@ public class Game implements GameSpecification {
 | 
				
			||||||
            for (File file : listOfFiles) {
 | 
					            for (File file : listOfFiles) {
 | 
				
			||||||
                tracks.add(file.getName());
 | 
					                tracks.add(file.getName());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            File selectedTrack = listOfFiles[userInterface.selectOption("Select Track file", tracks)];
 | 
					            File selectedTrack = listOfFiles[userInterface.selectOption("Select Track file", tracks)];
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
                selectTrack(selectedTrack);
 | 
					                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<String> moveStrategies = new ArrayList<>();
 | 
					            List<String> moveStrategies = new ArrayList<>();
 | 
				
			||||||
            moveStrategies.add("Do not move Strategy");
 | 
					            moveStrategies.add("Do not move Strategy");
 | 
				
			||||||
            moveStrategies.add("User Move Strategy");
 | 
					            moveStrategies.add("User Move Strategy");
 | 
				
			||||||
| 
						 | 
					@ -64,7 +76,6 @@ public class Game implements GameSpecification {
 | 
				
			||||||
                            } catch (FileNotFoundException e) {
 | 
					                            } catch (FileNotFoundException e) {
 | 
				
			||||||
                                userInterface.printInformation("There is no Move-List implemented. Choose another Strategy!");
 | 
					                                userInterface.printInformation("There is no Move-List implemented. Choose another Strategy!");
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            //TODO: Backslash kompatibel für Linux
 | 
					 | 
				
			||||||
                            break;
 | 
					                            break;
 | 
				
			||||||
                        case 3:
 | 
					                        case 3:
 | 
				
			||||||
                            filePath = ".\\follower\\" + selectedTrack.getName().split("\\.")[0] + "_points.txt";
 | 
					                            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
 | 
					     * The functionality was taken out of init to automate testing
 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param selectedTrack
 | 
					     * @param selectedTrack
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    Track selectTrack(File selectedTrack) {
 | 
					    Track selectTrack(File selectedTrack) throws InvalidTrackFormatException,FileNotFoundException {
 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
        track = new Track(selectedTrack);
 | 
					        track = new Track(selectedTrack);
 | 
				
			||||||
        return track;
 | 
					        return track;
 | 
				
			||||||
        } catch (FileNotFoundException | PositionVectorNotValid | InvalidTrackFormatException e) {
 | 
					 | 
				
			||||||
            e.printStackTrace();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return null;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
| 
						 | 
					@ -202,9 +207,8 @@ public class Game implements GameSpecification {
 | 
				
			||||||
     *                     for this turn
 | 
					     *                     for this turn
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void doCarTurn(Direction acceleration) throws PositionVectorNotValid {
 | 
					    public void doCarTurn(Direction acceleration) {
 | 
				
			||||||
        track.getCar(currentCarIndex).accelerate(acceleration);
 | 
					        track.getCar(currentCarIndex).accelerate(acceleration);
 | 
				
			||||||
 | 
					 | 
				
			||||||
        PositionVector crashPosition = null;
 | 
					        PositionVector crashPosition = null;
 | 
				
			||||||
        List<PositionVector> positionList = calculatePath(track.getCarPos(currentCarIndex), track.getCar(currentCarIndex).nextPosition());
 | 
					        List<PositionVector> positionList = calculatePath(track.getCarPos(currentCarIndex), track.getCar(currentCarIndex).nextPosition());
 | 
				
			||||||
        for (int i = 0; i < positionList.size(); i++) {
 | 
					        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) {
 | 
					        while (carsMoving() && getWinner() == NO_WINNER) {
 | 
				
			||||||
            userInterface.printTrack(track);
 | 
					            userInterface.printTrack(track);
 | 
				
			||||||
            Direction direction;
 | 
					            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) {
 | 
					    private int calculateNewWinPoints(PositionVector start, PositionVector finish) {
 | 
				
			||||||
        List<PositionVector> path = calculatePath(start, finish);
 | 
					        List<PositionVector> path = calculatePath(start, finish);
 | 
				
			||||||
        for (PositionVector point : path) {
 | 
					        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.
 | 
					     * @return A boolean indicator if the car would crash with a WALL or another car.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public boolean willCarCrash(int carIndex, PositionVector position) throws PositionVectorNotValid {
 | 
					    public boolean willCarCrash(int carIndex, PositionVector position) {
 | 
				
			||||||
        return track.willCrashAtPosition(carIndex, position);
 | 
					        return track.willCrashAtPosition(carIndex, position);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,9 +0,0 @@
 | 
				
			||||||
package ch.zhaw.pm2.racetrack;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class PositionVectorNotValidException extends Throwable {
 | 
					 | 
				
			||||||
    public PositionVectorNotValidException(String message) {
 | 
					 | 
				
			||||||
        super(message);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public PositionVectorNotValidException() {}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -182,22 +182,6 @@ public class Track implements TrackSpecification {
 | 
				
			||||||
        track.remove(positionVector.getY());
 | 
					        track.remove(positionVector.getY());
 | 
				
			||||||
        track.add(positionVector.getY(), line);
 | 
					        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
 | 
					     * 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
 | 
					     * @param positionVector the position to check if the car could crash
 | 
				
			||||||
     * @return true if car would crash. Else false.
 | 
					     * @return true if car would crash. Else false.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public boolean willCrashAtPosition(int carIndex, PositionVector positionVector) throws PositionVectorNotValidException {
 | 
					    public boolean willCrashAtPosition(int carIndex, PositionVector positionVector) {
 | 
				
			||||||
        isPositionVectorOnTrack(positionVector); //TODO: remove this line? Or Method?
 | 
					 | 
				
			||||||
        char charAtPosition = track.get(positionVector.getY()).charAt(positionVector.getX());
 | 
					        char charAtPosition = track.get(positionVector.getY()).charAt(positionVector.getX());
 | 
				
			||||||
        if (getCarId(carIndex) == charAtPosition) return false;
 | 
					        if (getCarId(carIndex) == charAtPosition) return false;
 | 
				
			||||||
        return !(charAtPosition == ConfigSpecification.SpaceType.TRACK.value ||
 | 
					        return !(charAtPosition == ConfigSpecification.SpaceType.TRACK.value ||
 | 
				
			||||||
| 
						 | 
					@ -274,8 +257,7 @@ public class Track implements TrackSpecification {
 | 
				
			||||||
     * @param carIndex            representing current Car
 | 
					     * @param carIndex            representing current Car
 | 
				
			||||||
     * @param crashPositionVector where the Crash did happen
 | 
					     * @param crashPositionVector where the Crash did happen
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public void carDoesCrash(int carIndex, PositionVector crashPositionVector) throws PositionVectorNotValidException {
 | 
					    public void carDoesCrash(int carIndex, PositionVector crashPositionVector) {
 | 
				
			||||||
        isPositionVectorOnTrack(crashPositionVector); //TODO: remove this line? and Method?
 | 
					 | 
				
			||||||
        PositionVector currentCarPosition = getCarPos(carIndex);
 | 
					        PositionVector currentCarPosition = getCarPos(carIndex);
 | 
				
			||||||
        drawCharOnTrackIndicator(new PositionVector(currentCarPosition.getX(), currentCarPosition.getY()), ConfigSpecification.SpaceType.TRACK.getValue());
 | 
					        drawCharOnTrackIndicator(new PositionVector(currentCarPosition.getX(), currentCarPosition.getY()), ConfigSpecification.SpaceType.TRACK.getValue());
 | 
				
			||||||
        Car car = cars.get(carIndex);
 | 
					        Car car = cars.get(carIndex);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,6 @@
 | 
				
			||||||
package ch.zhaw.pm2.racetrack.given;
 | 
					package ch.zhaw.pm2.racetrack.given;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import ch.zhaw.pm2.racetrack.PositionVector;
 | 
					import ch.zhaw.pm2.racetrack.PositionVector;
 | 
				
			||||||
import ch.zhaw.pm2.racetrack.PositionVectorNotValidException;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,11 +18,11 @@ public interface GameSpecification {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int getWinner();
 | 
					    int getWinner();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void doCarTurn(PositionVector.Direction acceleration) throws PositionVectorNotValidException;
 | 
					    void doCarTurn(PositionVector.Direction acceleration);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void switchToNextActiveCar();
 | 
					    void switchToNextActiveCar();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    List<PositionVector> calculatePath(PositionVector startPosition, PositionVector endPosition);
 | 
					    List<PositionVector> calculatePath(PositionVector startPosition, PositionVector endPosition);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    boolean willCarCrash(int carIndex, PositionVector position) throws PositionVectorNotValidException;
 | 
					    boolean willCarCrash(int carIndex, PositionVector position);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -109,28 +109,19 @@ public class TrackTest {
 | 
				
			||||||
        @Test
 | 
					        @Test
 | 
				
			||||||
        @DisplayName("Will Car Crash")
 | 
					        @DisplayName("Will Car Crash")
 | 
				
			||||||
        void willCarCrash() {
 | 
					        void willCarCrash() {
 | 
				
			||||||
            try {
 | 
					 | 
				
			||||||
            //Car will Crash
 | 
					            //Car will Crash
 | 
				
			||||||
            Assertions.assertTrue(trackObj.willCrashAtPosition(0, new PositionVector(25, 21)));
 | 
					            Assertions.assertTrue(trackObj.willCrashAtPosition(0, new PositionVector(25, 21)));
 | 
				
			||||||
            //Car will not Crash and is on track
 | 
					            //Car will not Crash and is on track
 | 
				
			||||||
            Assertions.assertFalse(trackObj.willCrashAtPosition(0, new PositionVector(7, 22)));
 | 
					            Assertions.assertFalse(trackObj.willCrashAtPosition(0, new PositionVector(7, 22)));
 | 
				
			||||||
            //Car will not Crash and is on finishLine
 | 
					            //Car will not Crash and is on finishLine
 | 
				
			||||||
            Assertions.assertFalse(trackObj.willCrashAtPosition(0, trackObj.getFinishLine().get(0)));
 | 
					            Assertions.assertFalse(trackObj.willCrashAtPosition(0, trackObj.getFinishLine().get(0)));
 | 
				
			||||||
            } catch (PositionVectorNotValidException positionVectorNotValidException) {
 | 
					
 | 
				
			||||||
                positionVectorNotValidException.printStackTrace();
 | 
					 | 
				
			||||||
                Assertions.fail("Test should not throw error");
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Test
 | 
					        @Test
 | 
				
			||||||
        @DisplayName("Make Car Crash")
 | 
					        @DisplayName("Make Car Crash")
 | 
				
			||||||
        void makeCarCrash() {
 | 
					        void makeCarCrash() {
 | 
				
			||||||
            try {
 | 
					 | 
				
			||||||
            trackObj.carDoesCrash(0, new PositionVector(6, 22));
 | 
					            trackObj.carDoesCrash(0, new PositionVector(6, 22));
 | 
				
			||||||
            } catch (PositionVectorNotValidException positionVectorNotValidException) {
 | 
					 | 
				
			||||||
                positionVectorNotValidException.printStackTrace();
 | 
					 | 
				
			||||||
                Assertions.fail("Test should not throw exception");
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            Assertions.assertEquals(Track.CRASH_INDICATOR, trackObj.getTrack().get(22).charAt(6));
 | 
					            Assertions.assertEquals(Track.CRASH_INDICATOR, trackObj.getTrack().get(22).charAt(6));
 | 
				
			||||||
            Assertions.assertTrue(trackObj.getCar(0).isCrashed());
 | 
					            Assertions.assertTrue(trackObj.getCar(0).isCrashed());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -140,7 +131,6 @@ public class TrackTest {
 | 
				
			||||||
    @DisplayName("Negative TestCase")
 | 
					    @DisplayName("Negative TestCase")
 | 
				
			||||||
    class negativeClass {
 | 
					    class negativeClass {
 | 
				
			||||||
        File file;
 | 
					        File file;
 | 
				
			||||||
 | 
					 | 
				
			||||||
        @BeforeEach
 | 
					        @BeforeEach
 | 
				
			||||||
        void setup() {
 | 
					        void setup() {
 | 
				
			||||||
            file = new File(".\\tracks\\challenge.txt");
 | 
					            file = new File(".\\tracks\\challenge.txt");
 | 
				
			||||||
| 
						 | 
					@ -165,14 +155,5 @@ public class TrackTest {
 | 
				
			||||||
            File testfile = new File(".\\src\\test\\InvalidTracks\\sameCar.txt");
 | 
					            File testfile = new File(".\\src\\test\\InvalidTracks\\sameCar.txt");
 | 
				
			||||||
            Assertions.assertThrows(InvalidTrackFormatException.class, () -> new Track(testfile));
 | 
					            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)));
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue