flotpython / recreation

Zone récréative pour les étudiants du MOOC Python3
10 stars 7 forks source link

general discussion #2

Open sebhoa opened 5 years ago

sebhoa commented 5 years ago

Bonjour, Désolé mais je ne m'y connais pas en git/github. Si je veux déposer ma version locale du code de Vigenère par exemple dans un dossier sebastienhoarau/ à l'endroit ad-hoc comment dois-je faire ? J'ai une version locale du projet recreation-master. Et j'ai créé en local le répertoire sebastienhoarau avec dedans ma version de l'exo. Ensuite ?

parmentelat commented 5 years ago

tout d'abord, il ne faut vous engager là-dedans que si vous avez envie d'apprendre git(hub) parce que sinon tout ça va vite vous sembler fastidieux


puisque vous n'êtes pas familier avec git:
je viens de vous envoyer une invitation, une fois que vous l'aurez acceptée vous aurez les droits d'écrire directement dans le projet principal (flotpython/recreation et non pas sebhao/recreation) je vous conseille de ne pas utiliser sebhao/recreation, ce qui vous evitera d'avoir a le synchroniser

je vous engage donc a proceder comme ceci (pour mac ou linux)

si vous avez deja un directory recreation renommez-le avant de taper ceci

$ git clone git@github.com:flotpython/recreation.git 
$ cd recreation/othello
$ mkdir sebastienhoarau
$ cd sebastienhoarau
$ cp <votre-contrib.py> othello.py
$ git add othello.py
$ git commit -m 'othello par sebhoa'
$ git push

sachez aussi que vous avez l'option d'utiliser une GUI pour git localement sur votre ordi; moi perso j'utilise volontiers sourcetree de chez atlassian, il y en a plein d'autres comme gitkraken; ça pourra être utile pour suivre le projet

ghost commented 5 years ago

@ parmentelat : comment puis je dialoguer avec quelqu'un sur son code ? par exemple j'aimerais dire à sebhoa qu'on peut enrichir les caractéres autorisés avec : self.alpha = ascii_letters+'éèîuùê' et que dans sa ligne 16 : for c in msg.lower(), on peut supprimer .lower()

sebhoa commented 5 years ago

Exact pour l'enrichissement et aussi pour le .lower() inutile. Mais je l'ai supprimé de fait en modifiant mon code. Inspiré de la solution de Thierry j'ai tenté d'utiliser cycle pour me passer de la création explicite de la 'pass_phrase'

Le mer. 10 oct. 2018 à 14:28, JiPiBi notifications@github.com a écrit :

@ parmentelat : comment puis je dialoguer avec quelqu'un sur son code ? par exemple j'aimerais dire à sebhoa qu'on peut enrichir les caractéres autorisés avec : self.alpha = ascii_letters+'éèîuùê' et que dans sa ligne 16 : for c in msg.lower(), on peut supprimer lower

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/flotpython/recreation/issues/2#issuecomment-428520924, or mute the thread https://github.com/notifications/unsubscribe-auth/AJl3G2INjsqZDzuAYVkmkBiVCwEZTVcAks5ujcvFgaJpZM4XUq_0 .

parmentelat commented 5 years ago

Pour répondre à jipibi, je ne sais pas le faire, mais c'est sûrement possible en règle générale on discute sur du code dans une PR c'est à dire avant qu'il soit dans le repo mais c'est sûrement possible renseignez-vous sur google ou autre..

ghost commented 5 years ago

En fait j'ai reçu un mail de vous 2 donc on peut aussi échanger ainsi...

Envoyé depuis mon smartphone Samsung Galaxy.

-------- Message d'origine -------- De : parmentelat notifications@github.com Date : 10/10/2018 17:17 (GMT+01:00) À : flotpython/recreation recreation@noreply.github.com Cc : JiPiBi jpbozo@hotmail.fr, State change state_change@noreply.github.com Objet : Re: [flotpython/recreation] Newby on git/github (#2)

Pour répondre à jipibi, je ne sais pas le faire, mais c'est sûrement possible en règle générale on discute sur du code dans une PR c'est à dire avant qu'il soit dans le repo mais c'est sûrement possible renseignez-vous sur google ou autre..

— You are receiving this because you modified the open/close state. Reply to this email directly, view it on GitHubhttps://github.com/flotpython/recreation/issues/2#issuecomment-428613501, or mute the threadhttps://github.com/notifications/unsubscribe-auth/AeRAQgEcMkf_7juYWuGASwKazmA_868nks5ujg-CgaJpZM4XUq_0.

ghost commented 5 years ago

