diff --git a/src/main/java/ch/zhaw/pm2/racetrack/Car.java b/src/main/java/ch/zhaw/pm2/racetrack/Car.java index dfcce64..c8739f1 100644 --- a/src/main/java/ch/zhaw/pm2/racetrack/Car.java +++ b/src/main/java/ch/zhaw/pm2/racetrack/Car.java @@ -3,6 +3,8 @@ 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. @@ -48,25 +50,39 @@ public class Car implements CarSpecification { setPosition(position); } - public char getId() { + /** + * Returns the id of the car. + * + * @return id of the car. + */ + public char getID(){ return id; } - public PositionVector getVelocity() { + /** + * Returns the current velocity of the car as a PositionVector. + * + * @return velocity current velocity of the car. + */ + 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. * The next position is normaly automatically calculated and set in the {@link #move()} method. * * @param position The new position to set the car directly to. + * @throws IllegalArgumentException if invalid PositionVector is given. */ @Override public void setPosition(final PositionVector position) { - // TODO: implementation - this.position = position; + if (position.getX() < 0 || position.getY() < 0) { + throw new IllegalArgumentException(); + } + else { + this.position = position; + } } /** @@ -77,8 +93,7 @@ public class Car implements CarSpecification { */ @Override public PositionVector nextPosition() { - // TODO: implementation - throw new UnsupportedOperationException(); + return new PositionVector(position.getX() + velocity.getX(),position.getY() + velocity.getY()); } /** @@ -88,11 +103,18 @@ public class Car implements CarSpecification { * Changes only velocity, not position. * * @param acceleration A Direction vector containing the amounts to add to the velocity in x and y dimension + * @throws IllegalArgumentException if PositionVector is not in allowed area. */ @Override public void accelerate(PositionVector.Direction acceleration) { - // TODO: implementation - throw new UnsupportedOperationException(); + if(acceleration.vector.getX() < -1 || acceleration.vector.getX() > 1|| + acceleration.vector.getY() < -1 || acceleration.vector.getY() > 1) { + throw new IllegalArgumentException(); + } + else { + velocity = new PositionVector(velocity.getX() + acceleration.vector.getX(), + velocity.getY() + acceleration.vector.getY()); + } } /** @@ -100,8 +122,7 @@ public class Car implements CarSpecification { */ @Override public void move() { - // TODO: implementation - throw new UnsupportedOperationException(); + position = new PositionVector(position.getX() + velocity.getX(), position.getY() + velocity.getY()); } /** @@ -109,8 +130,7 @@ public class Car implements CarSpecification { */ @Override public void crash() { - // TODO: implementation - throw new UnsupportedOperationException(); + crashed = true; } /** @@ -120,13 +140,12 @@ public class Car implements CarSpecification { */ @Override public boolean isCrashed() { - // TODO: implementation - throw new UnsupportedOperationException(); + return crashed; } /** * Set move strategy - * @param moveStrategy + * @param moveStrategy Strategy to be implemented */ public void setMoveStrategy(MoveStrategy moveStrategy) { this.moveStrategy = moveStrategy; diff --git a/src/main/java/ch/zhaw/pm2/racetrack/UserInterface.java b/src/main/java/ch/zhaw/pm2/racetrack/UserInterface.java new file mode 100644 index 0000000..d800a95 --- /dev/null +++ b/src/main/java/ch/zhaw/pm2/racetrack/UserInterface.java @@ -0,0 +1,94 @@ +package ch.zhaw.pm2.racetrack; + +import org.beryx.textio.TextIO; +import org.beryx.textio.TextIoFactory; +import org.beryx.textio.TextTerminal; + +import java.util.List; + +public class UserInterface { + + private final TextIO textIO; + private final TextTerminal textTerminal; + + /** + * 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) { + textIO = TextIoFactory.getTextIO(); + textTerminal = textIO.getTextTerminal(); + + textTerminal.println(welcomeText + "\n"); + } + + /** + * 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:" + * @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 + ":\n"); + 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 + * @param playingCarIndex the index 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) { + PositionVector.Direction direction = null; + textTerminal.println("Playing Car " + playingCarIndex + ": " + playingCarIndex); + textTerminal.println("Directions are based on the number pad:"); + textTerminal.println("7 8 9 7=up-left, 8=up, 9=up-right"); + textTerminal.println("4 5 6 4=left, 5=no acceleration, 6=right"); + textTerminal.println("1 2 3 1=down-left, 2=down, 3=down-right"); + textTerminal.println("\n10 = quit \n"); + + while (direction == null) { //asks until a valid input in entered + int number = textIO.newIntInputReader().withMinVal(1).withMaxVal(10).read("choose your Acceleration direction: "); + if (number == 10) { //quit game + return null; + } + direction = getDirection(number); + } + return direction; + } + + /** + * returns the the associated direction Object + * @param number the number which was typed by the user + * @return the associated direction. If null -> unknown number + */ + private PositionVector.Direction getDirection(int number) { + return switch (number) { + case 1 -> PositionVector.Direction.DOWN_LEFT; + case 2 -> PositionVector.Direction.DOWN; + case 3 -> PositionVector.Direction.DOWN_RIGHT; + case 4 -> PositionVector.Direction.LEFT; + case 5 -> PositionVector.Direction.NONE; + case 6 -> PositionVector.Direction.RIGHT; + case 7 -> PositionVector.Direction.UP_LEFT; + case 8 -> PositionVector.Direction.UP; + case 9 -> PositionVector.Direction.UP_RIGHT; + default -> null; + }; + } + + /** + * prints the given Track in the terminal + * @param track the track which should be printed + */ + public void printTrack(Track track) { + textTerminal.println(track.toString()); + } + + + +}