Browse Source

„CollectBot.java“ ändern

master
Jasmin Zieroth 3 months ago
parent
commit
3cbdec4e66
1 changed files with 71 additions and 60 deletions
  1. 71
    60
      CollectBot.java

+ 71
- 60
CollectBot.java View File

@@ -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);
}

@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;
}
}

Loading…
Cancel
Save