@sebhoa votre code est deja tellement optimisé qu'à part la suppression de quelques variables intermédiaires , je ne sais pas quoi dire de mon coté (juste la prise en compte des lettres accentuées en francais :-). Par contre si le coeur vous en dit je prends volontiers les remarques sur mon code othello

sebhoa commented 5 years ago

@JiPiBi Merci. J'avais une première version où je construisais, ce que j'ai appelé la pass_phrase : la cle répétée aussi souvent que nécessaire. J'essaie d'apprendre à utiliser les itérateurs (que jusqu'à présent je n'utilisais pas du tout) et je me suis inspiré de la solution de @parmentelat :) Quant à la non construction effective de la table de correspondance, j'utilise le décalage sur les indices, qui est donné sur l'article wikipédia du code Vigenère. Je regarderai Othello ce week-end, si j'ai un peu de temps. J'ai aussi un jeu de bataille navale que je dois proposer (le temps encore le temps ^^)

Bon week-end à tous

-- Sébastien Hoarau

Le ven. 12 oct. 2018 à 00:55, JiPiBi notifications@github.com a écrit :

@sebhoa https://github.com/sebhoa votre code est deja tellement optimisé qu'à part la suppression de quelques variables intermédiaires , je ne sais pas quoi dire de mon coté (juste la prise en compte des lettres accentuées en francais :-). Par contre si le coeur vous en dit je prends volontiers les remarques sur mon code othello

— You are receiving this because you were mentioned.

Reply to this email directly, view it on GitHub https://github.com/flotpython/recreation/issues/2#issuecomment-429115190, or mute the thread https://github.com/notifications/unsubscribe-auth/AJl3G1B-h_LY4dT5CRN0gto3HokMUBTkks5uj7AjgaJpZM4XUq_0 .

sebhoa commented 5 years ago

Première version d'Othello semble fonctionnelle (peut-être y'a encore des bugs je n'ai joué que qq parties). Et surtout faut que j'essaie de rendre le code plus propre, plus pythonique. @JiPiBi J'aime bien ton traitement du retournement... faut que je m'en inspire pour améliorer ma propre méthode :)

ghost commented 5 years ago

@sebhoa Par rapport à vos interrogations sur la structure du jeu , il faudrait que Thierry nous éclaire sur l'utilisation des objets : d'après ce que j'ai vu récemment en JAVA , j'aurais de mon coté 1 classe Partie qui initialise un Jeu( Othello 8*8 avec des calculs sur les cases , le compteur des cases, l'autorisation de pose d'un pion , qui contient donc toutes les regles du jeu et les opérations de retournement) et 2 Joueurs qui seraient des instances de 2 sous classes (Humain et AI) d'une classe Joueur abstraite qui traiterait les methodes communes aux 2 sous classes : par exemple la pose d'un pion envoyée à la classe jeu.. La sous classe Joueur Humain serait essentiellement basee sur l'interface de saisie des cases. La sous classe Joueur AI serait la plus complexe car elle devrait appliquer des stratégies (priorité aux cases de coin ,maximiser les gains si ne donnent pas accés à des cases stratégiques (case adjacente aux coins ou avant derniere rangée si retournable au cas suivant)....).

Karduin commented 5 years ago

Bonjour, ayant proposé ce petit challenge je vais finir par déposer mon code. Malheureusement je ne suis pas aussi rapide que vous ;-). (Et je manque un peu de temps). Pour le moment je ne lirai pas vos codes, histoire de ne pas être influencé. Surtout qu’apparemment j'ai à faire à des pointures si je me fis à vos interventions sur le forum ;-)

ghost commented 5 years ago

Evolution importante apportée dans mon othello avec des classes Joueur AI et Humain sous classes d'une classe Joueur qui contient les méthodes communes . Rond et croix peuvent etre joues soit par Humain ou par AI. Premieres stratégies implantés (priorité coins, eviter cases proches coin ou donnant acces aux cotés) J'ai eu du mal à battre mon AI , c'est bon signe....

sebhoa commented 5 years ago

@JiPiBi bien joué ! Je vais vite faire un "pull" pour tester ça ;-) Pour ma part mon IA est nulle :-) J'ai juste codé pour qu'il joue le "plus grand nombre de retournement". Pas le temps de regarder plus avant.

Le mar. 16 oct. 2018 à 03:19, JiPiBi notifications@github.com a écrit :

