Programmierwettbewerb für
Schülerinnen und Schüler
Oktober 2025 – April 2026
Das Spiel läuft in sogenannten Ticks ab. In jedem Tick bekommt der Bot Informationen über seine Umgebung (z. B. wo sich Wände und Gems befinden) und muss darauf basierend eine Aktion auswählen (z. B. »gehe nach Norden«). Der Bot läuft also in einer Endlosschleife, in der die folgenden Schritte passieren:
stdin
)stdout
)stderr
)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | { "config": { "stage_key": "stage-0@0.1", "width": 19, "height": 19, "generator": "cellular", "max_ticks": 1000, "vis_radius": 5, "max_gems": 1, "gem_spawn_rate": 0.05, "gem_ttl": 300, "bot_seed": 3851583338 }, "tick": 0, "bot": [13, 17], "wall": [[12, 14], [13, 14], ... ], "floor": [[12, 15], [13, 15], ... ], "visible_gems": [ { "position": [13, 15], "ttl": 100 } ] } |
Die Informationen, die der Bot erhält, werden im JSON-Format übermittelt (eine Zeile, ohne Zeilenumbrüche). Verwende die Möglichkeiten deiner Sprache, um die JSON-Daten zu parsen. Eine Nachricht könnte z. B. so aussehen wie hier abgebildet (hier wurde die Nachricht für bessere Lesbarkeit formatiert).
Unter config
findest du die Konfigurationsparameter des Runners – diese Werte werden nur im 1. Tick übermittelt. Hier erfährst du z. B., wie groß die Arena ist (width
und height
) und wie weit dein Bot sehen kann (vis_radius
). In bot_seed
findest du einen Seed, mit dem du den Zufallszahlengenerator deines Bots initialisiert kannst, wenn du möchtest. Du erfährst auch, wie viele Ticks eine Runde dauert (max_ticks
).
Der Seed, mit dem die Arena generiert wurde, ist geheim und wird nicht übermittelt.
Die Zahl in tick
gibt an, in welchem Tick sich der Runner gerade befindet (beginnend bei 0).
Unter bot
findest du die aktuelle Position deines Bots als [x, y]-Koordinaten – die linke obere Ecke hat die Koordinaten [0, 0]
, die rechte untere Ecke die Koordinaten [width-1, height-1]
.
In wall
und floor
findest du die Positionen der Wände und des Bodens, die dein Bot von seiner Position aus sehen kann (abhängig von vis_radius
und von Wänden, die die Sicht verdecken).
In visible_gems
findest du die Gems, die dein Bot momentan sehen kann (nach denselben Regeln wie bei Wänden und dem Boden). Jedes Gem hat eine Position position
und eine Lebensdauer (ttl
, time to live), die angibt, für wie viele Ticks das Gem noch auf der Karte bleiben wird. Wenn du dich auf ein Feld mit einem Gem bewegst, sammelst du es automatisch ein und bekommst die noch verbleibende TTL als Punkte gutgeschrieben.
Wenn du noch nie mit JSON gearbeitet hast, findest du hier einige Tutorials, die dir den Einstieg erleichtern:
Verarbeite die Eingabedaten und wähle eine Aktion aus. Es ist nicht schlimm, wenn du eine Aktion wählst, die nicht möglich ist (z. B. »gehe nach Norden«, obwohl im Norden eine Wand ist) – in diesem Fall passiert einfach nichts und dein Bot bleibt stehen. Die folgenden Aktionen sind möglich:
N
: Bewegung nach NordenE
: Bewegung nach OstenS
: Bewegung nach SüdenW
: Bewegung nach WestenWAIT
: Nicht bewegen (stehen bleiben)
Hinweis: Damit dein Bot am Wettbewerb teilnehmen kann, muss er deterministisch sein. Das bedeutet, dass sich dein Bot bei gleichen Karten und gleichen Eingabedaten immer gleich verhalten muss. Du kannst (und solltest) einen Zufallszahlengenerator verwenden, aber dieser darf nicht mit sich ändernden Werten (wie z. B. der aktuellen Uhrzeit oder der Process ID) initialisiert werden. Du kannst für das Seeding z. B. den Seed verwenden, der in bot_seed
übermittelt wird, oder eine Konstante, oder einen davon abgeleiteten Wert.
Der Bot-Seed ändert sich in jeder Runde und da alle Bots dieselben Arenen mit denselben Seeds durchlaufen, bekommt jeder Bot denselben rundenspezifischen Bot-Seed. Du kannst ihn auch ignorieren, wenn du möchtest.
Schreibe die ausgewählte Aktion auf die Standardausgabe (stdout
) und füge einen Zeilenumbruch hinzu. Wichtig: Achte darauf, dass du nur die Aktion schreibst und sonst nichts (kein zusätzliches Leerzeichen, keine Debug-Ausgabe).
flush
aufrufen). In den Beispiel-Bots ist das bereits berücksichtigt.
Wenn du möchtest, kannst du Kommentare auf die Standardfehlerausgabe (stderr
) schreiben, z. B. um den aktuellen Status deines Bots zu protokollieren.
Diese Kommentare werden vom Runner während einer Runde ausgegeben, aber nicht ausgewertet.