Track feature #21

Merged
fassband merged 9 commits from track-feature into main 2022-03-11 18:41:11 +01:00
2 changed files with 129 additions and 16 deletions
Showing only changes of commit ee68bf9a1d - Show all commits

View File

@ -3,6 +3,8 @@ package ch.zhaw.pm2.racetrack;
import ch.zhaw.pm2.racetrack.given.CarSpecification; import ch.zhaw.pm2.racetrack.given.CarSpecification;
import ch.zhaw.pm2.racetrack.strategy.MoveStrategy; import ch.zhaw.pm2.racetrack.strategy.MoveStrategy;
import java.util.Vector;
/** /**
* Class representing a car on the racetrack. * Class representing a car on the racetrack.
* Uses {@link PositionVector} to store current position on the track grid and current velocity vector. * Uses {@link PositionVector} to store current position on the track grid and current velocity vector.
@ -48,26 +50,40 @@ public class Car implements CarSpecification {
setPosition(position); setPosition(position);
} }
public char getId() { /**
* Returns the id of the car.
*
* @return id of the car.
*/
public char getID(){
return id; 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; return velocity;
} }
/** /**
* Set this Car position directly, regardless of current position and 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. * 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. * 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. * @param position The new position to set the car directly to.
* @throws IllegalArgumentException if invalid PositionVector is given.
*/ */
@Override @Override
public void setPosition(final PositionVector position) { public void setPosition(final PositionVector position) {
// TODO: implementation if (position.getX() < 0 || position.getY() < 0) {
throw new IllegalArgumentException();
}
else {
this.position = position; this.position = position;
} }
}
/** /**
* Return the position that will apply after the next move at the current velocity. * Return the position that will apply after the next move at the current velocity.
@ -77,8 +93,7 @@ public class Car implements CarSpecification {
*/ */
@Override @Override
public PositionVector nextPosition() { public PositionVector nextPosition() {
// TODO: implementation return new PositionVector(position.getX() + velocity.getX(),position.getY() + velocity.getY());
throw new UnsupportedOperationException();
} }
/** /**
@ -88,11 +103,18 @@ public class Car implements CarSpecification {
* Changes only velocity, not position. * Changes only velocity, not position.
* *
* @param acceleration A Direction vector containing the amounts to add to the velocity in x and y dimension * @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 @Override
public void accelerate(PositionVector.Direction acceleration) { public void accelerate(PositionVector.Direction acceleration) {
// TODO: implementation if(acceleration.vector.getX() < -1 || acceleration.vector.getX() > 1||
throw new UnsupportedOperationException(); 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 @Override
public void move() { public void move() {
// TODO: implementation position = new PositionVector(position.getX() + velocity.getX(), position.getY() + velocity.getY());
throw new UnsupportedOperationException();
} }
/** /**
@ -109,8 +130,7 @@ public class Car implements CarSpecification {
*/ */
@Override @Override
public void crash() { public void crash() {
// TODO: implementation crashed = true;
throw new UnsupportedOperationException();
} }
/** /**
@ -120,13 +140,12 @@ public class Car implements CarSpecification {
*/ */
@Override @Override
public boolean isCrashed() { public boolean isCrashed() {
// TODO: implementation return crashed;
throw new UnsupportedOperationException();
} }
/** /**
* Set move strategy * Set move strategy
* @param moveStrategy * @param moveStrategy Strategy to be implemented
*/ */
public void setMoveStrategy(MoveStrategy moveStrategy) { public void setMoveStrategy(MoveStrategy moveStrategy) {
this.moveStrategy = moveStrategy; this.moveStrategy = moveStrategy;

View File

@ -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<String> 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());
}
}