Permet de jouer à un jeu de Meta tic-tac-toe!
C'est un tournoi roi de la colline de Meta-tic-tac-toe. Les règles de Meta-tic-tac-toe sont les suivantes:
Toutes les règles habituelles du tic-tac-toe s'appliquent.
Il y a neuf tableaux conçus pour en faire un seul. Ainsi:
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
le tableau 0 correspond au tableau en haut à gauche, le tableau 1 au tableau du milieu en haut ... comme celui-ci
0|1|2 ----- 3|4|5 ----- 6|7|8
Si je dis conseil 3, tuile 4, cela signifie la tuile centrale du conseil sur le centre gauche.
Vous ne pouvez vous déplacer que dans l'un des plus petits conseils.
Si vous gagnez un des plus petits tableaux, ce tableau entier compte pour votre tuile.
Si l'une des cartes est remplie avant que l'un des deux robots l'ait gagnée, elle compte comme tuile nul.
Celui qui gagne le tableau principal gagne!
Cependant, il y a une torsion importante. Disons que je vais à bord 7, la tuile 2. Cela signifie que votre tour, vous pouvez seulement aller à bord 2. Ensuite , nous allons vous dire allez à bord 2, la tuile 5. Maintenant sur mon tour, je peux seulement aller à bord 5. Disons que le tableau 1 est plein. (Il ne reste plus de places, ou l'un d'entre nous a déjà gagné le tableau 1) Maintenant, si je vais au tableau 5, tuile 1, vous pouvez aller dans n'importe quel tableau que vous voulez.
Ces règles peuvent être considérées comme:
- Vous devez jouer dans le tableau correspondant à la position jouée par le joueur précédent.
- Si X joue au tableau 2, la tuile 5; O doit jouer au tableau 5
- Si le tableau cible est plein (égalité) ou a déjà un vainqueur, le prochain coup n'est pas contraint.
- Un tableau avec un gagnant ne peut pas être joué, même sur un mouvement sans contrainte.
Si cela vous semble un peu déroutant, vous pouvez l’essayer en ligne ici. (assurez-vous de passer de "première tuile gagne" à "3 tuiles dans une rangée")
Maintenant, voici les règles du défi.
Vous devez écrire un bot qui joue à ce jeu.
Le bot 1 est un X, et il peut commencer en premier. Il sera appelé avec ces arguments de ligne de commande (sans les éléments entre parenthèses):
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)
Le premier caractère représente le bot. Dans ce cas, le bot 1 joue en tant que X. Les 9 lignes suivantes font référence aux 9 planches. La 11ème ligne se réfère au tableau principal. Le "xx" est le dernier coup. Maintenant, bot1 doit imprimer deux nombres compris entre 0 et 8. Le numéro 1 est le tableau dans lequel votre bot se déplace, et le numéro 2 est la tuile du tableau. Le contrôleur suivra ce mouvement. Supposons que le bot 1 en imprime 38. Le tableau ressemblera à ceci:
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | |
et bot2 sera appelé avec ces arguments:
O --------- --------- --------- --------X --------- --------- --------- --------- --------- --------- 38
Maintenant, le bot 2 doit se déplacer dans le tableau 8 (car le bot1 a placé un x dans la tuile 3). Supposons que bot2 en affiche 84. Le tableau ressemble à ceci.
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || |O| ----- || ----- || ----- | | || | | || | |
maintenant bot1 va être appelé avec ces arguments:
X --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- 84
Maintenant, bot1 doit être déplacé dans le tableau 4. Cependant, bot1 est un petit robot méchant et décide de passer au conseil 3. Il affiche '30'. Le conseil ne change pas du tout. Le maître bot garde une trace de cela. Maintenant bot2 sera appelé avec ces arguments:
O --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- xx
Maintenant, bot 2 peut aller où il veut (sauf pour 38 et 84, bien sûr). Cela continue jusqu'à ce que quelqu'un gagne 3 cartes mères d'affilée. Ensuite, il y a un deuxième match où bot2 est X et commence en premier.
Cela se répète jusqu'à ce que chaque bot ait joué contre tous les autres.
Notation
La notation fonctionne comme ceci:
Le gagnant d'un match est marqué par des 100 + number of open spots
points. De cette façon, il est plus utile que votre bot gagne rapidement. Chaque fois que votre bot effectue un coup invalide, il perd 1 point. Si, après 250 tours, aucun des deux robots n'a gagné, chacun d'eux perd 10 points et nous passons au tour suivant.
Tout sera mis dans un répertoire qui contient
Le bot de contrôleur. C’est un programme C ++ que j’ai écrit. Vous pouvez consulter le code source du bot du contrôleur ici. S'il vous plaît laissez-moi savoir si vous voyez quelque chose qui ne va pas avec le contrôleur.
Un fichier texte nommé
instructions.txt
Ce fichier ressemblera à ceci:[Total number of bots that are competing] [bot1Name] [bot1 command to run] [bot2Name] [bot2 command to run] ...
Un dossier pour chaque bot. Ce dossier contiendra votre programme (qu'il s'agisse d'un script ou d'un binaire) et UN fichier texte nommé
data.txt
permettant à votre bot de lire et d'écrire tout ce qu'il veut.
Spécifications techniques et clarifications de règles
Tout bot qui tente de lire / écrire quelque chose de n’importe où ailleurs que dans son dossier sera expulsé du jeu.
Votre programme doit pouvoir fonctionner sur un macbook exécutant Yosemite. Les langages actuellement supportés sont python (2.7.9 et 3.4.2), C / C ++, Objective-C, Perl, Ruby, Bash, PHP, Java, C #, javascript et Haskell. Il y en a beaucoup plus, mais ce ne sont que ceux auxquels je peux penser maintenant. J'ajouterai plus avec le temps. Si vous souhaitez concourir dans une langue spécifique, envoyez-moi un message ou un commentaire, et je l'ajouterai à la liste si possible.
Si un tableau est gagné, mais qu'il reste encore de la place, vous ne pouvez toujours pas vous rendre dans l'un des espaces libres.
Notez que le répertoire de travail de votre soumission sera le répertoire contenant le contrôleur et tous les autres robots, PAS le répertoire contenant votre bot.
S'il vous plaît postez avec votre code de bot de contrôleur la commande correcte pour compiler (le cas échéant) et pour exécuter votre bot. La plupart de ces opérations seront effectuées à partir du terminal OS X, qui est assez similaire à un terminal linux.
Les robots doivent compléter en moins d'une seconde. Malheureusement, je ne suis pas assez compétent pour ajouter une minuterie au bot du contrôleur. Cependant, je vais chronométrer les robots manuellement.
Résultats!
Eh bien, j'avais raison. J'ai oublié de faire vérifier par le bot du contrôleur si le masterBoard est plein. Si le masterBoard est plein, alors CHAQUE mouvement est invalide, mais il continue d'appeler les robots, ce qui explique probablement pourquoi il y a eu tant de mouvements invalides. Je l'ai corrigé maintenant. Voici les résultats officiels avec la version la plus récente de tous les robots.
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 est le champion en titre! Au moins pour le moment.
la source
XXX000---
transmis est- il transmis? ou est-ce un "personne ne l'obtient malgré O ayant gagné le premier"?Réponses:
Python 2.7, Profondeur
Une mise en œuvre de la taille alpha-bêta sans rien d'extraordinaire. Il essaie d’ordonner les déménagements de manière moins naïve afin de maximiser les éliminations alpha-bêta. J'essaierai probablement d'accélérer les choses, mais honnêtement, je ne sais pas à quel point Python peut être compétitif s'il s'agit d'une question de vitesse.
Pour l'exécuter, vous pouvez simplement le faire
python Depth.py <input>
, bien que je suggère d'utiliserpypy
comme il accélère considérablement.De plus, je ne sais pas à quelle vitesse votre système est rapide mais vous pouvez modifier le premier argument
DepthPlayer
à la fin pour qu'il soit plus élevé s'il peut encore s'exécuter dans le temps spécifié (sur mon système, il a presque tout terminé très rapidement avec une profondeur 7 ou 8, mais il y avait quelques cas qui étaient proches ou au-dessus d'une seconde alors je l'ai réglé à 6 pour être sûr).la source
sys.argv
ne renvoie pas de chaîne séparée par une nouvelle ligne. Il donne une liste de chaînes dans ce format:['Depth.py', 'X', '---------', '---------', ...]
je l'ai corrigé en éditant les deux dernières lignes,command = '\n'.join(sys.argv[1:]) print DepthPlayer(6).run(command)
j'espère que cela ne vous dérange pas.Java, naïf
Si possible, ça gagne. Sinon, cela empêche un adversaire de gagner.
la source
Naive.class
dans un répertoire nomménaiveBot
dans le répertoire principal.java Naive <args>
commande, en supposant que les variables d'environnement incluent le pointeur surC:\Program Files\Java\jdk1.8.0\bin
. J'espère que ça aide.java -classpath naiveBot Naive
legalAnywhere
est true, votre soumission échoue parce que vous essayez d'utiliser des planches déjà gagnées par un joueur.Python 2, MiddleBot
MiddleBot aime le milieu. Avant que la partie centrale (4) ne soit gagnée, il tentera de saisir le centre du plus grand nombre de parties possible, forçant l'adversaire à revenir encore et encore à la partie centrale.
Une fois que cela est fait, il essaie de gagner tous les jeux possibles, ou remplit simplement le premier espace disponible sinon (il faut travailler sur son jeu en retard, je pense)
Pour le lancer, il
python MiddleBot.py <input>
me semble que ça me fait plaisir de passer moins d'une seconde, alors j'espère que ça le sera aussi pour vousla source
Pourrait aussi bien jeter mon propre bot dans le mélange.
Python 2, bon RandomBot
Ce bot ne se soucie pas de l'endroit où il se déplace, tant qu'il s'agit d'un mouvement valide. Choisit au hasard parmi tous les coups valides et effectue une moyenne des
0
coups invalides.la source