Crapy rumble bot

This commit is contained in:
Tim 2025-02-11 14:07:15 +01:00
parent 753bf1f5e9
commit d0ae96def8

93
src/RumbleBot.java Normal file
View File

@ -0,0 +1,93 @@
package src;
public class RumbleBot extends Bot {
int stepCounter = 0;
int turnCount = 0;
int viewRange = 30;
int straightLength = 1;
protected RumbleBot(String[] args) {
super(args);
}
public static void main(String[] args) {
RumbleBot bot = new RumbleBot(args);
bot.run();
}
@Override
protected char nextMove(View view) throws Exception {
// Definition der gegnerischen Symbole
String enemySymbols = "<>v^";
// Annahme: Sichtfeld ist 9x9, der Bot steht immer in der Mitte (Zeile 4, Spalte 4)
final int gridSize = 9;
final int centerRow = gridSize / 2; // 4
final int centerCol = gridSize / 2; // 4
// 1. Prüfe, ob sich ein Gegner in der direkten Schusslinie befindet.
// Dabei werden die Zellen in der zentralen Spalte oberhalb des Bots untersucht (Reihen 0 bis 3).
for (int row = 0; row < centerRow; row++) {
int index = row * gridSize + centerCol;
char cell = view.data.charAt(index);
if (enemySymbols.indexOf(cell) != -1) {
// Ein Gegner befindet sich direkt vor dem Bot feuere!
return 'f';
}
}
// 2. Falls kein Gegner in der Schusslinie ist, prüfe, ob überhaupt ein Gegner sichtbar ist.
// Wenn keiner der gegnerischen Symbole im Sichtfeld vorkommt, folgt das Standard-Bewegungsmuster.
if (view.data.indexOf('<') == -1 &&
view.data.indexOf('>') == -1 &&
view.data.indexOf('^') == -1 &&
view.data.indexOf('v') == -1) {
// Kein Gegner im Sichtfeld bewege dich gemäß dem Bewegungsmuster:
if (turnCount == 2) {
turnCount = 0;
straightLength++;
}
if (stepCounter < straightLength * viewRange) {
stepCounter++;
return '^';
} else {
stepCounter = 0;
turnCount++;
return '>';
}
}
// 3. Es ist ein Gegner sichtbar, allerdings nicht direkt in der Schusslinie.
// Bestimme, ob der Gegner eher links oder rechts liegt, und drehe in die entsprechende Richtung,
// um den Gegner in Zukunft in die Schusslinie zu bekommen.
boolean enemyOnLeft = false;
boolean enemyOnRight = false;
// Untersuche dazu alle Zellen des Sichtfelds:
for (int row = 0; row < gridSize; row++) {
for (int col = 0; col < gridSize; col++) {
int index = row * gridSize + col;
char cell = view.data.charAt(index);
if (enemySymbols.indexOf(cell) != -1) {
// Vergleiche die Spalte der Zelle mit der Mitte (centerCol)
if (col < centerCol) {
enemyOnLeft = true;
} else if (col > centerCol) {
enemyOnRight = true;
}
}
}
}
if (enemyOnLeft) {
return '<';
} else if (enemyOnRight) {
return '>';
}
// Sollte zwar ein Gegner sichtbar sein, aber weder links noch rechts als Fallback fahre vorwärts.
return '^';
}
}