Evolution importante apportée dans mon othello avec des classes Joueur AI et Humain sous classes d'une classe Joueur qui contient les méthodes communes . Rond et croix peuvent etre joues soit par Humain ou par AI. Premieres stratégies implantés (priorité coins, eviter cases proches coin ou donnant acces aux cotés) J'ai eu du mal à battre mon AI , c'est bon signe....

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/flotpython/recreation/issues/2#issuecomment-430046998, or mute the thread https://github.com/notifications/unsubscribe-auth/AJl3G41BACKBdK12QkCIPYoPFvIXMxv2ks5ulRf4gaJpZM4XUq_0 .

ghost commented 5 years ago

@sebhoa Merci , mais je sais que j'ai dejà dans un premier temps des points existants à reprendre : boucle à la creation des joueurs et optimisation de ma fonction priorités avec 3 boucles construites à l'identique qui se suivent . Ensuite c'est toute l'AI qui pose questions faut il se lancer dans des optimisations basées sur l'analyse du coup potentiel de l'adversaire .....

PS : vu l'horaire de vos messages soit vous avez des insomnies , soit vous travaillez en horaires décalés (un peu comme pour nous les retraités) , soit vous n'habitez pas en métropole :-)

sebhoa commented 5 years ago

Oui l'IA demande une réelle réflexion. Utilisation d'apprentissage automatique (réseau de neurones peut-être) bref cela peut aller assez loin, je n'ai malheureusement pas le temps pour le moment d'explorer cela. Je suis déjà satisfait de faire de l'objet en python et de voir des choses assez simples mais propres à partager probablement avec mes étudiants de 1re année.

Le mar. 16 oct. 2018 à 10:25, JiPiBi notifications@github.com a écrit :

@sebhoa https://github.com/sebhoa Merci , mais je sais que j'ai dejà dans un premier temps des points existants à reprendre : boucle à la creation des joueurs et optimisation de ma fonction priorités avec 3 boucles construites à l'identique qui se suivent . Ensuite c'est toute l'AI qui pose questions faut il se lancer dans des optimisations basées sur l'analyse du coup potentiel de l'adversaire .....

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/flotpython/recreation/issues/2#issuecomment-430116074, or mute the thread https://github.com/notifications/unsubscribe-auth/AJl3G_1-2ZeHdRMEv83A9XSbSa6Oji9Kks5ulXv2gaJpZM4XUq_0 .

ghost commented 5 years ago

j'ai passé les modifs prévues et j'ai encore affiné la gestion des priorités entre les cases au travers d'ensembles de priorité decroissantes , devient amusant à jouer , il y aurait effectivement beaucoup à faire car je vois que j'arrive à pieger l'IA dans la gestion de l'accés aux cotés, il faudrait donc arriver à repérer les schemas à eviter ou à privilegier car tout se joue dans ces coups

parmentelat commented 5 years ago

Je duplique ici ce que j'ai écrit dans le forum; en fait c'est bcp + pratique d'utiliser ce medium que le forum de FUN :)

Le plus simple pour moi pour vous donner un retour sur vos codes consiste à créer des branches où je relis et propose des changements sur un code en particuler

Actuellement vous trouverez ici : https://github.com/flotpython/recreation/branches les branches

Je me suis concentré sur la forme pour commencer; pas beaucoup de temps pour aller très loin de toutes façons...

J'attire votre attention sur des outils faciles à mettre en place et qui sont énormément utiles:

Tout est consultable en ligne via github, et importable sur votre disque dur, grâce à git bien sûr :)

sebhoa commented 5 years ago

Merci beaucoup pour les retours. :)

Le mar. 16 oct. 2018 à 20:07, parmentelat notifications@github.com a écrit :

Je duplique ici ce que j'ai écrit dans le forum; en fait c'est bcp + pratique d'utiliser ce medium que le forum de FUN :)

Le plus simple pour moi pour vous donner un retour sur vos codes consiste à créer des branches où je relis et propose des changements sur un code en particuler

Actuellement vous trouverez ici : https://github.com/flotpython/recreation/branches les branches

  • comments-etilem
  • comments-jipibi
  • comments-sebhoa

Je me suis concentré sur la forme pour commencer; pas beaucoup de temps pour aller très loin de toutes façons...

J'attire votre attention sur des outils faciles à mettre en place et qui sont énormément utiles:

  • autopep8 pour adopter automatiquement les règles de codages standard
  • pylint que je vous conseille de faire tourner plus ou moins en permanence - ça se branche plus ou moins facilement sur un éditeur, moi perso c'est pour ça que j'utilise atom.

