aBOTcalypse
Entwerfe einen Bot, um an einer King-of-the-Hill-Herausforderung teilzunehmen! Hier ist eine Wiederholung eines Standard-Bot-Spiels.
Das Board ist 2D, wie ein Side-Scrolling-Videospiel (jedoch ohne Scrollen).
Ein gültiger Bot muss eine mehrzeilige Zeichenfolgendarstellung des Bereichs der Karte akzeptieren, den er sehen kann, und eine Bewegung für den Bot ausgeben.
Mechanik
Dies ist ein Überlebensspiel. Die Apokalypse ist gekommen und nur noch Bots (und ein endloser Vorrat an Steinen, die im Hammerspace gespeichert sind ) sind übrig. Jeder Bot erhält einen zufälligen Startort auf Höhe 0. In einer bestimmten Bewegung kann sich ein Bot ausruhen, bewegen, einen Stein werfen oder einen Stein fallen lassen. Bots können den Raum mit stationären Steinen teilen, aber ein Bot, der mit einem anderen Bot oder einem Meteor kollidiert, wird getötet, ebenso wie ein Bot, der von einem geworfenen Stein getroffen wird.
- Schwerkraft: Bots und Steine müssen auf dem Boden des Bretts oder auf einem anderen Stein ruhen. Wenn man sich auf etwas anderem ausruht (Luft, Meteor, Bot usw.), bleibt man "nicht unterstützt". Nicht unterstützte Bots oder Steine fallen, bis sie unterstützt werden. Ein Sturz von mehr als einem Feld tötet einen Bot, und ein Bot unter einem fallenden Stein oder Bot wird ebenfalls getötet. Dies bedeutet, dass der Versuch, sich zu bewegen oder nach oben zu fallen, nur funktioniert, wenn der Bot gerade ein Feld mit einem Stein teilt (andernfalls fällt der Bot / Stein 1 Feld zurück). Ein Raum kann "nicht unterstützt" werden, wenn der darunter liegende Stein fällt oder von einem Meteor oder Projektil zerstört wird .
- Meteore: In jeder Runde betritt ein Meteor von oben das Brett. Ein Meteor hat eine Geschwindigkeit der Größe 2 mit einem zufälligen Winkel, der gleichmäßig im Bereich [-180,0] gewählt wird, und einer zufälligen Startposition x. Meteore fallen in einer geraden Linie entlang der vorgegebenen Flugbahn, bis sie auf etwas treffen. An diesem Punkt verschwinden sie. Beachten Sie, dass die Rundung in der Bewegung eines Meteors in Richtung 0 erfolgt (gemäß Python
int()
). - Projektile: Ein Bot kann einen Stein in beliebiger Entfernung bis zu seiner Höhe werfen. Ein geworfener Stein bewegt sich in einer geraden Linie, bis er auf etwas trifft (alles in einer Runde, im Gegensatz zu einem Meteor; geworfene Steine erscheinen nicht auf dem Brett), an einem Hang von
- elevation / max distance
. Beachten Sie, dass geworfene Steine ihre Flugbahn bei x + - 1 Quadrat beginnen. Befindet sich ein Bot beispielsweise auf einer Höhe von 5 und wirft er einen Abstand von 1 nach links, beginnt(x-1,5)
und endet der Stein bei(x-2,0)
. Die Kollision wird nur in Schritten von geprüftdx=1
unddy
auf 0 gerundet (gemäß Pythonint()
).
Eingang
Jeder Bot kann ein Quadrat von 20 Pixeln in jeder Richtung (Chebyshev-Abstand = 20) bis zu den Grenzen des Bretts sehen. Jede Eingabezeichenfolge enthält 8 verschiedene Zeichen:
'#'
(Brettgrenze)'.'
(Luft)'@
'(Meteor)'&'
(Felsen)'e'
/'s'
(ein feindlicher Bot oder sich selbst)'E'
/'S'
(ein feindlicher Bot oder sich selbst, der ein Feld mit einem Stein teilt)
Hier ist eine Beispieleingabe (Zeilenumbrüche werden angezeigt \n
):
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............@...............#
.....................E........#
.....................&........#
.....................&........#
.....................&........#
.....................&........#
...........@.........&........#
....................s&........#
###############################
Ausgabe
Es gibt vier Aktionen, die ein Bot in jeder Runde ausführen kann.
rest
(buchstäblich sitzen und nichts tun)move <direction>
bewegt den bietet einen Raum in jedem der vier Richtungen,up
,down
,left
, oderright
. Durch Bewegung fällt der Bot, wenn der neue Raum nicht vom Boden oder einem Stein getragen wird (fall > 1 = bot.kill()
).drop <direction>
platziert ("Tropfen") einen Stein in der angegebenen Richtung. Wenn Sie einen Stein nach oben fallen lassen (dh einen Stein auf das Quadrat legen[bot_x, bot_y+1]
) oder zur Seite legen , fällt er bis zur Unterstützung (möglicherweise fällt er währenddessen auf den Botdrop up
).drop down
Platziert einen Stein an der gleichen Position wie der Bot, wenn dort noch kein Stein ist.throw <direction> <distance>
wirft einen Stein gemäß der obigen "Projektil" -Mechanik mit der angegebenen maximalen Entfernung. Die maximale Entfernung ist für das Werfen nach oben oder unten irrelevant - das Projektil kollidiert mit dem Quadrat unter (fürdown
) oder versucht, mit dem Quadrat über (fürup
) und dann mit dem Quadrat des Bots zu kollidieren, wenn es nichts trifft (den Bot töten). .
Ein Bot im Wettbewerb muss beim Empfang der Eingabezeichenfolge eine skalare Zeichenfolge mit ihrer Aktion ausgeben.
Schnittstelle
Ein Bot muss aus einem einzigen Programm bestehen, das über eine Python 2 aufgerufen werden kann subprocess
. Alle Befehle sollen angegeben werden, und werden in einer Datei mit dem Namen gespeichert werden command.txt
; Bevor ein Spiel beginnt, führt der Controller jeden Befehl der command.txt
Reihe nach aus. Anschließend wird der letzte Befehl verwendet, um die Eingabe an den Bot weiterzuleiten.
Ein Bot kann eine einzelne Speicherdatei storage.txt
in seinem Ordner haben. Der Bot "Default Thrower" zeigt eine Beispielimplementierung, bei der json verwendet wird, um seinen Status während verschiedener Runden zu speichern. Sie können die Debugging-Ausgabe auch in eine Nur-Schreib-Ausgabe aufnehmen errlog.txt
, die ich weitergeben werde, falls Ihr Bot während eines Laufs ausfällt. Ich werde sicherstellen, dass mit jedem Bot mehrere Tests durchgeführt werden, um Fehler im Voraus zu finden.
Wertung
Die Gesamtpunktzahl eines Bots entspricht der Anzahl der Runden, die er überlebt hat und die sich über X Spiele mit maximaler Länge Y angesammelt haben X,Y = 10, 500
. Wenn Bots eine lange Zeit dauern, werde ich Y erhöhen, und wenn sie eine kurze Zeit dauern, werde ich X erhöhen.
Der Controller-Code befindet sich in controller.py . Vielen Dank an @Nathan Merrill für sein DDOS-Koth, von dem ich den Communicator-Code angepasst habe.
&&&\n&S&\n###
. Sie wären für fallende Meteore unverwundbar.