@@ -1,7 +1,22 @@ | |||
/* | |||
* 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 boolean goesForward = true; | |||
private int circleNumber = 0; | |||
private int spiralNumber = 0; | |||
public static void main(String[] args) { | |||
@@ -25,33 +40,6 @@ public class EscapeBot extends Bot{ | |||
private int findRocketRow(View view) { | |||
return view.data.indexOf('o') / 5; | |||
} | |||
private char walkByColumns() { | |||
if(moves.isEmpty()){ | |||
moves = "^".repeat(28); | |||
moves += (goesForward ? ">^^^^^>" : "<^^^^^<"); | |||
goesForward = !goesForward; | |||
} | |||
char nextMove = moves.charAt(0); | |||
moves = moves.substring(1); | |||
return nextMove; | |||
} | |||
private char walkByCircles(){ | |||
if (moves.isEmpty()) { | |||
circleNumber++; | |||
moves += "^".repeat(5) + ">"; | |||
int[] steps = {5, 10, 10, 10}; | |||
for (int step : steps) { | |||
moves += "^".repeat(step * circleNumber) + ">"; | |||
} | |||
moves += "^".repeat(5 * circleNumber) + "<"; | |||
} | |||
char nextMove = moves.charAt(0); | |||
moves = moves.substring(1); | |||
return nextMove; | |||
} | |||
private char walkBySpiral(){ | |||
if (moves.isEmpty()) { |
@@ -1,3 +1,11 @@ | |||
/* | |||
* RumbleBot. | |||
* Der Rover ist auch mit einem Geschütz ausgestattet, dass nur in Fahrrichtung feuern kann. | |||
* Der Feuerbefehl ist „f“. Die Reichweite des Geschützes entspricht der Scanreichweite. | |||
* Wälder, Felsen und Wasser blockieren Schüsse. | |||
* Der Rover ist beim ersten Treffer zerstört. Wer überlebt am längsten? | |||
* docker run --rm -p 63187:63187 mediaeng/bots rumble | |||
*/ | |||
public class RumbleBot extends Bot{ | |||
private String moves = ""; | |||
public static void main(String[] args) { |
@@ -1,7 +1,17 @@ | |||
/* | |||
* SnakeBot. | |||
* Eine weitere wichtige Funktion des Rovers ist es, Gesteinsproben zu sammeln. | |||
* Interessante Steine sind im Scan mit einem @ gekennzeichnet. | |||
* Mit jeder aufgesammelten Gesteinsprobe wird an den Rover ein Wagen angehängt, der zukünftig hinter dem Rover mitgezogen wird. | |||
* Die Wagen sind im Scan mit * zu identifizieren. | |||
* Vorsicht: fährt der Rover in einen Wagen, ist er schwer beschädigt und kann keine weiteren Steine mehr sammeln. | |||
* Sie können Ihre Implementierung wieder testen mit: | |||
* docker run --rm -p 63187:63187 mediaeng/bots snakes | |||
* Für diese Funktion wird am 7.2.24 in einer gemeinsamen Arena mit allen Teams des Jahrgangs ein Wettbewerb durchgeführt. | |||
* Die besten acht Teams qualifizieren sich für die Königsdisziplin „Rumble“. | |||
*/ | |||
public class SnakeBot extends Bot{ | |||
String moves = ""; | |||
private boolean goesForward = true; | |||
private int circleNumber = 0; | |||
private int spiralNumber = 0; | |||
private boolean ignoreStone = false; | |||
public static void main(String[] args) { | |||
@@ -12,7 +22,7 @@ public class SnakeBot extends Bot{ | |||
protected SnakeBot(String[] args) { | |||
super(args); | |||
} | |||
//@TODO | |||
//@TODO Find a better way to avoid collectedStones | |||
protected char nextMove(View view){ | |||
boolean stoneDetected = view.data.contains("@"); | |||
char nextMove; | |||
@@ -68,34 +78,6 @@ public class SnakeBot extends Bot{ | |||
return view.data.indexOf('@') / 5; | |||
} | |||
private char walkByColumns() { | |||
if(moves.isEmpty()){ | |||
moves = "^".repeat(28); | |||
moves += (goesForward ? ">^^^^^>" : "<^^^^^<"); | |||
goesForward = !goesForward; | |||
} | |||
char nextMove = moves.charAt(0); | |||
moves = moves.substring(1); | |||
return nextMove; | |||
} | |||
private char walkByCircles(){ | |||
if (moves.isEmpty()) { | |||
circleNumber++; | |||
moves += "^".repeat(5) + ">"; | |||
int[] steps = {5, 10, 10, 10}; | |||
for (int step : steps) { | |||
moves += "^".repeat(step * circleNumber) + ">"; | |||
} | |||
moves += "^".repeat(5 * circleNumber) + "<"; | |||
} | |||
char nextMove = moves.charAt(0); | |||
moves = moves.substring(1); | |||
return nextMove; | |||
} | |||
private char walkBySpiral(){ | |||
if (moves.isEmpty()) { | |||
spiralNumber++; |