Tout est consultable en ligne via github, et importable sur votre disque dur, grâce à git bien sûr :)

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/flotpython/recreation/issues/2#issuecomment-430297741, or mute the thread https://github.com/notifications/unsubscribe-auth/AJl3G8TSiFlPEVtajUWzLgapBVP1XLliks5ulgRFgaJpZM4XUq_0 .

ghost commented 5 years ago

@parmentelat , j'ai recu un mail avec votre commentaire sur la 2eme passe , mais je n'ai pas retrouvé ce message dans les issues. Vous faites une remarque sur la fin du code , mais qd j'ouvre le fichier que vous semblez avoir commenté pour voir votre remarque sur les ensembles , j'ai l'impression que vous n'etes pas sur mon dernier fichier ? En tous cas merci pour le temps que vous nous consacrez

Etilem commented 5 years ago

bonjour à tous,

je voudrais savoir s'il y en a parmi vous qui utilisent GitHub Desktop et éventuellement, qu'est-ce que ça apporte à la version browser ?

merci beaucoup à @parmentelat pour les commentaires sur bout de code, c'est vraiment appréciable !

bon mooc !

ghost commented 5 years ago

Bonjour, j'ai eu à utiliser GIT GUI dans le cadre d'un autre MOOC , a priori sur Edx. Cela vous permet de synchroniser des répertoires complets entre votre PC et votre compte et vous lancez les opérations de synchronisation depuis votre PC Comme pour tout , ne l'ayant pas utilisé par la suite , je n'en ai pas conservé d'autre mémoire .

Karduin commented 5 years ago

Bonjour, je l'utilise depuis cette année conjointement avec Atom. J'avoue que je n'avais pas envie d'utiliser la ligne de commande pour la synchro, les forks, etc. J'utilise aussi l'interface web pour pousser des fichiers dans les repositories. Pour mettre à jour mon fork du flotpython avec l'original je passe par le l'interface web en faisant un pull request

ghost commented 5 years ago

Suite aux discussions dans le forum sur le sujet methodes fonctions , je me suis rendu compte que mon encapsulation dans le jeu Othello n'était pas bien faite , j'ai repris mon code Othello et ajouté une randomization de parcours des cases à tester dans le cas du joueur AI ce qui permet d'avoir des résultats différents à chaque lancement du programme meme qd l'AI joue contre l'AI .... Je ne pense plus faire evoluer à court terme mon code car celà semble emmener un peu trop loin ...

ghost commented 5 years ago

@Etilem je n'arrive pas à trouver un autre endroit pour faire des commentaires sur votre code -1- on apprend toujours des autres surtout dans un exercice libre , donc j'ai essayé de comprendre comment vous gériez votre dictionnaire et vos impressions à parametres variables 👍 -2- remarque de détail : pourquoi mettre le chall resultat de l'input dans l'init et le mettre à jour avec self puisqu'il n'est utilisé que dans la méthode def is_myst_number(self): -3- en tentant des init un peu étranges de la classe : locales inexistantes , ou non chiffres on fait planter python , d'où ma question : doit on rendre robuste les init aux saisies qui génèrent des anomalies en faisant des boucles ou la doc du programme est elle suffisante : en l'occurrence on pourrait aussi imaginer que l'init consiste à demander à l'utilisateur de choisir ses 3 parametres (dans les choix possibles pré"vus en particulier sur la langue)

Etilem commented 5 years ago

@JiPiBi sur GitHub, je crois qu'il y a un accès à l'historique des commits pour chaque fichier (bouton History) quand par exemple on clique sur un fichier. 2) oui, après tout, la variable chall devrait être locale à la fonction is_myst_number, SAUF si on découpe celle-ci en plusieurs fonctions comme le propose @sebhoa et encore, on pourrait se passer le "bébé" en paramètre il me semble... 3) oui, j'ai voulu "contraindre" le domaine de définition de l'instance de classe par un test basique en début d'init, je pense que ce programme est prêt à évoluer vers un passage d'arguments sur la ligne de commande comme le propose @parmentelat en TODO !

Etilem commented 5 years ago

@Karduin et @JiPiBi merci pour vos retours sur les outils, pour ma part, j'utilise Atom et Git sous Ubuntu

parmentelat commented 5 years ago

J'utilise pour ma part SourceTree sur macos; j'ai essayé aussi gitkraken à un moment, mais je n'ai pas accroché, je trouve que l'outil essaie d'être trop intelligent et fait des trucs qui ne me conviennent pas j'utilise aussi atom comme éditeur, mais je n'ai pas encore exploré du tout la partie git dans atom par contre ce qui me change la vie avec atom (j'ai longtemps utilisé emacs) c'est le fait d'avoir facilement les linter qui tournent en permanence, ça c'est vraiment appréciable.

