2024-01-07 17:48:14 +01:00
|
|
|
/*
|
|
|
|
* EscapeBot.
|
|
|
|
* Eine wichtige Funktion des Rovers ist es, wieder zurück zur Rakete zu finden, damit er dort seine gesammelten Daten speichern kann.
|
|
|
|
* Die Rakete wird in den Scans als o angezeigt.
|
|
|
|
* Implementieren Sie eine neue Unterklasse von Bot mit dem Namen EscapeBot, die die Oberfläche nach der Rakete absucht und den Rover dorthin fahren lässt.
|
|
|
|
* Sie können davon ausgehen, dass bei dieser Aufgabenstellung keine Hindernisse (Wälder, Wasser, Felsen) auftreten.
|
|
|
|
* Allerdings kennen Sie die Abmessung von Torus III nicht und müssen versuchen, nicht ewig im Kreis zu fahren.
|
|
|
|
* Natürlich ist Energie auf Torus III knapp. Daher sollten Sie die Rakete mit möglichst wenigen Schritten finden.
|
|
|
|
* Um Ihre Implementierung zu testen, müssen Sie den Docker-Container mit einem leicht abgewandelten Befehl starten:
|
|
|
|
* docker run --rm -p 63187:63187 mediaeng/bots escape
|
|
|
|
* Sie sind mit Ihrem Programm zufrieden? Wie wäre es, einmal im Vergleich zu anderen Teams anzutreten?
|
|
|
|
* Sie müssen dazu aber entweder auf einem Hochschulrechner arbeiten oder ins VPN gehen.
|
|
|
|
* Melden Sie sich beim Praktikumsbetreuer, nennen Sie ihm Ihren Teamnamen und die IP-Nummer Ihres teilnehmenden Rechners.
|
|
|
|
* Lassen Sie sich vom Betreuer Ihres Praktikums die IP-Nummer der gemeinsamen Testumgebung geben und sorgen Sie dafür,
|
|
|
|
* dass sich Ihr Bot mit dieser Adresse verbinden kann. Warten Sie bitte mit dem Start, bis Sie dazu aufgefordert werden.
|
|
|
|
* Sobald alle Teams fertig sind, kann der Wettkampf beginnen.
|
|
|
|
*/
|
2023-12-14 17:15:23 +01:00
|
|
|
public class EscapeBot extends Bot{
|
2024-01-06 18:17:24 +01:00
|
|
|
String moves = "";
|
2024-01-06 20:10:13 +01:00
|
|
|
private int spiralNumber = 0;
|
2023-12-14 17:15:23 +01:00
|
|
|
|
2024-01-06 18:17:24 +01:00
|
|
|
public static void main(String[] args) {
|
2023-12-14 17:15:23 +01:00
|
|
|
Bot escapeBot = new EscapeBot(args);
|
|
|
|
escapeBot.run();
|
|
|
|
}
|
2024-01-07 15:16:41 +01:00
|
|
|
|
2023-12-14 17:15:23 +01:00
|
|
|
protected EscapeBot(String[] args) {
|
|
|
|
super(args);
|
|
|
|
}
|
2024-01-07 19:16:31 +01:00
|
|
|
protected char nextMove(View view) {
|
2024-01-06 18:17:24 +01:00
|
|
|
boolean rocketDetected = view.data.contains("o");
|
2024-01-07 19:09:30 +01:00
|
|
|
return rocketDetected ? goToRocket(view) : walkBySpiral(view);
|
2024-01-06 18:17:24 +01:00
|
|
|
}
|
2024-01-07 15:16:41 +01:00
|
|
|
|
2024-01-07 19:16:31 +01:00
|
|
|
private char goToRocket(View view) {
|
2024-01-06 18:17:24 +01:00
|
|
|
int rowDifference = findRocketRow(view) - 2;
|
|
|
|
return rowDifference < 0 ? '^' : '<';
|
|
|
|
}
|
2024-01-07 15:16:41 +01:00
|
|
|
|
2024-01-06 18:17:24 +01:00
|
|
|
private int findRocketRow(View view) {
|
2024-01-07 19:09:30 +01:00
|
|
|
return view.data.indexOf('o') / view.width;
|
2023-12-14 17:15:23 +01:00
|
|
|
}
|
2024-01-07 15:16:41 +01:00
|
|
|
|
2024-01-07 19:16:31 +01:00
|
|
|
private char walkBySpiral(View view) {
|
2024-01-06 20:10:13 +01:00
|
|
|
if (moves.isEmpty()) {
|
|
|
|
spiralNumber++;
|
2024-01-07 19:09:30 +01:00
|
|
|
moves += "^".repeat(view.width * spiralNumber) + ">" + "^".repeat(view.width * spiralNumber) + ">";
|
2024-01-06 20:10:13 +01:00
|
|
|
}
|
|
|
|
char nextMove = moves.charAt(0);
|
|
|
|
moves = moves.substring(1);
|
|
|
|
return nextMove;
|
|
|
|
}
|
2024-01-07 15:16:41 +01:00
|
|
|
|
2024-01-06 18:17:24 +01:00
|
|
|
}
|