Puissance 4, qui aura la meilleure IA ?

Bienvenue dans la ... ZestArena !

a marqué ce sujet comme résolu.

Agrumes de tout bords et de toutes les couleurs, approchez approchez ! et n'ayez pas peur

Aujourd'hui ouvre devant vous la première ZestArena !!

Qu'est ce que la ZestArena

C'est là une bien bonne question petit agrume encore jeune et innocente… La ZestArena est un lien de défi féroce, de combat acharné, d'affrontement sans fin, jusqu'à ce qu'une intelligence les domaines tous !

La ZestArena, ce sont des défis de programmation à relever pour montrer à tous ô combien vous maîtrisez les codes les plus obscurs de ce monde. Mais attention, il ne pourra en rester qu'un… (qui deviendra alors le meilleur dresseurs pokemon)

Je vous propose sur ce nouveau theme des exercices de programmation pour vosu entrainer a coder dans le langage qui vous plait pour répondre à un problème donné. Nous revisiterons ainsi les plus grands classiques des jeux de société simple à mettre en oeuvre, mais pas forcément simple à maitriser. Lebut sera donc de développer une IA capable de jouer contre une autre IA d'un adversaire. Votre but ultime bien sur sera d'essayer d'avoir la meilleure IA pour être classé comme "Champion du challenge" ;)

Première Arène : Puissance 4

On commence en douceur avec ce premier challenge qui émule un grand classique de l'enfance, le puissance 4 !

Rappels des règles

Le but du jeu est d'aligner 4 pions sur une grille comptant 6 rangées et 7 colonnes. Chaque joueur dispose de 21 pions d'une couleur (par convention, en général jaune ou rouge). Tour à tour les deux joueurs placent un pion dans la colonne de leur choix, le pion coulisse alors jusqu'à la position la plus basse possible dans ladite colonne à la suite de quoi c'est à l'adversaire de jouer. Le vainqueur est le joueur qui réalise le premier un alignement (horizontal, vertical ou diagonal) d'au moins quatre pions de sa couleur. Si, alors que toutes les cases de la grille de jeu sont remplies, aucun des deux joueurs n'a réalisé un tel alignement, la partie est déclarée nulle.

Wikipedia - Puissance 4

Grille de puissance 4

Concrètement, comment ca se passe ?

Eh bien c'est très simple. Toute personne désirant participer doit juste fournir un programme capable de fournir un entier. Cet entier représente la colonne dans laquelle il désire déposer son jeton. Afin de faire une décision éclairée, le programme a accès aux informations suivantes :

  • La grille dans son état actuel
  • Les grilles précédentes

Les grilles sont fournis dans un fichier texte représentant une analogie d'une grille de puissance 4 physique.

Déroulement d'une partie

Lors du lancement, le programme principal est démarré avec en arguments les deux programmes concurrents (ils doivent être exécutable). Il s'en suit alors la logique suivante :

  1. Le maître du jeu tire au sort qui est joueur 1 et qui est joueur 2
  2. Joueur 1 joue en premier
  3. Joueur 2 joue a son tour
  4. puis joueur 1 joue de nouveau
  5. La partie se continue ainsi jusqu'à ce que :
    • Une égalité parfait a lieu
    • Un des deux joueurs réalise un puissance 4
    • Un des deux joueurs joue un coup impossible (rajout d'un pion sur une colonne pleine) = défaite
    • Un des deux joueurs donne une entrée erronée (quelque chose autre qu'un entier)

On joue ?

Si vous souhaitez participer, voici les conditions d'entrée :

  • Votre programme doit pouvoir être exécuté via une ligne de commande
  • S'il est compilé, merci de le compilé pour Ubuntu. Sinon il faudra fournir les sources pour que je puisse le compiler.
  • Je ne peux pas garantir d'être en mesure d’exécuté tout les langages

J’essaierai de faire un tableau récapitulatif des combats qui se sont déroulé. Vous pourrez ainsi avoir un oeil sur les meilleurs candidats.

Bien entendu, tout cela doit rester bon enfant. Personne n'est obligé de partager son code (au moins dans un premier temps pour forcer à réfléchir à l'implémentation).

Détails techniques

Si vous souhaitez participer, je vous fournis le maître du jeu ainsi qu'un joueur "aléatoire" pour vous entraîner à jouer ;) Tout est expliqué dans le GitHub :)

Et voici un exemple de résultat de match entre deux joueurs "aléatoires complet" :)

Match d'aléatoires

(PS : Merci d’être tolérant pour mon petit programme Python, je me sers d'excuse de cet exercice pour m'entrainer ;) )

+4 -0

J'adore l'idée, j'essayerai même d'y participer si j'ai un peu de temps ;)

