Merge branch 'main' into Strategy
# Conflicts: # src/main/java/ch/zhaw/pm2/racetrack/Game.java
This commit is contained in:
commit
f133f4305d
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)];
|
||||||
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<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