et aussi naturellement la ligne de commandes de git pour les trucs un peu fins

Etilem commented 5 years ago

@JiPiBi

on pourrait aussi imaginer que l'init consiste à demander à l'utilisateur de choisir ses 3 parametres (dans les choix possibles pré"vus en particulier sur la langue)

je vais rajouter la possibilité de choisir aussi les bornes, en plus de la langue :+1:

@parmentelat

je n'ai pas encore exploré du tout la partie git dans atom

ça vaut le coup d'oeil, les modifs/ajouts sont colorés (resp. en beige et vert) dans l'arbo des fichiers, on peut faire les actions fetch, pull, push, force push choisir une branche ou en créer une nouvelle visualiser les titres du journal des commits, faire un commit après avoir saisi son message, c'est pratique et rapide, sauf pour 'git log' auquel j'accède dans le terminal.

ghost commented 5 years ago

@Etilem Je viens de voir que vous avez lancé un jeu de puissance 4 . Dans la dernière version que j'ai regardée , MACHINE joue contre MACHINE et je n'ai vu qu'une pose de pion au hasard dans une colonne : est ce correct ? Remarque d'étonnement : la dernière fois que j'ai joué à Puissance 4, on gagnait avec 4 pions alignés , là c'est 5 ? Comptez vous continuer à faire évoluer le jeu , sinon pourrais je reprendre votre base , pour créer des classes Joueurs comme à Othello et essayer de developper une stratégie du genre prioriser la pose sur une case gagnante , puis sur une case qui empeche de perdre au tour suivant .......

Etilem commented 5 years ago

@JiPiBi

Je viens de voir que vous avez lancé un jeu de puissance 4 . Dans la dernière version que j'ai regardée , MACHINE joue contre MACHINE et je n'ai vu qu'une pose de pion au hasard dans une colonne : est ce correct ?

oui, p4_rand_simu.py est juste une simulation aléatoire et le programme n'affiche que le résultat : soit égalité, soit la couleur gagnante,

Remarque d'étonnement : la dernière fois que j'ai joué à Puissance 4, on gagnait avec 4 pions alignés , là c'est 5 ?

c'est paramétrable dans le source au moyen de la constante LENGTH,

Comptez vous continuer à faire évoluer le jeu , sinon pourrais je reprendre votre base , pour créer des classes Joueurs comme à Othello et essayer de developper une stratégie du genre prioriser la pose sur une case gagnante , puis sur une case qui empeche de perdre au tour suivant .......

et bien, je pensais créer plusieurs modules, par exemple :

maintenant, vous pouvez créer un répertoire à votre nom dans le dossier racine puissance4 et reprendre ce que j'ai codé, oui bien sûr !

ghost commented 5 years ago

@etilem J'ai fait un peu de code utilisant le votre pour gérer sur le principe de mon code othello le choix des joeurs et j'ai pu réaliser un duel d'humains . La partie AI reste à venir, comme d'habitude c'est le plus compliqué car il faut coder des stratégies plus ou moins complexes en essayant de voir plusieurs coups d'avance .

J'ai regardé les différents codes des modules et je suis un peu étonné du niveau de découpage très fin du jeu : en terme de classes , ce qui peut ensuite se traduire en modules , je pensais de mon coté

Remarque de détail sur le module Board : dans l'init, pourquoi ne pas utiliser directement le paramètre players à l'init et recréer une liste,sauf si vous envoyez autre chose à l'init , ce n'est qu'un détail

Etilem commented 5 years ago

@JiPiBi hello, pour moi, le module, c'est un regroupement par utilité, alors que la classe, c'est déjà un objet, c'est déjà le runtime, par exemple, p4_search ne regroupe que des fonctions, p4_config ne fait rien à part déclarer des constantes, mais joue un rôle central pour les autres modules, même p4_rand_simu n'est qu'un "produit dérivé" du jeu... donc regroupé pour une finalité, pour la remarque sur le paramètre 'players', auriez-vous un exemple ?

Etilem commented 5 years ago

@JiPiBi j'ajoute que si vous avez fait du SQL, je vois les modules comme appelés par GROUP BY, je sais pas si c'est très parlant...

ghost commented 5 years ago

@etilem : je n'ai qu' une expérience Java de classes dans des fichiers séparés. Pour le moment j'ai mis toutes mes classes python dans le même fichier. Donc si vous avez un lien qui explique les principes de découpage d'un code en modules je suis preneur. J'ai fait un peu de SQL mais le rapport entre l appel des modules et GROUPBY m'échappe...

Pour players je disais juste que ne connaissant pas le type de players : est ce déjà une liste ou pas, l intérêt de la transformation en 1 liste dans l init ne m apparaissait pas. En Java on sait ce qui est fourni , en python c plus compliqué

Etilem commented 5 years ago

@JiPiBi

je n'ai qu' une expérience Java de classes dans des fichiers séparés. Pour le moment j'ai mis toutes mes classes python dans le même fichier. Donc si vous avez un lien qui explique les principes de découpage d'un code en modules je suis preneur.

ah mais non, c'est juste une façon de faire, je n'ai pas de référence précise là-dessus, à part un peu de Ruby,

J'ai fait un peu de SQL mais le rapport entre l appel des modules et GROUPBY m'échappe...

disons que si je prends un set() de tous les types d'objets du programme (avec un select donc), je peux les regrouper par modules suivant certaines conditions, mais libre à vous de faire une équivalence module / classe comme en Java, je trouve ça moins souple,

Pour players je disais juste que ne connaissant pas le type de players : est ce déjà une liste ou pas, l intérêt de la transformation en 1 liste dans l init ne m apparaissait pas. En Java on sait ce qui est fourni , en python c plus compliqué

players est de type générateur, et pour être utilisé, je le transforme en liste à l'init, mais je ne sais pas si c'est vraiment la façon de faire, les générateurs sont tout nouveaux pour moi :)

