12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- package bot;
-
- public class RumbleBot extends Bot {
-
- private int currentDirection = 1; // Variable, um die aktuelle Bewegungsrichtung des Rovers zu halten
- // 0 - oben, 1 - rechts, 2 - unten, 3 - links
-
- private boolean shouldFire; // wichtig um den Feuerstatus des Bots zu verfolgen
-
- // Konstruktor für RumbleBot
- public RumbleBot(String[] args) {
- super(args); //Konstruktor der Elternklasse wird aufgerufen
- this.shouldFire = false;
- }
-
- // Logik für den RumbleBot, der in Fahrtrichtung schießt
- @Override
- protected char nextMove(View view) throws Exception {
-
- // Wenn andere Bots in Sicht sind, wird abgefeuert
- if (isOtherBotInSight(view.data)) {
- shouldFire = true;
- }
-
- if (shouldFire) {
- shouldFire = false;
- return 'f';
- }
- // Bewegungsbefehl für die nächste Runde generieren
- char moveCommand = getNextMove(view.data, view.width);
-
- // Überprüfen, ob der Rover am Rand des Spielfelds ist und die Richtung ändern muss, um im Spielfeld zu bleiben
- int nextPosition = getNextPosition(view.data.indexOf('A'), view.width, moveCommand);
- if (nextPosition < 0 || nextPosition >= view.data.length() || view.data.charAt(nextPosition) == '#') {
- currentDirection++;
- moveCommand = getNextMove(view.data, view.width); // Neue Richtung erneut berechnen
- }
-
- return moveCommand;
- }
-
- // Methode zur Berechnung des nächsten Bewegungsbefehls
- private char getNextMove(String data, int width) {
- char moveCommand;
-
- // Aktuelle Bewegungsrichtung des Roboters festlegen
- int moveDirection = currentDirection % 4; // Modulo 4, um innerhalb des Bereichs von 0 bis 3 zu bleiben
-
- // Bewegungsbefehl entsprechend der aktuellen Richtung generieren
- switch (moveDirection) {
- case 0: // Hoch
- moveCommand = 'w';
- break;
- case 1: // Rechts
- moveCommand = 'd';
- break;
- case 2: // Runter
- moveCommand = 's';
- break;
- case 3: // Links
- moveCommand = 'a';
- break;
- default:
- moveCommand = ' ';
- break;
- }
-
- return moveCommand;
- }
-
- // Methode zur Berechnung der nächsten Position basierend auf der aktuellen Position und dem Bewegungsbefehl
- private int getNextPosition(int roverPosition, int width, char moveCommand) {
- switch (moveCommand) {
- case 'w': // Hoch
- return roverPosition - width;
- case 'd': // Rechts
- return roverPosition + 1;
- case 's': // Runter
- return roverPosition + width;
- case 'a': // Links
- return roverPosition - 1;
- default:
- return -1; // Ungültige Position
- }
- }
-
- // Methode zur Überprüfung, ob andere Bots in Sicht sind
- private boolean isOtherBotInSight(String data) {
- // Überprüft, ob andere Bots in Sicht sind (z.B., "^", "<", ">", "v" in der Karte)
- return data.contains("^") || data.contains("<") || data.contains(">") || data.contains("v");
- }
-
- // main Methode um den Bot zu starten
- public static void main(String[] args) {
- new RumbleBot(args).run();
- }
- }
|