|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- /*
- * 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.
- */
- public class EscapeBot extends Bot{
- String moves = "";
- private int spiralNumber = 0;
-
- public static void main(String[] args) {
- Bot escapeBot = new EscapeBot(args);
- escapeBot.run();
- }
-
- protected EscapeBot(String[] args) {
- super(args);
- }
- protected char nextMove(View view) {
- boolean rocketDetected = view.data.contains("o");
- return rocketDetected ? goToRocket(view) : walkBySpiral(view);
- }
-
- private char goToRocket(View view) {
- int rowDifference = findRocketRow(view) - (view.width / 2);
- return rowDifference < 0 ? '^' : '<';
- }
-
- private int findRocketRow(View view) {
- return view.data.indexOf('o') / view.width;
- }
-
- private char walkBySpiral(View view) {
- if (moves.isEmpty()) {
- spiralNumber++;
- moves += "^".repeat(view.width * spiralNumber) + ">" + "^".repeat(view.width * spiralNumber) + ">";
- }
- char nextMove = moves.charAt(0);
- moves = moves.substring(1);
- return nextMove;
- }
-
- }
|