Un reproche, peut-être, c'est qu'on ne peut pas créer d'algorithmes d’apprentissage, à moins que le code ne s'édite lui-même, ce qui est un peu tricky. Autrement dit, le "joueur" ne peut pas stocker des infos quelque part et être assuré de les retrouver la fois suivante. Pour le puissance 4, c'est pas vraiment important (quoique pour le fun), pour des jeux plus complexes, ça peut être intéréssant.

Autrement dit, le "joueur" ne peut pas stocker des infos quelque part et être assuré de les retrouver la fois suivante.

J'ai pas non plus interdit à ton programme de stocker un fichier :-° (dans la limite du raisonnable bien sur)

Et au pire aller, rien n'est figé, on peut toujours discuté de possibilité d'évolution :)

+0 -0

On peut créer un programme qui va remplacer le programme adverse par une sombre merde qui joue n'importe comment ? :-°

SpaceFox

Comme il est vil ce renard :D J'avais pensé au cas de figure "Si le joueur triche et édite la grille en jouant" et du coup j'ai les méthodes pour calculer le md5 de la grille si je veux, mais je me repose pour l'instant sur la bonne foi des joueurs…

+0 -0

On a une limite de temps de traitement/mémoire

PS: execute ça dans une vm peut etre, non ?

edit: je propose aussi que tous les codes sources soient fournit. Ça permet :

  • de repérer facilement les tricheurs,
  • que tout le monde apprenne.

Pour garder un peu de secret, on peut aussi dire que seul toi ai accès à ces codes sources pendant une durée T.

+0 -0

PS: execute ça dans une vm peut etre, non ?

Yep je prévoyais ca pour éviter que qqun aille me flinguer ma machine :D

On a une limite de temps de traitement/mémoire

A priori non, mais en revanche ma patience oui. Si un programme semble coincer il sera déclaré perdant. Pour l'instant je n'ai rien implémenté dans ce sens, mais si besoin je le ferais.

Pour le partage des codes, effectivement ca serait cool de les partager (pour apprendre, discuter etc), mais pour aussi pousser les gens a chercher il serait bon qu'il ne soit pas accessible trop tôt.

+0 -0

Je pense que je vais participer (si j'arrive enfin à DL ma version étudiante de Visual studio…). Je vous tiens au courant d'ici lundi

Jojo

Attention, comme précise dans mon premier message je tourne sur du Linux et donc serait dans l’incapacité technique de faire jouer vos exécutable s'ils utilisent des technologies windows uniquement. (ce qui n’empêche en rien de participer, je ne pourrais pas juste me porter juge objectif du résultat des matchs que vous feriez, sauf si qqun veut bien se prêter main forte pour m'aider dans cette tache :) )

+0 -0

Techniquement, VS = C/C++ ou plateforme .net.

Dans le premier groupe, tu devrais pouvoir le compiler avec gcc si il code propre.

Dans le deuxième, tu devrais pouvoir l'executer directement avec mono, sans recompilation (si il choisit une version du framework supporté par mono).

Ne t'inquiète pas Eskimon, je vais essayer de te faire quelque chose qui tournera chez toi, je vais me débrouiller.

Si c'est du C/C++, tu pourra toujours installer un mingw pour tester. Si ça passe dessus, ça devrait passer sous Linux puisque c'est, en gros, un portage de gcc.

Je vais voir si j'ai un peu de temps ça peut être marrant (python <3), j'ai plus une question sur la représentation de la grille, si je pars du principe que je calcule un coût sur toutes les possibilités et que je choisi la plus avantageuse :

-comment représenter les pions adverses et les siens (0 vide, 1 les nôtres et 2 ceux de l'adversaires)

-le style de la grille doit il être le même que celui fourni dans l'exemple?

En fait ma question c'est, ok je renvoi un int pour la position du coup à jouer (un couple d'int d'ailleurs je pense) mais je dois récupérer les coups de l'adversaire pour mettre à jour ma grille et pouvoir calculer le coup suivant?

Donc est ce que c'est l'admin qui va relancer le programme avec juste la mise à jour de la grille, mais dans ce cas, ça veut dire qu'il doit connaitre l’implémentation de chaque programme pour la mettre à jour.

J'espère avoir été le plus clair possible ;)

Besta

+0 -0

Yep, tout est détaillé dans le github :) Sinon Kje a bien répondu. Dernière chose, tu ne joues pas un emplacement en 2D mais juste une colonne. Et oui au puissance 4 la seule entrée est le choix de la colonne ou tu joues, la position finale du jeton n’étant qu'une conséquence de la gravite et de la position des autres jetons :)

+0 -0

Autant pour moi, ça fait un moment que j'ai pas joué au puissance 4 ! Comme récemment j'avais fait un démineur, je pensais en 2D. Après relecture j'ai juste une petite question (et j'ai peut être encore raté un truc) : -comment sait-on si l'on est joueur 1 ou 2?

Merci

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte