Spielen wir eine Partie Meta Tic-Tac-Toe!
Dies ist ein King-of-the-Hill- Turnier von Meta Tic Tac Toe. Die Regeln von Meta-Tic-Tac-Toe lauten wie folgt:
Es gelten alle regulären Tic-Tac-Toe-Regeln.
Es gibt neun Tafeln, die so angeordnet sind, dass sie eine Haupttafel bilden. Wie so:
0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8
Brett 0 bezieht sich auf das obere linke Brett, Brett 1 bezieht sich auf das obere mittlere Brett ... so
0|1|2 ----- 3|4|5 ----- 6|7|8
Wenn ich Tafel 3, Kachel 4 sage, bedeutet das die mittlere Kachel der Tafel in der Mitte links.
Sie dürfen sich nur in einem der kleineren Bretter bewegen.
Wenn Sie eines der kleineren Bretter gewinnen, zählt dieses gesamte Brett als Ihr Plättchen.
Wenn eines der Bretter gefüllt wird, bevor ein Bot es gewonnen hat, zählt es als Nobodies Plättchen.
Wer das Master Board gewinnt, gewinnt!
Es gibt jedoch eine wichtige Wendung. Angenommen, ich gehe in Tafel 7, Kachel 2. Das bedeutet, dass Sie an der Reihe sind und nur in Tafel 2 gehen können. Angenommen, Sie gehen in Tafel 2, Kachel 5. Jetzt bin ich an der Reihe und kann nur in Tafel 5 gehen. Angenommen, Board 1 ist voll. (Es sind keine Plätze mehr frei, oder einer von uns hat bereits Brett 1 gewonnen.) Wenn ich jetzt Brett 5, Kachel 1, betrete, kannst du eines der gewünschten Bretter einsetzen.
Diese Regeln können betrachtet werden als:
- Sie müssen auf dem Brett spielen, das der Position des vorherigen Spielers entspricht.
- Wenn X in Brett 2 spielt, Fliese 5; O muss in Board 5 spielen
- Wenn das Zielbrett voll ist (Unentschieden) oder bereits einen Sieger hat, ist der nächste Zug uneingeschränkt.
- Ein Brett mit einem Gewinner kann nicht in gespielt werden, auch auf einer unbeschränkte Bewegung.
Wenn dies etwas verwirrend ist, können Sie es hier online ausprobieren . (Stellen Sie sicher, dass Sie von "Gewinner der ersten Kachel" zu "3 Kacheln in Folge" wechseln.)
Hier sind die Regeln der Herausforderung.
Sie müssen einen Bot schreiben, der dieses Spiel spielt.
Bot 1 ist Xs, und es muss zuerst gehen. Es wird mit den folgenden Befehlszeilenargumenten aufgerufen (ohne die Angaben in Klammern):
X (whose turn) --------- (board 0) --------- (board 1) --------- (board 2) --------- (board 3) --------- (board 4) --------- (board 5) --------- (board 6) --------- (board 7) --------- (board 8) --------- (master board) xx (last move)
Das erste Zeichen repräsentiert, wer der Bot ist. In diesem Fall spielt Bot 1 als X. Die nächsten 9 Zeilen beziehen sich auf die 9 Bretter. Die 11. Zeile bezieht sich auf die Hauptplatine. Das "xx" ist der letzte Zug. Jetzt muss bot1 zwei Zahlen zwischen 0 und 8 ausgeben. Nummer 1 ist die Tafel, auf die sich Ihr Bot bewegt, und Nummer 2 ist die Kachel auf dieser Tafel. Der Controller wird diese Bewegung verfolgen. Angenommen, Bot 1 druckt 38. Jetzt sieht das Board so aus:
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | |
und bot2 werden mit folgenden Argumenten aufgerufen:
O --------- --------- --------- --------X --------- --------- --------- --------- --------- --------- 38
Jetzt muss Bot 2 in Board 8 ziehen (weil Bot 1 ein x in das Feld 3 gelegt hat). Angenommen, bot2 druckt 84. Jetzt sieht das Board so aus.
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || |O| ----- || ----- || ----- | | || | | || | |
Nun wird bot1 mit folgenden Argumenten aufgerufen:
X --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- 84
Jetzt muss bot1 in Board 4 ziehen. Allerdings ist bot1 ein frecher kleiner Bot und entscheidet sich, in Board 3 zu ziehen. Er gibt '30' aus. Das Board ändert sich überhaupt nicht. Der Master-Bot verfolgt dies. Nun wird bot2 mit folgenden Argumenten aufgerufen:
O --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- xx
Jetzt kann Bot 2 überall hingehen (außer natürlich 38 und 84). Dies wird fortgesetzt, bis jemand 3 der Master-Boards in einer Reihe gewinnt. Dann gibt es ein zweites Matchup, bei dem bot2 X ist und zuerst loslegen darf.
Dies wiederholt sich, bis jeder einzelne Bot gegen jeden anderen Bot gespielt hat.
Wertung
Die Wertung funktioniert so:
Der Gewinner eines Spiels erhält 100 + number of open spots
Punkte. Auf diese Weise ist es wertvoller, wenn Ihr Bot schnell gewinnt. Jedes Mal, wenn Ihr Bot einen ungültigen Zug ausführt, verliert er 1 Punkt. Wenn nach 250 Runden keiner der Bots gewonnen hat, verliert jeder Bot 10 Punkte und wir fahren mit der nächsten Runde fort.
Alles wird in ein Verzeichnis gestellt, das enthält
Der Controller-Bot. Dies ist ein C ++ - Programm, das ich geschrieben habe. Den Quellcode des Controllers können Sie hier einsehen . Bitte lassen Sie mich wissen, wenn Sie etwas sehen, das mit dem Controller nicht stimmt.
Eine Textdatei mit dem Namen
instructions.txt
Diese Datei sieht ungefähr so aus:[Total number of bots that are competing] [bot1Name] [bot1 command to run] [bot2Name] [bot2 command to run] ...
Ein Ordner für jeden Bot. Dieser Ordner enthält Ihr Programm (ob Skript oder Binärdatei) und EINE Textdatei
data.txt
, die Ihr Bot lesen und schreiben kann, was er will.
Technische Spezifikationen und Regelklärungen
Jeder Bot, der versucht, etwas zu lesen oder zu schreiben, das sich nicht in seinem Ordner befindet, wird aus dem Spiel ausgeschlossen.
Ihr Programm muss auf einem Macbook mit Yosemite ausgeführt werden können. Derzeit unterstützte Sprachen sind Python (2.7.9 und 3.4.2), C / C ++, Objective-C, Perl, Ruby, Bash, PHP, Java, C #, Javascript und Haskell. Es gibt noch viel mehr, aber das sind nur die, an die ich gerade denken kann. Ich werde im Laufe der Zeit mehr hinzufügen. Wenn Sie in einer bestimmten Sprache antreten möchten, schreiben Sie mir oder kommentieren Sie, und ich werde es der Liste hinzufügen, wenn möglich.
Wenn ein Brett gewonnen wird, aber noch Platz vorhanden ist, können Sie sich immer noch nicht auf einem der freien Plätze bewegen.
Beachten Sie, dass das Arbeitsverzeichnis Ihrer Übermittlung das Verzeichnis ist, das den Controller und alle anderen Bots enthält, NICHT das Verzeichnis, das Ihren Bot enthält.
Bitte geben Sie zusammen mit Ihrem Controller-Bot-Code den richtigen Befehl ein, um (falls zutreffend) zu kompilieren und Ihren Bot auszuführen. Das meiste davon wird über das OS X-Terminal erledigt, das einem Linux-Terminal ziemlich ähnlich ist.
Bots müssen in weniger als einer Sekunde fertig sein. Leider bin ich nicht kompetent genug, um dem Controller-Bot einen Timer hinzuzufügen. Ich werde die Bots jedoch manuell zeitlich festlegen.
Ergebnisse!
Nun, ich hatte recht. Ich habe vergessen, dass der Controller-Bot überprüft, ob das MasterBoard voll ist. Wenn das MasterBoard voll ist, ist JEDER Zug ungültig, ruft aber weiterhin die Bots auf, was wahrscheinlich der Grund dafür ist, dass es so viele ungültige Züge gab. Ich habe es jetzt behoben. Hier sind die offiziellen Ergebnisse mit der aktuellsten Version aller Bots.
Bot 1, goodRandBot, has 1 wins and made 0 illegal moves, for a total of 133 points.
Bot 2, naiveBot, has 3 wins and made 48 illegal moves, for a total of 361 points.
Bot 3, depthBot, has 5 wins and made 0 illegal moves, for a total of 664 points.
Bot 4, middleBot, has 1 wins and made 20 illegal moves, for a total of 114 points.
With 4 bots, This program took 477.471 seconds to finish.
Depth Bot ist der amtierende Champion! Zumindest für den Moment.
XXX000---
das übertragen wird? oder ist das ein "niemand bekommt es, obwohl O es zuerst gewonnen hat"?