In dieser Herausforderung musst du eine Spezies einzelliger Organismen entwerfen, um in der Petrischalen-Arena bis zum Tod zu kämpfen. Die Arena wird als rechteckiges Gitter dargestellt, wobei jede Zelle einen Raum einnimmt:
.....x....
...x...o..
...x.c..o.
.......o..
Attribute
Jede Zelle hat drei Attribute. Wenn Sie zu Beginn des Spiels Ihre Zellart angeben, weisen Sie diesen Attributen 12 Punkte zu.
- Trefferpunkte (HP): Wenn die HP einer Zelle auf Null fallen, stirbt sie. Neue Zellen haben volle HP.
- Wenn eine Zelle stirbt, hinterlässt sie eine Leiche, die von anderen Zellen zur Energiegewinnung gefressen werden kann.
- Eine Zelle kann verlorene HP nicht wiedererlangen, aber sie kann durch Teilen eine neue Zelle mit vollen HP erstellen.
- Energie : Die meisten Aktionen, die eine Zelle ausführen kann, erfordern Energie. Durch aktives Ausruhen kann eine Zelle verlorene Energie bis zum Maximum ihrer Spezies zurückgewinnen.
- Es ist wahrscheinlich, dass eine Zellart mit weniger als 5 Energie ausfällt, da sie sich nicht teilen kann, um neue Zellen zu erzeugen.
- Eine Zelle kann nicht über den Maximalwert ihrer Spezies hinaus Energie zurückgewinnen.
- Bei einer neu erstellten Zelle wird ein anfänglicher Energiewert von ihrem übergeordneten Element kopiert (und ein maximaler Wert, der durch die Spezifikation der Art vorgegeben wird).
- Säure : Wenn eine Zelle explodieren möchte, wird der Säuregrad der Zelle zur Berechnung des Schadens benachbarter Zellen herangezogen.
Aktionen
In jeder Runde kann jede Zelle eine Aktion ausführen:
Bewegen: Die Zelle bewegt sich um ein Feld in eine beliebige Richtung (N / S / E / W / NE / NW / SE / SW) zu einem Preis von 1 Energie.
- Eine Zelle kann sich nicht auf ein Feld bewegen, auf dem sich eine andere lebende Zelle befindet.
- Eine Zelle kann das Gitter nicht verlassen.
- Das Betreten einer Leiche zerstört die Leiche.
Angriff: Eine Zelle greift eine benachbarte Zelle an und verursacht 1 bis 3 Schadenspunkte, indem sie 1 bis 3 Energiepunkte verbraucht.
- Eine Zelle kann in jede Richtung angreifen (N / S / E / W / NE / NW / SE / SW).
- Es ist legal, freundliche Zellen anzugreifen.
Teilen: Die Zelle teilt sich und erzeugt eine neue Zelle auf einem angrenzenden Feld. Die Kosten betragen 5 Energiepunkte.
- Eine Zelle kann sich in jede Richtung teilen (N / S / E / W / NE / NW / SE / SW).
- Die neue Zelle hat volle HP gemäß Ihrer ursprünglichen Zellenspezifikation.
- Die neue Zelle hat nach Abzug der Teilungskosten so viel Energie wie ihre Mutterzelle. (Zum Beispiel wird eine Elternzelle mit anfänglichen 8 Energiepunkten auf 3 Energiepunkte reduziert und eine Kinderzelle mit 3 Energiepunkten erzeugt).
- Eine neue Zelle kann erst in deiner nächsten Runde aktiv werden.
- Eine Zelle kann sich nicht in einen Raum teilen, der von einer lebenden Zelle besetzt ist, sondern in einen Raum, der von einer Leiche mit toten Zellen besetzt ist (dies zerstört die Leiche).
Essen: Eine Zelle isst eine benachbarte Leiche und gewinnt 4 Energie.
- Eine Zelle kann in jede Richtung essen (N / S / E / W / NE / NW / SE / SW).
Pause: Eine Zelle tut für eine Runde nichts und gewinnt 2 Energie zurück.
Explodieren: Wenn eine Zelle 3 oder weniger HP und mehr Energie als HP hat, kann sie explodieren und allen acht benachbarten Zellen Schaden zufügen.
- Schaden an jeder benachbarten Zelle ist
(exploding cell HP) + (explodng cell acidity)
- Eine explodierte Zelle stirbt und hinterlässt eine Leiche, ebenso wie alle Zellen, die bei der Explosion getötet wurden.
- Schaden an jeder benachbarten Zelle ist
Protokoll
Installieren
Ihr Programm wird mit der BEGIN
in stdin angegebenen Zeichenfolge ausgeführt . Ihr Programm muss so schreiben, dass eine durch Leerzeichen getrennte Liste mit 3 nicht negativen ganzen Zahlen erstellt wird, die HP, Energie und Säure für Ihre Zellspezies darstellen: z 5 6 1
. Die Zahlen müssen sich zu 12 summieren. Die Säure kann sein 0
, wenn Sie es wünschen. (Andere Attribute können auch Null sein, aber wenn Sie dies tun, verfällt das Spiel!)
Sie beginnen mit einer Zelle in der nordwestlichen oder südöstlichen Ecke, ein Feld von jeder Kante entfernt. Die Anfangszelle hat volle HP und Energie.
Jede Zelle handelt
In jeder Runde wird Ihr Programm einmal für jede Zelle Ihres Teams aufgerufen (mit Ausnahme der Zellen, die gerade in dieser Runde erstellt wurden), damit die Zelle aktiv werden kann. Ihr Programm enthält Daten zu stdin, die den Petrischalenstatus und Informationen zu dieser bestimmten Zelle enthalten:
10 4
..........
..xx.c....
...c...o..
......o...
6 3 5 7
Die ersten beiden Zahlen geben die Breite und Höhe der Arena an: Hier gibt es eine 10-mal-4-Arena.
- Die
o
Zellen gehören dir. Diex
Zellen sind deine Feinde. (Dies ist immer wahr; jeder Spieler sieht immer seine eigenen Zellen also
.) - Die
.
Räume sind leer. - Die
c
Räume stellen essbare Zellkörper dar.
Die Zahlen nach der leeren Zeile stellen Informationen zu dieser Zelle dar:
- Die ersten beiden Zahlen sind
x,y
Koordinaten, die von0,0
oben links indiziert werden (6 3
bezieht sich hier also auf die südlichsteo
Zelle). - Die dritte Zahl ist die HP der Zelle; Die vierte Zahl ist die Energie der Zelle.
Ihr Programm sollte eine Aktion ausgeben (um sie auszugeben). In den folgenden Beispielen wird N
als Beispiel eine Richtung verwendet, die jedoch für diese Aktion in jeder Richtung zulässig sein kann ( N
/ S
/ E
/ W
/ NE
/ NW
/ SE
/ SW
). Bei allen Programmausgaben wird die Groß- / Kleinschreibung nicht berücksichtigt, in den Beispielen wird jedoch Großbuchstabe verwendet. Jede ungültige Ausgabeaktion (entweder weil sie eine ungültige Syntax hat oder eine unzulässige Aktion versucht) wird ignoriert und führt dazu, dass die Zelle REST
aktiviert wird (und somit 2 Energie gewonnen wird).
MOVE N
DIVIDE N
EAT N
ATTACK N 2
- die Zahl gibt die Stärke des Angriffs an (1 - 3)REST
EXPLODE
Ihr Team ist an der Reihe, alle Ihre Zellen erhalten die Möglichkeit, nacheinander zu handeln. Alle Ihre Zellen handeln, bevor die Zellen des Gegners handeln. Sobald alle deine Zellen aktiv sind, endet dein Zug und der Zug deines Gegners beginnt. Sobald alle Zellen deines Gegners aktiv sind, beginnt dein Zug erneut. In deinem Zug erhält jede Zelle die Priorität, basierend auf ihrem Alter zu handeln: Die ältesten Zellen in deinem Team handeln zuerst, bevor jüngere Zellen.
Beispiel
So könnte sich ein Programm verhalten. Die Eingabe von stdin wird hier mit führenden >
Pfeilen gekennzeichnet (von der tatsächlichen Eingabe durch ein klares Leerzeichen getrennt) und die Ausgabe von stdout hat <
Pfeile.
> BEGIN
< 5 6 1
Dann wird das Programm erneut aufgerufen:
> 10 4
> ..........
> .o........
> ........x.
> ..........
>
> 1 1 5 6
< DIVIDE SE
Nach dem Zug deines Gegners (der sich für DIVIDE W
die einzelne Startzelle entschieden hat) wird dein Programm zweimal aufgerufen, einmal für jede Zelle:
> 10 4
> ..........
> .o........
> ..o....xx.
> ..........
>
> 1 1 5 1
< MOVE E
Für den zweiten Aufruf in deinem Zug:
> 10 4
> ..........
> ..o.......
> ..o....xx.
> ..........
>
> 2 2 5 1
< MOVE SE
Beachten Sie, dass in dieser zweiten Zelle der aktualisierte Board-Status basierend auf der Bewegung der anderen Zelle zu Beginn Ihres Zuges angezeigt wird. Beachten Sie auch, dass diese Zelle mit 1 Energie erzeugt wurde, da die übergeordnete Zelle bei der letzten Teilung 6 Energie hatte (die ursprüngliche 6, abzüglich der 5-Energie-Teilungskosten, erzeugte eine untergeordnete Zelle mit 1 Energie).
Jetzt ist dein Zug vorbei und der Zug deines Gegners beginnt. Die beiden gegenüberliegenden Zellen erhalten eine Chance zu handeln, und dann beginnt Ihr nächster Zug.
Sieg
Sie können gewinnen, indem Sie entweder:
- Zerstöre alle gegnerischen Zellen, oder
- Nachdem jeder Spieler 150 Runden absolviert hat, hat er mehr Zellen als dein Gegner
Die Wertung basiert auf der Anzahl der Siege in 100 Spielen gegen die jeweils andere Einsendung. In der Hälfte der Simulationen darf Ihr Programm zuerst gestartet werden.
Gleichstandspiele (dh genau die gleiche Anzahl von Zellen nach 150 Runden oder die einzigen verbleibenden Zellen, die bei einer Explosion zusammen getötet werden) werden nicht in den Gewinnsummen der beiden Spieler gezählt.
Andere Informationen
- Ihr Programm sollte nicht versuchen, den Zustand beizubehalten (über die Verwendung des Zustands der Petrischale hinaus): einzellige Organismen haben kein sehr gutes Gedächtnis und reagieren von Moment zu Moment auf die Welt. Insbesondere das Schreiben in eine Datei (oder einen anderen Datenspeicher), die Kommunikation mit einem Remoteserver oder das Festlegen von Umgebungsvariablen sind ausdrücklich nicht zulässig.
- Einsendungen werden unter Ubuntu 12.04.4 ausgeführt / kompiliert.
- Die Einzelheiten der 100 Punktespiele sind noch nicht bestätigt, aber sie werden wahrscheinlich mehrere Arenagrößen umfassen (z. B. 50 Läufe auf einer kleinen Arena und 50 Läufe auf einer größeren Arena). Für eine größere Arena kann ich die maximale Anzahl an Runden erhöhen, um sicherzustellen, dass ein ordnungsgemäßer Kampf stattfinden kann.
Ressourcen
Hier ist der Treibercode , mit dem die für Node.js geschriebene Simulation ausgeführt wird, die von aufgerufen wird node petri.js 'first program' 'second program'
. Beispielsweise könnte es so aussehen, wenn eine mit Python geschriebene Zelle mit einer mit Java geschriebenen Zelle verglichen wird node petri.js 'python some_cell.py' 'java SomeCellClass'
.
Außerdem ist mir klar, dass das Lesen und Parsen mehrerer Zeilen auf stdin ein großer Aufwand sein kann. Daher habe ich einige vollständige Beispielzellen in verschiedenen Sprachen entworfen, auf denen Sie aufbauen, vollständig überarbeiten oder vollständig ignorieren können.
- Java-Zelle
- Python-Zelle
- JavaScript-Zelle (zur Verwendung mit Node.js)
Natürlich steht es Ihnen frei, eine Zelle in einer anderen Sprache zu schreiben. Das sind einfach drei Sprachen, für die ich mich entschlossen habe, als zeitsparende Hilfe einen Code für das Boilerplate zu schreiben.
Wenn Sie Probleme beim Ausführen des Treibers haben, können Sie mich gerne in dem Chatroom anpingen, den ich für diese Herausforderung erstellt habe . Wenn Sie keinen ausreichenden Ruf für den Chat haben, hinterlassen Sie einfach einen Kommentar.
'node c:/cell/cell_template.js'
für jedes Argument einen vollständig ausführbaren Befehl wie'java CellTemplate'
für den Java-Code angeben . Das werde ich im Aufforderungstext verdeutlichen. Wenn Sie immer noch Probleme haben, können wir (und alle anderen mit technischen Problemen) diese Diskussion in einem Chatroom fortsetzen, den ich gerade erstellt habe .