Etilem commented 5 years ago

La partie AI reste à venir, comme d'habitude c'est le plus compliqué car il faut coder des stratégies plus ou moins complexes en essayant de voir plusieurs coups d'avance .

oui, dans mon cas d'implémentation (puissance4), je pense que l'IA devrait lancer +sieurs simulations suivant les colonnes jouables, en testant par exemple des combinaisons de jeu à 3 coups d'avance, avec un système d'évaluation perte/gain, donc dans le détail, le module p4_ai (module d'ia) ferait appel à un nouveau module p4_simu (simulations à la demande) qui lui-même ferait appel à p4_search (recherche de grille résolue)... est-ce la bonne méthode ?

ghost commented 5 years ago

players est de type générateur, et pour être utilisé, je le transforme en liste à l'init, mais je ne sais pas si c'est vraiment la façon de faire, les générateurs sont tout nouveaux pour moi :) un generateur pour 2 players me parait très généreux :-)

En ce qui concerne les stratégies , il faut définir ce qu'on appelle pertes / gain à puissance 4 :

N'ayant pas l'habitude de jouer avec les modules j'imagine que dans ma classe Joueur AI j'implanterais dans la méthode joue (meme nom que pour Joueur humain mais ne fait pas la meme chose) , une boucle qui balaie les possibilités de pose de chacun des joueurs sur plusieurs tours , (cette boucle peut aussi etre dans une autre méthode ) fasse appel à une méthode qui évalue les poses suivant les priorités évoquées ci-dessus, mémorise la situation la plus favorable de mon premier coup , retire les pions pour se remettre dans la situation de départ au début de chaque branche et au final pose définitivement le pion. Tout ca pour dire que le découpage en sous -méthodes élémentaires est un peu du feeling qui permet de rendre le code de la méthode principale plus lisible et ne casse pas tout qd par exemple on change sa vison de la priorisation . J'essaie de raisonner avec du pseudocode en commentaire avant de coder en dur J'avoue que m'étant engagé dans plusieurs MOOC ce n'est pas actuellement ma priorité majeure ... Bon courage

Etilem commented 5 years ago

@JiPiBi merci pour tes conseils et encouragements, j'ai trouvé un point de départ : l'algorithme minimax avec simplification negamax et élagage alpha-beta, si j'arrive à le coder, ce sera déjà bien !

Etilem commented 5 years ago

@JiPiBi

je n'ai qu' une expérience Java de classes dans des fichiers séparés. Pour le moment j'ai mis toutes mes classes python dans le même fichier. Donc si vous avez un lien qui explique les principes de découpage d'un code en modules je suis preneur.

ah mais non, c'est juste une façon de faire, je n'ai pas de référence précise là-dessus, à part un peu de Ruby,

et le cours bien sûr... peut-être que cette page sur les modules et mixins en Ruby vous intéressera :)

ghost commented 5 years ago

@etilem Merci , n'étant pas du tout familier de Ruby les informations ne me parlent pas trop. Du coup j'ai regardé sur Google quelques questions sur le sujet des modules et des classes : j’espère que le présent MOOC nous aidera à mieux comprendre car cela semble qd même etre assez libéral dans l'approche entre mettre chaque simple fonction dans un module et mettre tout le code dans un seul fichier ...

