Die Herausforderung

Dieses Semester wird interaktiv. Wir spielen 2048.

Screenshot
Screenshot

Hierbei werden Steine auf einem quadratischen Spielfeld zwischen den vier Wänden hin und hergeschoben. Tragen zwei benachbarte Steine dabei den gleichen Wert, so werden diese zu einem Stein doppelten Wertes zusammen geschoben. Jede Verschmelzung bringt entsprechend des Wertes des entstanden Steins Punkte.

Die Herausforderung in diesem Wettbewerb ist es eine KI zu entwickeln, welche in der Lage ist, das Spiel zu spielen. Um Verwirrungen um Regeldetails zu eliminieren gibt es einen Spiel-Client, welcher ein KI-Programm ausführen kann.

Der Spiel-Client

Der [Spiel-Client][client] kommuniziert ausschließlich über die Standard Ein- und Ausgabe.

Vor jeden Zug erhaltet die KI das aktuelle Spielfeld als Tupel von Listen. Jede Liste entspricht einer Zeile des Spielfeldes, jedes Element einer Liste einem einzelnem Spielstein. Eine Zelle mit dem Stein 0 ist eine leere Zelle. Das Spielfeld wird grundsätzlich in einer einzigen Zeile übertragen.

Beispiel für den obigen Screenshot:
([2, 0, 0, 2],[16, 4, 0, 0],[4, 64, 8, 0],[2, 8, 4, 2])\n

Die KI gibt dann einen einzigen Buchstaben aus, welcher die Richtung angibt, in welche alle Steine bewegt werden.

N - Oben
E - Rechts
S - Unten
W - Links

Alle Zeichen die keiner Richtung entsprechen, sowie Züge die keine Veränderung des Spielfeldes hervorrufen erzeugen keinen neuen Stein auf dem Spielfeld, setzen aber den Rundenzähler einen weiter. In diesem Fall wird das unveränderte Spielfeld erneut übertragen.

Aufrufparameter

Anders als das Original kann diese Variante über die Aufrufparameter angepasst werden.

Der letzte Parameter ist der Name des KI-Programms. Weil dieses direkt ausgeführt wird sind Pipes oder ähnliches nicht möglich. Wird kein Programm angegeben, wird das Spiel im interaktiven Modus gestartet.

Versionshistorie

Beispielaufruf und -ausgabe

Gezeigt sind die ersten für die ersten 3 Züge (Clientversion 1.1)

>python -u game.py -v -s 5 --seed 0xDEADBEEF -g "[(2,4),(4,1)]" "python -u ryhotk.py"
   0       0       0       0       2
   0       2       0       0       0
   0       0       0       0       0
   0       0       0       0       0
   0       0       0       0       0

Round:       0/   1000 Points: 000000000 Best:    2    Seed: 0xDEADBEEF
Rule: [2, 2, 2, 2, 4]
Input: ([0, 0, 0, 0, 2],[0, 2, 0, 0, 0],[0, 0, 0, 0, 0],[0, 0, 0, 0, 0],[0, 0, 0, 0, 0])
Key: n
   0       2       0       0       2
   0       0       0       0       0
   0       0       0       4       0
   0       0       0       0       0
   0       0       0       0       0

Round:       1/   1000 Points: 000000000 Best:    4    Seed: 0xDEADBEEF
Rule: [2, 2, 2, 2, 4]
Input: ([0, 2, 0, 0, 2],[0, 0, 0, 0, 0],[0, 0, 0, 4, 0],[0, 0, 0, 0, 0],[0, 0, 0, 0, 0])
Key: s
   0       0       0       0       0
   0       0       0       0       0
   0       0       0       0       0
   2       0       0       0       0
   0       2       0       4       2

Round:       2/   1000 Points: 000000000 Best:    4    Seed: 0xDEADBEEF
Rule: [2, 2, 2, 2, 4]
Input: ([0, 0, 0, 0, 0],[0, 0, 0, 0, 0],[0, 0, 0, 0, 0],[2, 0, 0, 0, 0],[0, 2, 0, 4, 2])
Key: w
   2       0       0       0       0
   0       0       0       0       0
   0       0       0       0       0
   2       0       0       0       0
   2       4       2       0       0

Der Shoot-Out

Jeder Teilnehmer erhält für den Shoot-Out einen Rechner im Rechenzentrum. Auf dem Rechner wird der Spiel-Client gestartet, welcher mit den Kontroll-Server kommuniziert. Der Spiel-Client startet dann für jede Runde das KI-Programm.

Es werden mehrere Runden gespielt. In jeder Runde werden die Parameter, wie Auftrittswahrscheinlichkeiten oder die Spielfeldgröße angepasst. Durch den Pseudozufallszahlen-Generator haben bei gleicher Zugfolge zwei Programme ein identisches Spiel, was die Vergleichbarkeit gewährleistet.

Die Zeit zwischen zwei Zügen wird beschränkt sein, sodass es möglich ist, den einzelnen Zügen zu folgen. Die Programme müssen jedoch nicht aufeinander warten, es kann also sein, dass ein langsames Programm weniger Züge pro Sekunde macht als ein schnelles.

Verschiedene Abbruchkriterien definieren das Ende einer Runde. Am Ende jeder Runde wird eine Rangliste erstellt. Der Erstplatzierte erhält 12 Punkte, der Zweite 10 Punkte, der Dritte 8 Punkte, die Plätze 4 bis 11 erhalten entsprechend 7 bis 1 Punkte. Wer zum Ende des Wettbewerbs die meisten Punkte hat, der ist der Gesamtsieger.

Mögliche Abbruchkriterien