1
0
Fork 0

draft of a full command interface implementation

This commit is contained in:
Xavier Fontanet 2024-06-21 14:40:29 +02:00
parent 530cf22983
commit 43bd81c8e3
1 changed files with 166 additions and 0 deletions

View File

@ -0,0 +1,166 @@
package cat.hack3.codingtests.marsrover.ui;
import cat.hack3.codingtests.marsrover.Coordinates;
import cat.hack3.codingtests.marsrover.Direction;
import cat.hack3.codingtests.marsrover.MarsMap;
import cat.hack3.codingtests.marsrover.MarsRover;
import java.util.InputMismatchException;
import java.util.Scanner;
public class ClientCommandInterface {
private static MarsRover rover;
public static final String INTRO = """
Welcome to Mars Rover Command Line Interface!
Please, establish the Mars dimensions. Bear in mind the Mars-Coordinates-Representation is aligned with the following principles:
- Latitude is Y, starts from 1 on the top and goes down incrementally
- Longitude is X, starts from 1 on the left and goes to right incrementally
Here a graphical representation of a 3x3 map
1 2 3
1 1-1 1-2 1-3
2 2-1 2-2 2-3
3 3-1 3-2 3-3
""";
public static final String READY_MESSAGE = """
Fantastic!
A GPS, named MarsMap, has been delivered to Rover, configured with:
- The size information of the planet
- The current location of the Rover in it
He now can start moving along the planet based on your commands
After every movement, he will check the GPS and report back the new position
About rotations, Rover has a build-in accelerometer, which let him know in what direction is pointing out at any moment
That's all for now. Have fun!
_
[ ]
( )
|>|
__/===\\__
//| o=o |\\\\
<] | o=o | [>
\\=====/
/ / | \\ \\
<_________>
(to continue, enter your name)
""";
public static void main(String[] args) {
output(INTRO);
try (var reader = new Scanner(System.in)) {
//autoInitialization();
initialization(reader);
commandLoop(reader);
}
}
private static void autoInitialization() { //to test more quickly
deployRover(10, 10, 2, 3, Direction.SOUTH);
}
private static void initialization(Scanner reader) {
output("Please, introduce the latitude map size:");
int mapHeight = takeIntegerInput(reader);
output("Please, introduce the longitude map size:");
int mapWidth = takeIntegerInput(reader);
output("Great! Now please introduce the initial location of the Rover.");
output("Latitude:");
int latitudeStartingPoint = takeIntegerInput(reader);
output("Longitude:");
int longitudeStartingPoint = takeIntegerInput(reader);
Direction startingDirection = retrieveDirection(reader);
deployRover(mapHeight, mapWidth, latitudeStartingPoint, longitudeStartingPoint, startingDirection);
output(READY_MESSAGE);
reader.next(); //input ignored
}
private static int takeIntegerInput(Scanner reader) {
try {
return reader.nextInt();
} catch (InputMismatchException e) {
output("(please, introduce a number)");
reader.next();
return takeIntegerInput(reader);
}
}
private static Direction retrieveDirection(Scanner reader) {
var directionInput = "none";
Direction resolvedDirection;
do {
output("Insert initial rover direction (n = north, e = east, w = west, s = south, q = exit):");
directionInput = reader.next();
resolvedDirection = switch (directionInput) {
case "n" -> Direction.NORTH;
case "e" -> Direction.EAST;
case "w" -> Direction.WEST;
case "s" -> Direction.SOUTH;
default -> null;
};
} while (isNotResolvedDirection(resolvedDirection) && isNotExitSignal(directionInput));
if (isExitSignal(directionInput))
System.exit(0);
return resolvedDirection;
}
private static void deployRover(int mapHeight, int mapWidth, int latitudeStartingPoint, int longitudeStartingPoint, Direction startingDirection) {
var startingCoordinates = Coordinates.of(latitudeStartingPoint, longitudeStartingPoint);
var marsMap = new MarsMap(mapHeight, mapWidth, startingCoordinates);
rover = new MarsRover(marsMap, startingDirection);
}
private static void commandLoop(Scanner reader) {
var nextCommand = "none";
do {
output("Insert command (f = forward, b = backward, l = turn left, r = turn right, q = quit):");
nextCommand = reader.next();
switch (nextCommand) {
case "f" -> rover.moveForward();
case "b" -> rover.moveBackwards();
case "l" -> rover.turnLeft();
case "r" -> rover.turnRight();
case "q" -> output("Disconnecting from Mars...");
default -> output("unknown command");
}
} while (isNotExitSignal(nextCommand));
}
private static boolean isNotResolvedDirection(Direction resolvedDirection) {
return resolvedDirection == null;
}
private static boolean isExitSignal(String nextCommand) {
return "q".equals(nextCommand);
}
private static boolean isNotExitSignal(String nextCommand) {
return !isExitSignal(nextCommand);
}
private static void output(String message) {
System.out.println(message);
}
}