J'aimerais surtout ne pas faire des tas d'import dans la partie principale d'un jeu , peut etre qu'un module qui importerait lui meme tous les composants du jeu serait interessant , car sinon toute remise en cause de découpage a un impact sur le programme principal qui est sensé etre independant des détails d'implémentation (encapsulation)

parmentelat commented 5 years ago

Vous avez raison, il est important d'exposer des noms d'une façon qui ne dépend pas de l'implémentation choisie.

C'est en autres à ça que peut servir le __init__.py d'un package; il peut importer par exemple la classe Foo du fichier local foo.py, ce qui rend le symbole visible directement dans le package.

J'essaie de m'expliquer: vous avez une bibliothèque lalib:

lalib/
        foo.py  <- définit la classe Foo
        bar.py  <- définit la classe Bar

Alors vous écririez dans lalib/__init__.py quelque chose comme

from .foo import Foo
from .bar import Bar

Ce qui fait qu'ensuite l'application qui utilise lalib peut faire juste

from lalib import Foo, Bar

sans avoir besoin de savoir les choix qu'a fait lalib à l'intérieur de son code; pour autant que l'application est concernée ça pourrait être tout dans un seul fichier, ce n'est pas pertinent de devoir entrer dans plus de détails.

Cela dit, je ne suis pas sûr que ça répond à votre point ..

parmentelat commented 5 years ago

Après ça, le fait de définir plein de petites classes ou une seul grosse, dans un ou plusieurs modules, ou encore d'utiliser l'espace de nom d'un module plutôt que celui d'une classe, ce sont des choix qui sont à la fois un peu religieux (voir par exemple l'approche très dogmatique de Java) et aussi qu'on affine avec l'expérience et la pratique.

Nous n'avons pas essayé de répondre à ce type de problématiques dans le cours, ça nous aurait emmené beaucoup trop loin, et aussi donc parce que c'est très subjectif :)

ghost commented 5 years ago

@parmentelat j'avais déjà du mal avec les classes et les modules et là vous m'emmenez sur les packages, (ou bibliothèque ?) et la façon de les importer :-) Pour essayer de mieux comprendre votre message je suis en train d'essayer de déchiffrer les infos issues de ce lien

Etilem commented 5 years ago

bonsoir à tous,

j'ai des soucis avec les fonction AI.play et AI.negamax dans le fichier player.py, je pense que mon implémentation est buguée, par exemple l'IA n'arrive pas à contrer un coup adverse qui donnerait la victoire au prochain coup

ghost commented 5 years ago

bonsoir Je n'ai pas réussi à décoder la stratégie du best , meme en lisant le pseudocode , est ce qu'elle permet de prioriser des actions comme je l'avais suggéré : d'abord jouer la colonne gagnante , puis la case qui donne la victoire à l'adversaire .....

Etilem commented 5 years ago

@JiPiBi

C'est pourtant tout l'objet du minimax simplifié en negamax !

Arbre minimax

dans cet arbre, si j'évalue les cases en bleu, je prends en compte les valeurs des cases jouées par l'adversaire au coup suivant et récursivement jusqu'à la profondeur permise,

la valeur de chaque coup remonte alors l'arbre suivant une alternance (pas nécessairement dans cet ordre) gain max / perte min / gain max / perte min ... jusqu'au sommet pour m'indiquer quelle case bleue jouer.

ça doit être ma fonction d'évaluation qui est foireuse...

Etilem commented 5 years ago

par exemple, en lançant ai_simu.py (IA contre IA), je ne comprends pas pourquoi Noir joue en c2 alors qu'il est évident qu'il faut jouer en c5 pour contrer un coup victorieux

capture d ecran de 2018-11-06 09-26-31

ghost commented 5 years ago

@sebhoa

Bonjour J'ai vu que dans le repertoire sudoku vous avez proposé de décoder des grilles sudoku un peu difficiles. J'ai donc voulu voir ce que donnait le code que j'avais mis au point pour le projet Euler , mais pour le niveau de grilles que vous proposez , il patinait.... J'ai donc remis une couche sur mon code et je l'ai ensuite passé en objet avec un objet Case et un objet Grille . Mes constats:

j'ai ensuite neutralisé la recherche des solutions uniques et je n'ai pas vu d'ecart significatif (finalement mon principe de recherche des cases à nombre min de choix fait le meme travail).

Je n'ai pas utilisé de vraie recursivité , mais c'est un peu la meme chose en principe. D'ailleurs je me posais la question de la compatibilité du niveau de recursivité avec un sudoku ?

