Move list feature #26

Merged
fassband merged 4 commits from MoveListFeature into Game 2022-03-18 20:54:27 +01:00
3 changed files with 81 additions and 58 deletions
Showing only changes of commit c30d7a2988 - Show all commits

View File

@ -49,15 +49,15 @@ public class Game implements GameSpecification {
for (int i = 0; i < track.getCarCount(); i++) { for (int i = 0; i < track.getCarCount(); i++) {
int moveStrategie = userInterface.selectOption( int moveStrategie = userInterface.selectOption(
"Select Strategy for Car " + i + " (" + track.getCarId(i) + ")", moveStrategies); "Select Strategy for Car " + i + " (" + track.getCarId(i) + ")", moveStrategies);
switch (moveStrategie + 1) { //TODO: set Movestrategy with method in Track switch (moveStrategie + 1) {
case 1: case 1:
track.getCar(i).setMoveStrategy(new DoNotMoveStrategy()); //TODO: add Arguments track.getCar(i).setMoveStrategy(new DoNotMoveStrategy());
break; break;
case 2: 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; break;
case 3: 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 { try {
MoveStrategy moveStrategy = new MoveListStrategy(path); MoveStrategy moveStrategy = new MoveListStrategy(path);
track.getCar(i).setMoveStrategy(moveStrategy); track.getCar(i).setMoveStrategy(moveStrategy);
@ -113,7 +113,6 @@ public class Game implements GameSpecification {
/** /**
* Get the velocity of the specified car. * Get the velocity of the specified car.
*
* @param carIndex The zero-based carIndex number * @param carIndex The zero-based carIndex number
* @return A PositionVector containing the car's current velocity * @return A PositionVector containing the car's current velocity
*/ */
@ -129,10 +128,12 @@ public class Game implements GameSpecification {
*/ */
@Override @Override
public int getWinner() { public int getWinner() {
List<Car> cars = track.getCars(); if (onlyOneCarLeft()) {
for (Car car : cars) { return currentCarIndex;
if (car.getWinPoints() == 1) { }
return car.getID(); for (int i = 0; i < track.getCarCount(); i++) {
if (track.getCar(i).getWinPoints() == 1) {
return i;
} }
} }
return NO_WINNER; return NO_WINNER;
@ -166,35 +167,40 @@ public class Game implements GameSpecification {
*/ */
@Override @Override
public void doCarTurn(Direction acceleration) throws PositionVectorNotValid { public void doCarTurn(Direction acceleration) throws PositionVectorNotValid {
// TODO: implementation
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());
//TODO: check if Method calculatePath contains endposition for (int i = 0; i < positionList.size(); i++) {
for (PositionVector location : positionList) { //todo: check if order must be reversed if (willCarCrash(currentCarIndex, positionList.get(i))) {
if (willCarCrash(currentCarIndex, location)) { if (i == 0) {
crashPosition = location; crashPosition = track.getCarPos(currentCarIndex);
} else {
crashPosition = positionList.get(i - 1);
}
} }
} }
if (crashPosition != null) { if (crashPosition != null) {
track.carDoesCrash(currentCarIndex, crashPosition); track.carDoesCrash(currentCarIndex, crashPosition);
} else { } else {
track.moveCar(currentCarIndex);
calculateWinner(track.getCarPos(currentCarIndex), track.getCar(currentCarIndex).nextPosition(), currentCarIndex); calculateWinner(track.getCarPos(currentCarIndex), track.getCar(currentCarIndex).nextPosition(), currentCarIndex);
track.moveCar(currentCarIndex);
} }
} }
public int gamePhase() throws PositionVectorNotValid { public int gamePhase() throws PositionVectorNotValid {
while (getWinner() == NO_WINNER) { while (CarsMoving() && getWinner() == NO_WINNER) {
userInterface.printTrack(track); userInterface.printTrack(track);
Direction direction = track.getCar(currentCarIndex).getMoveStrategy().nextMove(); Direction direction = null;
doCarTurn(direction); direction= track.getCar(currentCarIndex).getMoveStrategy().nextMove();
if (allCarsCrashed()) { if(direction == null) {
return NO_WINNER; track.getCar(currentCarIndex).setMoveStrategy(new DoNotMoveStrategy());
direction= track.getCar(currentCarIndex).getMoveStrategy().nextMove();
} }
doCarTurn(direction);
switchToNextActiveCar(); switchToNextActiveCar();
} }
userInterface.printTrack(track);
return getWinner(); return getWinner();
} }
@ -289,44 +295,46 @@ public class Game implements GameSpecification {
private void calculateWinner(PositionVector start, PositionVector finish, int carIndex) { private void calculateWinner(PositionVector start, PositionVector finish, int carIndex) {
List<PositionVector> path = calculatePath(start, finish); List<PositionVector> path = calculatePath(start, finish);
for (PositionVector point : path) { for (PositionVector point : path) {
switch (track.getSpaceType(point)) { if (track.getSpaceType(point) != null)
case FINISH_UP: {
if (start.getY() < finish.getY()) { switch (track.getSpaceType(point)) {
track.getCar(carIndex).increaseWinPoints(); case FINISH_UP:
} else if (start.getY() > finish.getY()) { if (start.getY() < finish.getY()) {
track.getCar(carIndex).deductWinPoints(); 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. * 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 carIndex The zero-based carIndex number
* @param position A PositionVector of the possible crash position * @param position A PositionVector of the possible crash position
* @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.
@ -336,12 +344,22 @@ public class Game implements GameSpecification {
return track.willCrashAtPosition(carIndex, position); return track.willCrashAtPosition(carIndex, position);
} }
public boolean allCarsCrashed() { public boolean onlyOneCarLeft() {
for (int carIndex = 0; carIndex < track.getCarCount(); carIndex++) { int carsLeft = 0;
if (!track.getCar(carIndex).isCrashed()) { for(int carIndex = 0; carIndex < track.getCarCount(); carIndex ++) {
return false; 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;
} }
} }

View File

@ -8,8 +8,8 @@ public class Main {
public static void main(String[] args) throws InvalidTrackFormatException, FileNotFoundException, PositionVectorNotValid { public static void main(String[] args) throws InvalidTrackFormatException, FileNotFoundException, PositionVectorNotValid {
boolean exit = false; boolean exit = false;
UserInterface userInterface = new UserInterface("Hello and Welcome");
while (!exit) { while (!exit) {
UserInterface userInterface = new UserInterface("Hello and Welcome");
Game game = new Game(userInterface); Game game = new Game(userInterface);
int winner = 0; int winner = 0;
if (game.initPhase()) { if (game.initPhase()) {
@ -23,6 +23,7 @@ public class Main {
exit = true; exit = true;
} }
} }
userInterface.printInformation("Thank you and goodbye");
} }
} }

View File

@ -225,7 +225,11 @@ public class Track implements TrackSpecification {
isPositionVectorOnTrack(positionVector); isPositionVectorOnTrack(positionVector);
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.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);
} }
/** /**