Journal Concours d'IA de Tarot

51
1
juin
2015

Bonjour à tous,

Je suis le développeur d'un petit jeu de Tarot appelé TarotClub. Je pense qu'il est graphiquement assez sympa et semble assez bien débogué au niveau des règles du jeu de Tarot grâce à plusieurs remontées de bugs d'utilisateurs réguliers. On peut y jouer en local ou en réseau, enfin quand il n'y a pas de bugs :)

Cependant, il a un grand défaut : l'intelligence artificielle des adversaires. C'est une critique que je reçois assez souvent et je souhaiterais corriger cet aspect du jeu. J'ai alors pensé à demander de l'aide à la communauté mais d'une manière amusante : en lançant un concours d'Intelligence Artificielle.

Comment ça marche ? Eh bien tout d'abord, une IA est implémentée en JavaScript, comme une sorte de plug-in (je le fais tourner grâce au moteur Duktape). Il y a une API standard à respecter, documentée sur le site du jeu. J'ai ensuite monté un serveur de jeu qui a la charge, pour le concours, d'exécuter des scripts uploadés par les utilisateurs (il faut créer un compte pour cela).

Le bot que je fournis en standard avec le jeu totalise 966 points en jouant 20 parties sur des donnes fixes. Il se bat contre lui même … mais à une même position, le sud, et n'a donc pas les mêmes cartes en main que les autres joueurs.

Donc, si vous voulez participer, n'hésitez pas, cela permettrait d'avoir un jeu de Tarot sous Linux un minimum intéressant. Tout ça est assez expérimental pour le moment je vous préviens !

Je suis également ouvert à toute suggestion, remontée de bugs éventuels … et si vous souhaiteriez voir apparaître d'autres langages que JavaScript pour les script d'IA, merci de me l'indiquer également (je pense que Python ou Lua seraient populaires).

Côté technologies : le serveur tourne sur Node.js/CouchDB et le client sous Qt. Le serveur est full C++0x11 (ce qui est bien pratique notamment pour les std::thread multi-plateforme).

