/* | |||||
* 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{ | public class EscapeBot extends Bot{ | ||||
String moves = ""; | String moves = ""; | ||||
private boolean goesForward = true; | |||||
private int circleNumber = 0; | |||||
private int spiralNumber = 0; | private int spiralNumber = 0; | ||||
public static void main(String[] args) { | public static void main(String[] args) { | ||||
private int findRocketRow(View view) { | private int findRocketRow(View view) { | ||||
return view.data.indexOf('o') / 5; | 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(){ | private char walkBySpiral(){ | ||||
if (moves.isEmpty()) { | if (moves.isEmpty()) { |
/* | |||||
* 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{ | public class RumbleBot extends Bot{ | ||||
private String moves = ""; | private String moves = ""; | ||||
public static void main(String[] args) { | public static void main(String[] args) { |
/* | |||||
* 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{ | public class SnakeBot extends Bot{ | ||||
String moves = ""; | String moves = ""; | ||||
private boolean goesForward = true; | |||||
private int circleNumber = 0; | |||||
private int spiralNumber = 0; | private int spiralNumber = 0; | ||||
private boolean ignoreStone = false; | private boolean ignoreStone = false; | ||||
public static void main(String[] args) { | public static void main(String[] args) { | ||||
protected SnakeBot(String[] args) { | protected SnakeBot(String[] args) { | ||||
super(args); | super(args); | ||||
} | } | ||||
//@TODO | |||||
//@TODO Find a better way to avoid collectedStones | |||||
protected char nextMove(View view){ | protected char nextMove(View view){ | ||||
boolean stoneDetected = view.data.contains("@"); | boolean stoneDetected = view.data.contains("@"); | ||||
char nextMove; | char nextMove; | ||||
return view.data.indexOf('@') / 5; | 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(){ | private char walkBySpiral(){ | ||||
if (moves.isEmpty()) { | if (moves.isEmpty()) { | ||||
spiralNumber++; | spiralNumber++; |