diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Game.java b/src/main/java/ch/zhaw/pm2/racetrack/Game.java index 239d8c0..7098a95 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Game.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Game.java @@ -49,15 +49,15 @@ public class Game implements GameSpecification { for (int i = 0; i < track.getCarCount(); i++) { int moveStrategie = userInterface.selectOption( "Select Strategy for Car " + i + " (" + track.getCarId(i) + ")", moveStrategies); - switch (moveStrategie + 1) { //TODO: set Movestrategy with method in Track + switch (moveStrategie + 1) { case 1: - track.getCar(i).setMoveStrategy(new DoNotMoveStrategy()); //TODO: add Arguments + track.getCar(i).setMoveStrategy(new DoNotMoveStrategy()); break; case 2: - track.getCar(i).setMoveStrategy(new UserMoveStrategy(userInterface, i, track.getCarId(i))); //TODO: add Arguments + track.getCar(i).setMoveStrategy(new UserMoveStrategy(userInterface, i, track.getCarId(i))); break; case 3: - String path = ".\\moves\\ " + selectedTrack.getName().split(".")[0] + "-car-" + track.getCar(i).getID() + ".txt"; + String path = ".\\moves\\ " + selectedTrack.getName().split("\\.")[0] + "-car-" + track.getCar(i).getID() + ".txt"; try { MoveStrategy moveStrategy = new MoveListStrategy(path); track.getCar(i).setMoveStrategy(moveStrategy); @@ -113,7 +113,6 @@ public class Game implements GameSpecification { /** * Get the velocity of the specified car. - * * @param carIndex The zero-based carIndex number * @return A PositionVector containing the car's current velocity */ @@ -129,10 +128,12 @@ public class Game implements GameSpecification { */ @Override public int getWinner() { - List cars = track.getCars(); - for (Car car : cars) { - if (car.getWinPoints() == 1) { - return car.getID(); + if (onlyOneCarLeft()) { + return currentCarIndex; + } + for (int i = 0; i < track.getCarCount(); i++) { + if (track.getCar(i).getWinPoints() == 1) { + return i; } } return NO_WINNER; @@ -166,35 +167,40 @@ public class Game implements GameSpecification { */ @Override public void doCarTurn(Direction acceleration) throws PositionVectorNotValid { - // TODO: implementation track.getCar(currentCarIndex).accelerate(acceleration); PositionVector crashPosition = null; List positionList = calculatePath(track.getCarPos(currentCarIndex), track.getCar(currentCarIndex).nextPosition()); - //TODO: check if Method calculatePath contains endposition - for (PositionVector location : positionList) { //todo: check if order must be reversed - if (willCarCrash(currentCarIndex, location)) { - crashPosition = location; + for (int i = 0; i < positionList.size(); i++) { + if (willCarCrash(currentCarIndex, positionList.get(i))) { + if (i == 0) { + crashPosition = track.getCarPos(currentCarIndex); + } else { + crashPosition = positionList.get(i - 1); + } } } if (crashPosition != null) { track.carDoesCrash(currentCarIndex, crashPosition); } else { - track.moveCar(currentCarIndex); calculateWinner(track.getCarPos(currentCarIndex), track.getCar(currentCarIndex).nextPosition(), currentCarIndex); + track.moveCar(currentCarIndex); } } public int gamePhase() throws PositionVectorNotValid { - while (getWinner() == NO_WINNER) { + while (CarsMoving() && getWinner() == NO_WINNER) { userInterface.printTrack(track); - Direction direction = track.getCar(currentCarIndex).getMoveStrategy().nextMove(); - doCarTurn(direction); - if (allCarsCrashed()) { - return NO_WINNER; + Direction direction = null; + direction= track.getCar(currentCarIndex).getMoveStrategy().nextMove(); + if(direction == null) { + track.getCar(currentCarIndex).setMoveStrategy(new DoNotMoveStrategy()); + direction= track.getCar(currentCarIndex).getMoveStrategy().nextMove(); } + doCarTurn(direction); switchToNextActiveCar(); } + userInterface.printTrack(track); return getWinner(); } @@ -289,44 +295,46 @@ public class Game implements GameSpecification { private void calculateWinner(PositionVector start, PositionVector finish, int carIndex) { List path = calculatePath(start, finish); for (PositionVector point : path) { - switch (track.getSpaceType(point)) { - case FINISH_UP: - if (start.getY() < finish.getY()) { - track.getCar(carIndex).increaseWinPoints(); - } else if (start.getY() > finish.getY()) { - track.getCar(carIndex).deductWinPoints(); + if (track.getSpaceType(point) != null) + { + switch (track.getSpaceType(point)) { + case FINISH_UP: + if (start.getY() < finish.getY()) { + track.getCar(carIndex).increaseWinPoints(); + } else if (start.getY() > finish.getY()) { + track.getCar(carIndex).deductWinPoints(); + } + break; + case FINISH_DOWN: + if (start.getY() > finish.getY()) { + track.getCar(carIndex).increaseWinPoints(); + } else if (start.getY() < finish.getY()) { + track.getCar(carIndex).deductWinPoints(); + } + break; + case FINISH_RIGHT: + if (start.getX() < finish.getX()) { + track.getCar(carIndex).increaseWinPoints(); + } else if (start.getX() > finish.getX()) { + track.getCar(carIndex).deductWinPoints(); + } + break; + case FINISH_LEFT: + if (start.getX() > finish.getX()) { + track.getCar(carIndex).increaseWinPoints(); + } else if (start.getX() < finish.getX()) { + track.getCar(carIndex).increaseWinPoints(); + } + break; } - break; - case FINISH_DOWN: - if (start.getY() > finish.getY()) { - track.getCar(carIndex).increaseWinPoints(); - } else if (start.getY() < finish.getY()) { - track.getCar(carIndex).deductWinPoints(); - } - break; - case FINISH_RIGHT: - if (start.getX() < finish.getX()) { - track.getCar(carIndex).increaseWinPoints(); - } else if (start.getX() > finish.getX()) { - track.getCar(carIndex).deductWinPoints(); - } - break; - case FINISH_LEFT: - if (start.getX() > finish.getX()) { - track.getCar(carIndex).increaseWinPoints(); - } else if (start.getX() < finish.getX()) { - track.getCar(carIndex).increaseWinPoints(); - } - break; - } - } + } + } } /** * Does indicate if a car would have a crash with a WALL space or another car at the given position. - * * @param carIndex The zero-based carIndex number * @param position A PositionVector of the possible crash position * @return A boolean indicator if the car would crash with a WALL or another car. @@ -336,12 +344,22 @@ public class Game implements GameSpecification { return track.willCrashAtPosition(carIndex, position); } - public boolean allCarsCrashed() { - for (int carIndex = 0; carIndex < track.getCarCount(); carIndex++) { - if (!track.getCar(carIndex).isCrashed()) { - return false; + public boolean onlyOneCarLeft() { + int carsLeft = 0; + for(int carIndex = 0; carIndex < track.getCarCount(); carIndex ++) { + if(! track.getCar(carIndex).isCrashed()) { + carsLeft++; } } - return true; + return !(carsLeft > 1); + } + + public boolean CarsMoving() { + for(int carIndex = 0; carIndex < track.getCarCount(); carIndex ++) { + if(! (track.getCar(carIndex).isCrashed() || track.getCar(carIndex).getMoveStrategy().getClass() == DoNotMoveStrategy.class)) { + return true; + } + } + return false; } } diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Main.java b/src/main/java/ch/zhaw/pm2/racetrack/Main.java index bac1de9..1a7c197 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Main.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Main.java @@ -8,8 +8,8 @@ public class Main { public static void main(String[] args) throws InvalidTrackFormatException, FileNotFoundException, PositionVectorNotValid { boolean exit = false; + UserInterface userInterface = new UserInterface("Hello and Welcome"); while (!exit) { - UserInterface userInterface = new UserInterface("Hello and Welcome"); Game game = new Game(userInterface); int winner = 0; if (game.initPhase()) { @@ -23,6 +23,7 @@ public class Main { exit = true; } } + userInterface.printInformation("Thank you and goodbye"); } } diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Track.java b/src/main/java/ch/zhaw/pm2/racetrack/Track.java index 640fe3e..0593222 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Track.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Track.java @@ -225,7 +225,11 @@ public class Track implements TrackSpecification { isPositionVectorOnTrack(positionVector); char charAtPosition = track.get(positionVector.getY()).charAt(positionVector.getX()); if (getCarId(carIndex) == charAtPosition) return false; - return (charAtPosition == ConfigSpecification.SpaceType.WALL.value); + return !(charAtPosition == ConfigSpecification.SpaceType.TRACK.value || + charAtPosition == ConfigSpecification.SpaceType.FINISH_RIGHT.value || + charAtPosition == ConfigSpecification.SpaceType.FINISH_LEFT.value || + charAtPosition == ConfigSpecification.SpaceType.FINISH_UP.value || + charAtPosition == ConfigSpecification.SpaceType.FINISH_DOWN.value); } /**