|
|
|
|
|
|
|
|
package bot; |
|
|
package bot; |
|
|
|
|
|
|
|
|
public class CollectBot extends Bot { |
|
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
|
public CollectBot(String[] args) { |
|
|
|
|
|
super(args); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
protected char nextMove(View view) throws Exception { |
|
|
|
|
|
String data = view.data; |
|
|
|
|
|
int width = view.width; |
|
|
|
|
|
|
|
|
|
|
|
// Position des Rovers finden |
|
|
|
|
|
int roverPosition = data.indexOf('R'); |
|
|
|
|
|
|
|
|
|
|
|
// Überprüfen, ob eine Gesteinsprobe vorhanden ist |
|
|
|
|
|
boolean hasRock = data.charAt(roverPosition) == '@'; |
|
|
|
|
|
|
|
|
|
|
|
// Bewegungsbefehl, um zur nächsten Gesteinsprobe zu gelangen |
|
|
|
|
|
if (hasRock) { |
|
|
|
|
|
return 'C'; // Beispielhaftes Zeichen für "Sammeln" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
public class CollectBot extends Bot{ |
|
|
|
|
|
boolean lastMoveWasTurn = false; // Merker, ob der letzte Zug eine Drehung war |
|
|
|
|
|
|
|
|
// Richtung für die nächste Bewegung berechnen, um das Spielfeld systematisch zu erkunden |
|
|
|
|
|
int nextPosition = getNextPosition(roverPosition, width, data); |
|
|
|
|
|
|
|
|
|
|
|
// Bewegungsbefehl generieren, um zur nächsten Position zu gelangen |
|
|
|
|
|
char moveCommand = generateMoveCommand(roverPosition, nextPosition, width); |
|
|
|
|
|
|
|
|
|
|
|
return moveCommand; |
|
|
|
|
|
|
|
|
public static void main(String[] args) { |
|
|
|
|
|
Bot snakeBot = new CollectBot(args); |
|
|
|
|
|
snakeBot.run(); |
|
|
|
|
|
} |
|
|
|
|
|
protected CollectBot(String[] args) { |
|
|
|
|
|
super(args); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
protected char nextMove(View view) throws Exception { |
|
|
|
|
|
char nextMove = '^'; |
|
|
|
|
|
boolean stoneDetected = view.data.contains("@"); |
|
|
|
|
|
System.out.println(view.data + " xxx: "); |
|
|
|
|
|
|
|
|
|
|
|
// Das ist nur fuer debug |
|
|
|
|
|
// List<Integer> positions = positionsOfRock(view.data); |
|
|
|
|
|
// for (Integer i : positions) |
|
|
|
|
|
// System.out.println("Position: " + i); |
|
|
|
|
|
|
|
|
|
|
|
if (lastMoveWasTurn) { |
|
|
|
|
|
lastMoveWasTurn = false; // Merker fuer die letzte Drehung zuruecksetzen |
|
|
|
|
|
nextMove = '^'; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Hilfsmethode, um die nächste Position zu berechnen, um das Spielfeld systematisch zu erkunden |
|
|
|
|
|
private int getNextPosition(int roverPosition, int width, String data) { |
|
|
|
|
|
int nextPosition; |
|
|
|
|
|
|
|
|
|
|
|
// Wenn der Rover sich am unteren Rand des Spielfelds befindet, bewege ihn eine Position nach rechts |
|
|
|
|
|
if (roverPosition / width % 2 == 1) { |
|
|
|
|
|
nextPosition = roverPosition + 1; |
|
|
|
|
|
} else { |
|
|
|
|
|
// Andernfalls bewege den Rover eine Position nach links |
|
|
|
|
|
nextPosition = roverPosition - 1; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Überprüfen, ob die nächste Position gültig ist, sonst bewege den Rover eine Reihe nach unten |
|
|
|
|
|
if (nextPosition >= data.length() || nextPosition < 0 || data.charAt(nextPosition) == '*') { |
|
|
|
|
|
nextPosition = roverPosition + width; |
|
|
|
|
|
|
|
|
else { |
|
|
|
|
|
if (!stoneDetected) |
|
|
|
|
|
nextMove = '^'; |
|
|
|
|
|
else { |
|
|
|
|
|
nextMove = calculateNextMove(view); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return nextPosition; |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
return nextMove; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// Hilfsmethode, um den Bewegungsbefehl basierend auf der aktuellen und nächsten Position zu generieren |
|
|
|
|
|
private char generateMoveCommand(int roverPosition, int nextPosition, int width) { |
|
|
|
|
|
if (nextPosition == roverPosition + 1) { |
|
|
|
|
|
return 'R'; // Bewegung nach rechts |
|
|
|
|
|
} else if (nextPosition == roverPosition - 1) { |
|
|
|
|
|
return 'L'; // Bewegung nach links |
|
|
|
|
|
} else if (nextPosition == roverPosition + width) { |
|
|
|
|
|
return 'D'; // Bewegung nach unten |
|
|
|
|
|
} else { |
|
|
|
|
|
return 'U'; // Bewegung nach oben |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Berechne den naechsten Zug auf Basis der gefundenen Steine im Scan |
|
|
|
|
|
* @param view |
|
|
|
|
|
* @return |
|
|
|
|
|
*/ |
|
|
|
|
|
private char calculateNextMove(View view){ |
|
|
|
|
|
List<Integer> positions = positionsOfRock(view.data); |
|
|
|
|
|
int firstPostion = positions.get(0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Wenn das @Zeichen an Position kleiner 11, dann ist es oberhalb von uns |
|
|
|
|
|
if (firstPostion < 11 ) |
|
|
|
|
|
return '^'; |
|
|
|
|
|
|
|
|
|
|
|
// Ist die Position vom @Zeichen zwischn 11 und 12, dann links von uns |
|
|
|
|
|
// wir muessen uns nach links drehen |
|
|
|
|
|
else if (firstPostion >= 11 && firstPostion < 13) { |
|
|
|
|
|
lastMoveWasTurn = true; // Merker auf true, da wir uns gedreht haben |
|
|
|
|
|
return '<'; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public static void main(String[] args) { |
|
|
|
|
|
new CollectBot(args).run(); |
|
|
|
|
|
|
|
|
// Bei allen anderen Positionen drehen wir uns nach rechts drehen |
|
|
|
|
|
else { |
|
|
|
|
|
lastMoveWasTurn = true; // Merker auf true, da wir uns gedreht haben |
|
|
|
|
|
return '>'; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Ermittle alle Positionen der Steine innerhalb des flachen Scans |
|
|
|
|
|
* @param row das Ergebnis von View.data (der Scan als String) |
|
|
|
|
|
* @return eine Liste mit den Positionen |
|
|
|
|
|
*/ |
|
|
|
|
|
private List<Integer> positionsOfRock (String row){ |
|
|
|
|
|
int index = row.indexOf('@'); |
|
|
|
|
|
ArrayList<Integer> positions = new ArrayList<>(); |
|
|
|
|
|
while (index >= 0) { |
|
|
|
|
|
positions.add(index); |
|
|
|
|
|
index = row.indexOf('@', index + 1); |
|
|
|
|
|
} |
|
|
|
|
|
return positions; |
|
|
|
|
|
} |
|
|
|
|
|
} |