ghost commented 5 years ago

@ etilem certes c'est l'objet de l'arbre mais comme je ne comprends pas comment les stratégies sont évaluées , on en revient à la case départ. Comment est ce que la meilleure solution est évaluée :

Sur le jeu que vous montrez, jouer en c2 est vraiment très mauvais en terme de gain , puisque c5 non content d'empecher la victoire bleu procurerait aussi un alignement de 3 pieces , donc meme sur le seul critere du nombre de pions alignés la fonction de meilleur choix ne remplit pas sa mission.

Je ne comprends pas bien comment elle fonctionne , mais outre le haswon, ne pourriez vous intégrer un will_lose et un gainmax pour classer les coups et voir comment elle réagit. Mon raisonnement est valable au premier rang pour le win et deuxieme rang pour le lose, mais ensuite un win 2 coups plus tard ne peut etre retenu que s'il est obtenu quelque soit le coup joué par l'adversaire , je ne sais donc pas comment votre fonction réagit pour évaluer les situations qui dependent d'un choix de l'autre ou qui privilégie les solutions qui donnent un gain certain (alignement de n-1 pions dans plusieurs directions)

sebhoa commented 5 years ago

@JiPiBi

Bonjour,

J'ai du mal à comprendre comment vous propagez la résolution... enfin pour descendre pas de souci mais comment vous remontez si vous ne faites pas de "vraie" récursivité ? Une fois bloqué que faites vous ? J'ai inhumé mon vieux code de sudoku et avec des amis nous nous sommes lancés dans l'implémentation de certaines techniques "humaines" de simplification... ça m'a pris pas mal de temps, certaines techniques sont assez pénibles à coder (enfin moi j'ai trouvé pénible)... Au final j'ai un code lourd :( (plusieurs centaines de lignes) Mais je me suis bien amusé... il reste un peu plus de 6300 grilles qui nécessitent toujours un backtrack avec un temps moyen de résolution de 0.1s et le reste (un peu moins de 43000) qui sont résolues entièrement par les techniques en 0.02s en moyenne. Les temps ont augmentés : plus de techniques => plus long, et les 6300 avec backtrack sont les plus difficiles et donc augmentation aussi du temps.

-- Sébastien Hoarau

Le mar. 6 nov. 2018 à 17:47, JiPiBi notifications@github.com a écrit :

@sebhoa https://github.com/sebhoa

Bonjour J'ai vu que dans le repertoire sudoku vous avez proposé de décoder des grilles sudoku un peu difficiles. J'ai donc voulu voir ce que donnait le code que j'avais mis au point pour le projet Euler , mais pour le niveau de grilles que vous proposez , il patinait.... J'ai donc remis une couche sur mon code et je l'ai ensuite passé en objet avec un objet Case et un objet Grille . Mes constats:

  • je pensais que le passage en Objet allait ralentir le code , il n'en est rien , au contraire je vois une amélioration ??
  • je suis loin des performances que vous affichez sur ces grilles : je travaille avec un vieil ordi , mais il met une dizaine de secondes pour decoder une de vos grilles : est-ce normal ? , du coup pour 45000 grilles , il devrait mettre une dizaine d'heures .... Mon principe de codage :
  • je fais une boucle while qui a comme condition de sortie : aucun zero dans la grille
  • je recherche d'abord toutes les solutions uniques sur les cases à 0
  • puis je cherche la case avec le moins de choix possible sur les cases à 0
  • a chaque fois que j'entre une valeur dans la grille j'enregistre dans une liste la position x,y dans la grille et la valeur retenue
  • si une des cases à 0 n'a aucun choix possible , je reviens sur les choix précédents et corrige la grille

j'ai ensuite neutralisé la recherche des solutions uniques et je n'ai pas vu d'ecart significatif (finalement mon principe de recherche des cases à nombre min de choix fait le meme travail).

Je n'ai pas utilisé de vraie recursivité , mais c'est un peu la meme chose en principe. D'ailleurs je me posais la question de la compatibilité du niveau de recursivité avec un sudoku ?

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/flotpython/recreation/issues/2#issuecomment-436257728, or mute the thread https://github.com/notifications/unsubscribe-auth/AJl3G0BmOs0hMLMSD0af9EUTct1I_Wtrks5usZLegaJpZM4XUq_0 .

ghost commented 5 years ago

@etilem instructif pour moi, mais si vous ne connaissiez deja.... http://www.purebreak.com/news/puissance-4-voila-comment-gagner-a-tous-les-coups/68055