Liens:
- TarotClub, le site
- Ubuntu PPA
- Dépôt Bitbucket
- Duktape, un moteur Javascript léger

  • # Pb sous windows 8.1

    Posté par (page perso) . Évalué à 1.

    J'ai téléchargé la version windows, fais l'installation et au lancement il me dit qu'il manque une bibliothèque libgcc_s_dw2-1.dll, je l'ai récupéré sur internet, copier dans le répertoire adéquat et nouvelle bibliothèque manquante libwinpthread-1.dll. Est-ce juste mon windows 8.1 qui est en cause ou est-ce la compilation pour windows ?

    Du coup, je n'ai pas pu tester le jeu.

  • # j'ai plusieurs question

    Posté par . Évalué à 8.

    A) la donne est elle respectée? Je précise normalement les plis au tarots sont comptés à la fin (intercallage d'une carte sans valeur avec une carte de valeur, ce qui empêche, normalement, d'avoir dans sa main distribuée 3 cartes à points d'affilé, du moins dans la partie comptée, de plus comme on ne bat pas les cartes, sur la parti N si le 20 et le 21 d'atouts tombent sur un même tour, il est probable qu'ils se trouvent voisins ou dans la même main. (comme on distribue 3 par 3 et qu'on ne peut pas faire le chien en une fois, et pas non plus le dernier tour)

    On peut avoir le même raisonnement pour la distribution de toutes les cartes (ou au moins roi/reine[/cavalier]/oudlers), et sans aller très loin, avoir une mémoire, même vague du tour précédent peut être très intéressant. (Typiquement deviner des coupe franches ou des poignées que des vicelards n'auraient pas annoncés)

    Toujours dans la même optique, reprendre un jeu de tarot après qu'il ait servi à autre chose rends la donne très… originale, et il faut généralement attendre 2/3 partie avant d'avoir un jeu raisonnable.

    B) tarot à 4 ou 5 ?
    Car là encore la façon de jouer est très différente.

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

    • [^] # Re: j'ai plusieurs question

      Posté par . Évalué à 10.

      […] de plus comme on ne bat pas les cartes, […]

      euh si, il faut mélanger :-) C'est un bon sujet pour le vendredi, mais je confirme il faut mélanger : par rapport au donneur le N-2 mélange, le N-1 coupe et le N distribue.

      [3615 ma vie]
      Pour la petite histoire, j'ai contacté la fédération de tarot depuis l'Antarctique, où j'hivernais pendant un an, parce que ça n'était plus possible : entre les mélangeurs et les autres il fallait trancher, on ne pouvait pas rester un an sans savoir !

      De même, on est obligé de renoncer la partie si un joueur à le petit sec dans la main…
      [/3615]

      • [^] # Re: j'ai plusieurs question

        Posté par . Évalué à 4. Dernière modification le 01/06/15 à 17:31.

        C'est marrant moi on m'a toujours dit que ça ne se faisait pas, et d'ailleurs vu la taille, faut des paluches de géants pour battre un jeu de tarot ;)

        De même, on est obligé de renoncer la partie si un joueur à le petit sec dans la main…

        Hé oui ;) Ça j'étais au courant, par contre y a des gens qui prétendent que l'excuse n'y change rien, or, le petit et l'excuse n'annule pas la partie (le petit n'est plus sec).

        J'ajouterai que la règle interdisant de classer son jeu tant que personne n'a pris n'a pas de sens si on mélange entre chaque donne.

        Il ne faut pas décorner les boeufs avant d'avoir semé le vent

      • [^] # Re: j'ai plusieurs question

        Posté par . Évalué à 1.

        Oui, d'ailleurs je m'arrange pour ne pas générer de donne avec petit sec.

        • [^] # Re: j'ai plusieurs question

          Posté par (page perso) . Évalué à 2.

          Tu veux plutôt dire que tu élimines les donnes qui ont le petit sec.
          Sinon ce n'est plus aléatoire (ou cela ne respecte plus le pseudo-mélange si tu gères cela).

      • [^] # Re: j'ai plusieurs question

        Posté par . Évalué à 1. Dernière modification le 02/06/15 à 10:13.

        J'ai joué en tournoi et de la même façon que l'on m'a appris, Le jeu doit étre battu par le joueur en face du distributeur

        • [^] # Re: j'ai plusieurs question

          Posté par (page perso) . Évalué à 1.

          On dit donneur. :-) Le distributeur est l'appareil qui permet de délivrer boissons et autres confiseries.

          • [^] # Re: j'ai plusieurs question

            Posté par . Évalué à 7.

            Si on joue sur les mots, la definition de distributeur de mon dictionnaire c'est "Celui ou celle qui distribue.", et la definition de distribuer : "Répartir une chose entre plusieurs personnes ou plusieurs endroits."
            Il me semble tout à fait convenable de dire le distributeur.

            Pour la définition de donneur : "Personne qui donne habituellement, qui aime à donner quelque chose."

            Il me semble que même si c'est un abus de langage, "donneur" semble moins pertinent que "distributeur"…

            Mais c'est seulement si on joue sur els mots quoi ;)

            • [^] # Re: j'ai plusieurs question

              Posté par . Évalué à 1.

              J'ai plus de plaisir à jouer sur les mots qu'au tarot !

              Certes, distribuer a exactement le sens qu'il faut pour répartir les cartes entre les joueurs. Mais une langue se construit par l'usage plus que par la pertinence théorique, et la distribution des cartes se dit traditionnellement donner. Le terme distribuer étant plus rare en ce sens, c'est tout naturellement que donneur est devenu le terme d'usage, quand distributeur est compréhensible mais plutôt déroutant, surtout depuis l'apparition de machines ainsi nommées.

              Au XVIème siècle déjà, on écrivait :

              Je donrois quinze à l'Aretin, Et si gaignerois la partie, [Marot, II, 140]

              Le Littré atteste de ce sens au XIXème siècle, qu'il illustre aussi par une citation de Molière dans donner. Par contre distribuer est défini sans référence au jeu de cartes.

              En maths, je pense que le terme réseau serait plus logique que graphe (pourquoi appelle-t-on ces nœuds connectés par des arêtes des écrits ?) mais je me conforme à l'usage.

    • [^] # Re: j'ai plusieurs question

      Posté par (page perso) . Évalué à 5.

      B) tarot à 4 ou 5 ?
      Car là encore la façon de jouer est très différente.

      Vu les captures d'écran, ça se joue à 4. Un bon point pour lui!
      Le tarot à 5 n'est rigolo qu'avec des vrais joueurs caractériels assis en face de toi.

      "La liberté est à l'homme ce que les ailes sont à l'oiseau" Jean-Pierre Rosnay

    • [^] # Re: j'ai plusieurs question

      Posté par . Évalué à 2.

      Tarot à 4 uniquement.
      Le principe est un peu comme en duplicaté, c'est à dire que les donnes sont fixes et créées avant le tournoi. Par contre, chaque jeu a été mélangé aléatoirement.

  • # maitretarot

    Posté par . Évalué à 10.

    http://www.nongnu.org/maitretarot/ avait exactement les mêmes ambitions. Il était écrit en C, et les IA ne devaient pas tricher (connaitre les jeux de tout le monde).

    Je devais faire l'IA, mais c'est une sacré complexité.

    Au lieu d'imposer un langage, tu devrais faire comme d'habitude : un échange de donné par parseur de l'entrée standard. Tu fournis des bots idiots avec le parseurs de codé et rouler jeunesse.

    https://www.codingame.com fonctionne comme ça.

    "La première sécurité est la liberté"

    • [^] # Re: maitretarot

      Posté par . Évalué à 2.

      Heu, pas tout compris :) Tu aurais un exemple ?

      • [^] # Re: maitretarot

        Posté par . Évalué à 2.

        Mmh c'est bon j'ai pigé, ça pourrait être facile à faire vu que mon API d'interface est déjà purement textuelle (pas binaire quoi). Par contre je pense qu'il faudrait alors gérer le lancement d'un processus.

      • [^] # Re: maitretarot

        Posté par (page perso) . Évalué à 3.

        C'est exactement ce que je veux suggérer aussi.

        Au lieu d'imposer un langage (JS, que je parle bien) c'est plus flexible de parler à ton IA via un Unix pipe. Tu délègues donc la décision à un programme externe.

        On peut imaginer le protocole suivant:

        1. Le jeu démarre le programme super_ia
        2. Le jeu décrit la partie (nombre de joueurs, position) la donne à super_ia
        3. super_ia répond qu'il est prêt
        4. Le jeu lance le premier tour d'enchères et écrit les résultats sur srdin de super_ia
        5. super ia répond avec son enchère … etc.

        Le plus simple est d'utiliser un protocole textuel (tu peux tester directement à la console) avec une convention simple pour séparer les commandes (le plus simple est le ligne à ligne, vu que tu n'as pas beaucoup de données à transférer, ça me semble adéquat). Tu peux t'inspirer des protocoles semblables comme FTP ou SMTP par exemple, en essayant d'être plus simple que eux! :)

        • [^] # Re: maitretarot

          Posté par . Évalué à 1.

          Oui j'ai déjà un protocole textuel entre le monde JavaScript et le logiciel en C++. Ce n'est pas compliqué à implémenter en effet.

          Cette approche multi-langages a néanmoins un très gros défaut : en effet, il faudra maintenir N implémentations d'IA différentes … et déjà en maintenir une est complexe (j'ai des tests unitaires et je vais intégrer un débogueur dans le futur).

          Je rappelle que le but est d'avoir un jeu sympa sous Linux, donc avec une IA acceptable. Le risque est alors d'avoir N IA pas terribles. Imagine un Battle For Wesnoth avec cette liberté …

          Enfin, dernier avantage au JavaScript : c'est celui de pouvoir proposer dans le futur un client en HTML5.

          • [^] # Re: maitretarot

            Posté par . Évalué à 9.

            C'est un concours d'IA ou pas ? Il faut choisir.

            Tu aura forcément N IA pas terrible, c'est un concours. Par contre, tu pourra faire un ranking, et tes joueurs pourront choisir la force de l'IA. Tu peux ainsi définir des joueurs virtuelles, qui auront une personnalité.

            "La première sécurité est la liberté"

            • [^] # Re: maitretarot

              Posté par . Évalué à 2.

              Ok c'est vrai tu as raison. On va la tenter comme ça alors !

          • [^] # Re: maitretarot

            Posté par (page perso) . Évalué à 8.

            Je rappelle que le but est d'avoir un jeu sympa sous Linux, donc avec une IA acceptable. Le risque est alors d'avoir N IA pas terribles. Imagine un Battle For Wesnoth avec cette liberté …

            D'après ce que j'ai compris, ton problème est pour l'instant que l'IA n'est pas terrible. Si tu cherches des contributions externes ton intérêt est d'avoir le moins de barrières possibles. Si une IA marche bien, rien n'interdit de la recoder en JS ou ce que tu veux quand il s'agira de la pérenniser.

            • [^] # Re: maitretarot

              Posté par . Évalué à 2.

              Oui, et certains langages pourraient peut-être se prêter mieux au développement d'IA que JavaScript, même si je ne crois pas trop à l'influence du langage là dessus.

          • [^] # Re: maitretarot

            Posté par . Évalué à 1.

            Pour les bonnes IA, dans des langages compilable, tu pourras toujours utilisé EMSCrtipten qui convertie un code C en Javascript …

    • [^] # Re: maitretarot

      Posté par . Évalué à 2.

      https://www.codingame.com fonctionne comme ça.

      Est ce qu'ils publient les sources de leur plateforme ? J'ai regardé sir leur site mais n'ai rien vu de tel.

      Est ce qu'il y d'autres plateformes de ce type qui soit open source ?

  • # Python

    Posté par . Évalué à 3.

    Excellent.
    Personnellement je ne connais pas le Javascript (et je n'ai pas spécialement envie de m'y mettre), mais ça m'intéresserait de bidouiller un truc en Python.

    Au niveau de l'IA existante, je ne comprend pas trop ce que veut dire « totalise 966 points en jouant 20 parties sur des donnes fixes »

    • [^] # Re: Python

      Posté par . Évalué à 1.

      A la fin d'une partie de Tarot, tu comptes les points réalisés (tu peux regarder les règles sur Wikipédia). Là, le bot enchaîne 20 parties d'affilée et les points sont additionnés. Comme un petit tournoi quoi.

      Je regarde ce que je peux faire avec le Python, en gardant à l'esprit le conseil donné par Nicolas ci-dessus.

      • [^] # Re: Python

        Posté par . Évalué à 2.

        Pour le Python, selon comment Duktape se comporte, tu peux envisager les multiples implémentations de Python-over-JS, qu'elles soient manuelles, emscriptées, ou que sais-je encore.

        https://www.rfk.id.au/blog/entry/pypy-js-first-steps/
        http://www.skulpt.org/
        https://github.com/replit/empythoned

      • [^] # Re: Python

        Posté par . Évalué à 6.

        J'ai déjà fait des IA en C, et j'aime bien aussi Ocaml. D'où l’intérêt de lancer un exe pour ne pas dépendre d'un langage précis.

        "La première sécurité est la liberté"

      • [^] # Re: Python

        Posté par . Évalué à 1.

        Ce que je ne comprend pas, c'est contre qui joue l'IA. D'après ce que je comprend, c'est contre elle-même (donc les 4 joueurs sont la même IA), et on compte les points du joueur sud, et l'idée c'est de changer juste le joueur sud en gardant les 3 autres. J'ai bon ?

        • [^] # Re: Python

          Posté par . Évalué à 1.

          Oui tu as bon :)
          C'est un concept un peu cavalier je te l'accorde ! Si on a plusieurs IA de disponible, on pourrait imaginer alors un vrai concours dans lequel les bots jouent les uns contre les autres et pas seulement l'IA de base.

  • # Calcul des scores faux

    Posté par (page perso) . Évalué à 3.

    Je viens de faire une partie et j'ai constaté que le calcul des scores peut être faux. Nord prend, perd de 23 points, la défense a mené le petit au bout. Chaque défenseur devrait gagner (23+25+10)x1 points soit 58 points. Tarot club n'en attribue que 38 : 23+25-10 (j'ai la capture d'écran final pour info). A vérifier également que la poignée est bien comptée (pas encore eu le cas pour vérifier)

    Sinon, jeu sympa, mais que l'AI est nulle parfois (genre lancer un tour avec le petit sachant qu'il reste des atouts et forcément se le faire prendre !!)

    • [^] # Re: Calcul des scores faux

      Posté par . Évalué à 2.

      Hehe ouais, je vais regarder ton use case d'IA pour voir si je peux éviter ça.

      Sinon, il me faudrait le log de ta partie, c'est disponible dans le répertoire ~/.tarotclub/games, le nom du fichier est la date et heure de ton jeu.

      Tu peux le copier ici ou l'envoyer à support at tarotclub dot fr. Merci d'avance :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.