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.
quelle
XXX000---
das übertragen wird? oder ist das ein "niemand bekommt es, obwohl O es zuerst gewonnen hat"?Antworten:
Python 2.7, Tiefe
Eine Alpha-Beta-Bereinigungsimplementierung ohne allzu ausgefallene Elemente. Es wird versucht, die Bewegungen weniger naiv anzuordnen, um die Alpha-Beta-Eliminierungen zu maximieren. Ich werde wahrscheinlich versuchen, es zu beschleunigen, aber ehrlich gesagt weiß ich nicht, wie wettbewerbsfähig Python sein kann, wenn es um Geschwindigkeit geht.
Um es auszuführen, können Sie es einfach tun
python Depth.py <input>
, obwohl ich vorschlagen würde, es zu verwenden,pypy
da es es merklich beschleunigt.Ich weiß auch nicht, wie schnell Ihr System ist, aber Sie können das erste Argument
DepthPlayer
ganz am Ende so ändern , dass es höher ist, wenn es noch in der angegebenen Zeit ausgeführt werden kann (auf meinem System hat es fast alle Dinge sehr schnell mit einer Tiefe von abgeschlossen) 7 oder 8, aber es gab einige Fälle, die in der Nähe oder oberhalb einer Sekunde lagen, so dass ich sie sicherheitshalber auf 6 stellte).quelle
sys.argv
gibt keine durch Zeilenumbrüche getrennte Zeichenfolge zurück. Es gibt eine Liste von Zeichenfolgen in diesem Format:['Depth.py', 'X', '---------', '---------', ...]
Ich habe es behoben, indem ich die letzten beiden Zeilen bearbeitet habe.command = '\n'.join(sys.argv[1:]) print DepthPlayer(6).run(command)
Ich hoffe, es macht Ihnen nichts aus.Java, naiv
Wenn möglich, gewinnt es. Andernfalls wird verhindert, dass ein Gegner gewinnt.
quelle
Naive.class
in einem Verzeichnis namensnaiveBot
im Hauptverzeichnis.java Naive <args>
Befehl einfach ausführen , vorausgesetzt, die Umgebungsvariablen enthalten den Zeiger aufC:\Program Files\Java\jdk1.8.0\bin
. Ich hoffe das hilft.java -classpath naiveBot Naive
;)legalAnywhere
zutrifft, schlägt Ihr Beitrag fehl, weil Sie versuchen, Bretter zu verwenden, die bereits von einem Spieler gewonnen wurden.Python 2, MiddleBot
MiddleBot mag die Mitte. Bevor das zentrale Spiel (4) gewonnen wird, wird versucht, das mittlere Feld so vieler Spiele wie möglich zu erfassen, wodurch der Gegner immer wieder zum mittleren Spiel zurückgedrängt wird.
Sobald dies erledigt ist, versucht es, alle Spiele zu gewinnen, die es kann, oder füllt nur den ersten verfügbaren Platz aus, wenn nicht (ich denke, es muss an seinem späten Spiel gearbeitet werden).
Um es zu leiten,
python MiddleBot.py <input>
scheint es für mich glücklich in weniger als einer Sekunde zu laufen, also hoffentlich auch für dichquelle
Könnte auch meinen eigenen Bot in die Mischung werfen.
Python 2, goodRandomBot
Diesem Bot ist es egal, wohin er sich bewegt, solange es sich um einen gültigen Zug handelt. Pickt zufällig aus allen gültigen Zügen und macht einen Durchschnitt aus
0
ungültigen Zügen.quelle