„CollectBot.java“ ändern
This commit is contained in:
parent
d7f85e7568
commit
3cbdec4e66
135
CollectBot.java
135
CollectBot.java
@ -1,72 +1,83 @@
|
||||
package bot;
|
||||
|
||||
public class CollectBot extends Bot {
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public CollectBot(String[] args) {
|
||||
super(args);
|
||||
public class CollectBot extends Bot{
|
||||
boolean lastMoveWasTurn = false; // Merker, ob der letzte Zug eine Drehung war
|
||||
|
||||
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 = '^';
|
||||
}
|
||||
|
||||
@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"
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
return nextPosition;
|
||||
}
|
||||
|
||||
// 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
|
||||
else {
|
||||
if (!stoneDetected)
|
||||
nextMove = '^';
|
||||
else {
|
||||
nextMove = calculateNextMove(view);
|
||||
}
|
||||
}
|
||||
return nextMove;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
new CollectBot(args).run();
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user