Merge remote-tracking branch 'origin/main' into track-feature
# Conflicts: # src/main/java/ch/zhaw/pm2/racetrack/Car.java
This commit is contained in:
		
						commit
						ee68bf9a1d
					
				| 
						 | 
					@ -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;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue