|
|
|
|
|
|
|
|
/* |
|
|
|
|
|
* 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 RumbleBotTest2 extends Bot { |
|
|
|
|
|
|
|
|
|
|
|
private char currentDirection = '^'; // Start-Richtung des Bots |
|
|
|
|
|
|
|
|
|
|
|
protected RumbleBotTest2(String[] args) { |
|
|
|
|
|
super(args); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static void main(String[] args) { |
|
|
|
|
|
Bot rumbleBot = new RumbleBot(args); |
|
|
|
|
|
rumbleBot.run(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
protected char nextMove(View view) { |
|
|
|
|
|
// Scanne das Spielfeld nach Gegnern in Fahrtrichtung |
|
|
|
|
|
if (isEnemyInSight(view)) { |
|
|
|
|
|
return 'f'; // Feuere, wenn ein Gegner in Reichweite ist |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Wenn kein Gegner in Sicht, wähle eine Bewegung |
|
|
|
|
|
return chooseMove(view); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private boolean isEnemyInSight(View view) { |
|
|
|
|
|
// Prüfe, ob ein Gegner in der aktuellen Fahrtrichtung ist |
|
|
|
|
|
// Annahme: Gegner sind als ^, <, >, v gekennzeichnet |
|
|
|
|
|
String enemySymbols = "^<>v"; |
|
|
|
|
|
return view.data.contains(String.valueOf(currentDirection)) && enemySymbols.contains(String.valueOf(currentDirection)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private char chooseMove(View view) { |
|
|
|
|
|
// Wähle eine sichere Bewegung, vermeide Hindernisse und versuche, Gegner zu finden |
|
|
|
|
|
// Einfache Implementierung: Wechsle die Richtung bei jedem Zug |
|
|
|
|
|
currentDirection = getNextDirection(currentDirection); |
|
|
|
|
|
return currentDirection; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private char getNextDirection(char currentDirection) { |
|
|
|
|
|
switch (currentDirection) { |
|
|
|
|
|
case '^': |
|
|
|
|
|
return '>'; |
|
|
|
|
|
case '>': |
|
|
|
|
|
return 'v'; |
|
|
|
|
|
case 'v': |
|
|
|
|
|
return '<'; |
|
|
|
|
|
case '<': |
|
|
|
|
|
return '^'; |
|
|
|
|
|
default: |
|
|
|
|
|
return '^'; // Standardrichtung, falls etwas schiefgeht |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|