Prog3A-Bot/SnakeBot.java

84 lines
2.5 KiB
Java
Raw Permalink Normal View History

2025-02-10 13:27:11 +01:00
import java.util.ArrayList;
import java.util.List;
public class SnakeBot extends Bot{
boolean lastMoveWasTurn = false; // Merker, ob der letzte Zug eine Drehung war
public static void main(String[] args) {
Bot snakeBot = new SnakeBot(args);
snakeBot.run();
}
protected SnakeBot(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; // Merke fuer die letzte Drehung zuruecksetzen
nextMove = '^';
}
else {
if (!stoneDetected)
nextMove = '^';
else {
nextMove = calculateNextMove(view);
}
}
return nextMove;
}
/**
* 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 '<';
}
// 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;
}
}