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