IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

programmer un morpion avec python


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Avril 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut programmer un morpion avec python
    Bonjour, je dois pour les cours programmer un morpion avec python. On doit pouvoir y jouer a 2, contre un ordinateur "bête" et contre un ordinateur "intelligent". voila tous ce que j'ai réussi à faire. Avez vous des conseils a me donner? Merci d'avance.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    a1="a1"
    a2="a2"
    a3="a3"
    b1="b1"
    b2="b2"
    b3="b3"
    c1="c1"
    c2="c2"
    c3="c3"
    plateaua=[a1,a2,a3]
    plateaub=[b1,b2,b3]
    plateauc=[c1,c2,c3]
     
     
     
    def afficheplateau():
    	print plateaua
    	print plateaub
    	print plateauc
    def joueur1():
    	a=raw_input("ou jouer joueur 1?: ")
    	if a=="a1":
    		plateaua[0]="*"
    	if a=="a2":
    		plateaua[1]="*"
    	if a=="a3":
    		plateaua[2]="*"
    	if a=="b1":
    		plateaub[0]="*"
    	if a=="b2":
    		plateaub[1]="*"
    	if a=="b3":
    		plateaub[2]="*"
    	if a=="c1":
    		plateauc[0]="*"
    	if a=="c2":
    		plateauc[1]="*"
    	if a=="c3":
    		plateauc[2]="*"	
     
    def joueur2():
    	a=raw_input("ou jouer joueur 2?: ")
    	if a=="a1":
    		plateaua[0]="o"
    	if a=="a2":
    		plateaua[1]="o"
    	if a=="a3":
    		plateaua[2]="o"
    	if a=="b1":
    		plateaub[0]="o"
    	if a=="b2":
    		plateaub[1]="o"
    	if a=="b3":
    		plateaub[2]="o"
    	if a=="c1":
    		plateauc[0]="o"
    	if a=="c2":
    		plateauc[1]="o"
    	if a=="c3":
    		plateauc[2]="o"
     
     
     
     
    def verifjoueur1():
    	if plateaua[0]=="*":
    		if plateaua[1]=="*":
    			if plateaua[2]=="*":
    				print "gagne"
    	if plateaub[0]=="*":
    		if plateaub[1]=="*":
    			if plateaub[2]=="*":
    				print "gagne"
    	if plateauc[0]=="*":
    		if plateauc[1]=="*":
    			if plateauc[2]=="*":
    				print "gagne"
    	if plateaua[0]=="*":
    		if plateaub[0]=="*":
    			if plateauc[0]=="*":
    				print "gagne"
    	if plateaua[1]=="*":
    		if plateaub[1]=="*":
    			if plateauc[1]=="*":
    				print "gagne"
    	if plateaua[2]=="*":
    		if plateaub[2]=="*":
    			if plateauc[2]=="*":
    				print "gagne"
    	if plateaua[0]=="*":
    		if plateaub[1]=="*":
    			if plateauc[2]=="*":
    				print "gagne"
    	if plateaua[2]=="*":
    		if plateaub[1]=="*":
    			if plateauc[0]=="*":
    				print "gagne"
    			else:
    				joueur2()
     
    def verifjoueur2():
    	if plateaua[0]=="o":
    		if plateaua[1]=="o":
    			if plateaua[2]=="o":
    				print "gagne"
    	if plateaub[0]=="o":
    		if plateaub[1]=="o":
    			if plateaub[2]=="o":
    				print "gagne"
    	if plateauc[0]=="o":
    		if plateauc[1]=="o":
    			if plateauc[2]=="o":
    				print "gagne"
    	if plateaua[0]=="o":
    		if plateaub[0]=="o":
    			if plateauc[0]=="o":
    				print "gagne"
    	if plateaua[1]=="o":
    		if plateaub[1]=="o":
    			if plateauc[1]=="o":
    				print "gagne"
    	if plateaua[2]=="o":
    		if plateaub[2]=="o":
    			if plateauc[2]=="o":
    				print "gagne"
    	if plateaua[0]=="o":
    		if plateaub[1]=="o":
    			if plateauc[2]=="o":
    				print "gagne"
    	if plateaua[2]=="o":
    		if plateaub[1]=="o":
    			if plateauc[0]=="o":
    				print "gagne"
    			else:
    				joueur1()				
    def jouera2():	
    	afficheplateau()
    	joueur1()
    	afficheplateau()
    	joueur2()
    	afficheplateau()
    	joueur1()
    	afficheplateau()
    	joueur2()
    	afficheplateau()
    	joueur1()
    	afficheplateau()
    	verifjoueur1()
    	afficheplateau()
    	verifjoueur2()
    	afficheplateau()
    	verifjoueur1()
    	afficheplateau()
    	verifjoueur2()
     
    def menu():
    	j=input("bonjour! a combien de jourut voulez vous jouer, ")
    	if j==2:
    		jouera2()
     
     
    menu()
    désolé je n'arrive pas à mettre les espaces.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Il y a moyen de condenser ton code en utilisant notamment plus de listes et des boucles, parce que là c'est assez pénible à lire
    De plus à ce que je vois on peut jouer plusieurs fois la même case ou ne pas jouer du tout.

    Condenser:
    - Utilise plutôt une liste de listes pour ton plateau, et fais une fonction d'affichage un peu plus évoluée
    - Pas la peine de faire une fonction pour chaque joueur, tu peux faire une fonction pour les 2, du genre verif(joueur)
    - Pas la peine de recopier à chaque fois le même test, tu peux utiliser une boucle et une fonction qui à partir des 3 cases renvoie, par exemple, 0 si les 3 cases ne sont pas occupées par le même joueur, 1 si elles sont occupées par le joueur 1, 2 par le joueur 2, tu peux faire ça très rapidement avec 2 tests et un dictionnaire

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    Tout d'abord je m'excuse du déterrage honteux de ce topic .

    Je suis en train de reproduire un jeu de morpion en console, et je me demande comment factoriser la fonction "joueur1" de titimaxou. Je débute (joke ?), enfin je me remet au Python et sur le coup aucune idée ne me vient à l'esprit... Je cherche également à factoriser la fonction "verifjoueur" du PO.

    Merci d'avance,


    Zooix.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    En utilisant une liste de listes, il te suffit de traiter la chaîne entrée pour savoir où chercher sur le plateau (obtenir les indices dans la liste). Par exemple pour "b1", il te faut (1, 0) qui correspond à la 2ème ligne, 1ère colonne.
    Ensuite, pour la vérification, tu fais une fonction qui prend en paramètre un identifiant de joueur (voire directement le caractère qui lui est associé) et qui va vérifier s'il a gagné, pour ça le plus simple à mon avis est de faire une boucle pour les lignes et les colonnes, puis de tester les 2 diagonales à part.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Points : 24
    Points
    24
    Par défaut
    Salut,

    Excuse-moi de poster des questions dont les réponses paraissent "évidentes", mais dnas le cas du plateau, commpent procédé par une liste de listes, as-tu du code à l'appui s'il te plaît ?

    Merci d'avance.

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    plateau = [[" ", " ", " "], [" ", " ", " "], [" ", " ", " "]]
    #Pour accéder à un élément :
    plateau[ligne][colonne]

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Points : 24
    Points
    24
    Par défaut
    C'est encore moi

    Tout d'abord, merci beaucoup pour tes réponses qui m'ont bien avancées. Mais je bute toujours sur la boucle, je peux faire tout les tests à la main à coup de "IF" mais je me plante ç chaque fois en utilisant une boucle "For" ou "WHILE". SI tu pouvais me détailler la marche à suivre, cela serait sympa .

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    En fait, après réflexion, plutôt qu'une liste de listes, le plus efficace serait de numéroter les cases :
    Tu stockes donc le plateau dans une liste simple, ça a l'avantage de faciliter la mise en place d'une boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    tests = [(0, 1, 2), (3, 4, 5), (6, 7, 8),
             (0, 3, 6), (1, 4, 5), (2, 5, 8),
             (0, 4, 8), (2, 4, 6)]
    gagne = False
    for i, j, k in tests:
        gagne |= (plateau[i] == symb) \
             and (plateau[j] == symb) \
             and (plateau[k] == symb)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Points : 24
    Points
    24
    Par défaut
    Merci, mais dans ce cas, pour faciliter la saisie des coordonnées de la case choisit par le joueur, existe-t-il une fonction pour remplacer tous les '1' par exemple du plateau par des "X" ou des "O". Tel une fonction replace ?

    A vrai dire, j'ai ceci pour le moment:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    a1, a2, a3, b1, b2, b3, c1, c2, c3 = 1, 2, 3, 4, 5, 6, 7, 8, 9
    ligneA = [a1, a2, a3]
    ligneB = [b1, b2, b3]
    ligneC = [c1, c2, c3]
    plateau = [(0, 1, 2), (3, 4, 5), (6, 7, 8),          # lignes
              (0, 3, 6), (1, 4, 5), (2, 5, 8),           # colonnes
              (0, 4, 8), (2, 4, 6)]                      # diagonales          
     
     
    def afficher_plateau():
        print ligneA
        print ligneB
        print ligneC
        jouer_joueur()
     
    def jouer_joueur():
    	entree = raw_input("ou jouer ?   ")
    Je cherche donc é créer une fonction "jouer_joueur" qui demande dans quelle case veut jouer le joueur et qui modifie la plateau suivant la donnée entrée par le joueur.
    Je voudrais également faire un fonction qui vérifie les cases entrées par le joueur pour tester s'il a gagné.

    Merci d'avance,


    Zooix.

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    La méthode replace existe oui, mais je ne vois pas en quoi ce serait utile ici, la numérotation n'apparaît en rien sur le plateau !

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Points : 24
    Points
    24
    Par défaut
    D'accord, mais je n'ai pas compris alors comment faire que l'utilisateur, s'il tape "3", change la case 3 par des "X", y comprit dans la variable plateau...

  12. #12
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Tu n'as apparemment pas bien compris ce que je voulais faire
    Pour le plateau :
    Ma liste tests était simplement là pour répertorier les combinaisons de cases à tester.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Points : 24
    Points
    24
    Par défaut
    J'ai honte, j'avais mal lu ton post... Merci à toi. Il me reste une question (au moins), comment t'y prends tu pour afficher le plateau après chaque coup ? Car là on a juste une liste, je peux très bien changer un élement de la liste, c'est ce que je fais d'ailleurs, puis je fias des tests grâce à ton code. Mais je ne peux pas afficher cette liste, je passe encore par 3 listes comme dans mon code précédent.

    Je serais content si quelqu'un pouvait m'aider . Merci d'avance.

  14. #14
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Moi aussi je me suis un peu amusé avec un morpion sur console. J'avais fait cela en application des threads, chaque thread représentant un joueur humain ou ordinateur. Ce qui fait que toutes les configurations sont possibles: humain contre humain, humain contre ordinateur et ordinateur contre lui-même. Il y a aussi des coef de pondération qui permettent de choisir les coups les meilleurs à chaque configuration de la grille, etc... Dans tous les cas, il est possible de demander un conseil sous forme d'une liste ordonnées de coups conseillés.

    Je suis loin d'être un spécialiste des jeux (ni même de Python), mais mon code fonctionne et peut te servir de source d'inspiration: http://python.jpvweb.com/mesrecettes...orpion_console.

    J'avais fait ce jeu de morpion en application d'un "modèle" de code que j'avais établi pour les jeux à damier (http://python.jpvweb.com/mesrecettes...eu_type_damier). Chaque joueur (humain ou ordinateur) est représenté par une instance de thread et joue dans un ordre défini. Après chaque coup de chaque joueur, le programme principal reprend la main pour évaluer la situation du jeu, en constater la fin ou sinon repasser la main au joueur suivant, et fournir les résultats et des statistiques.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 30
    Points : 24
    Points
    24
    Par défaut
    Salut !

    Merci bien, je suis en train de regarder ça, j'aurias surement plusieurs question (d'ailleurs oiffrig, la mienne reste toujours d'actualité . Je voulais savoir pourquoi tu as un 'u' après le print à la fin, lorsque ej test ton code et que je l'enlève, il me met une erreur...

    J'aurais surement d'autres questions plus tard... =) Merci en tout cas.

    [EDIT]: Je cherche un moyen avec le code de oiffrig d'afficher mon plateau, et les modifications faites dans celui-ci. J'ai essayé avec ça, mais ça ne marche pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def afficher_plateau():
     
        for i in plateau:
            if i == 3 or i == 6 or i == 9:
                print "\n"
            else: print plateau(i)
    Merci d'avance .

  16. #16
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Le u avant une chaine indique que c'est une chaine unicode. C'est pour que les accents soient correctement affichés.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  17. #17
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Ce qui est super avec Python, c'est qu'après avoir écrit un bout de code avec une idée d'algorithme, le fait d'avoir du code sous les yeux facilite la réflexion et permet d'améliorer non seulement le code sur des procédés mineurs mais l'algorithme lui même aussi.
    Cependant, il ne faut pas exagérer: il faut quand même avoir une idée relativement consistante d'algorithme pour commencer à coder. Et non pas le contraire, car ce n'est pas en pressant des lignes de code comme une éponge qu'on va en sortir un algorithme tout beau. Or j'ai bien l'impression que c'est ce que tu fais, Zooix.

    J'ai aussi l'impression que tu n'assimiles pas bien les réponses laconiques de oiffrig qui ne veut sans doute pas te donner une solution toute cuite. Il faut dire que ces réponses me semblent entachées de quelques maladresses, auquel cas ce ne serait pas du laconisme mais de la précipitation. Mais il se peut aussi que ce soit moi qui me plante, ce ne serait pas la première fois.



    Ce problème de morpion qui ne m'intéressait pas au départ s'est révélé plus intéressant que je ne le pensais et j'ai finalement trouvé une solution en partant de l'idée que je voulais éviter les cascades de if de titimaxou, les listes de listes et même une boucle. Ce ne serait pas très formateur que je balance ma solution toute faite. Aussi je préfère essayer de t'aider à débroussailler la vision de ton problème.

    Ce problème de morpion me semble intéressant par les points suivants:
    - comment représenter la grille et son remplissage ?
    - comment afficher le plateau ?
    - comment effectuer informatiquement un test d'alignement géométrique de symboles ?




    D'abord, avant de vouloir manipuler un plateau, il faudrait commencer par savoir ce qu'il est.
    Sur papier, il y a une grille avec deux sortes de symboles DEDANS.
    Dans le code, le plateau va être une variable représentant la grille et va donc CONTENIR les symboles dans des éléments représentant les cases du plateau papier, l'INDIÇAGE des éléments TRADUISANT LA POSITION DES CASES DANS LE PLAN.
    Donc dans le code, plateau va être un conteneur mais il ne faut pas se laisser induire en erreur par le message #1 de titimaxou qui commencer son programme en remplissant le plateau avec des chaines bi-caractères qui ne sont rien d'autres que les repères des cases de son plateau. (le plateau se repère lui-même ?....),
    ni par le message #12 de oiffrig dans lequel i écrit plateau = range(9),
    ni par le schéma du message #8 dont on peut croire qu'il s'agit du plateau lui-même.
    1 2 3
    4 5 6
    7 8 9
    Mais chez oiffrig c'est de l'étourderie, parce que si tu regardes bien le #8, quand il écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i, j, k in tests:
        gagne |= (plateau[i] == symb) \
             and (plateau[j] == symb) \
             and (plateau[k] == symb)
    il est bien clair que les i,j,k sont des indices et que les plateau[i] etc sont les symboles contenus dans les cases du plateau.
    NOTA: '|=' est une notation d'ensemble, ce doit être ici une coquille.





    Une fois ceci précisé, comment remplir plateau ?
    Le plus naturel est de faire comme tyrtamos: avec un symbole pour l'un des joueurs et un autre symbole pour le second joueur, remplir une seule variable plateau avec les différents caractères et surtout pas des plateaux distincts comme dans le message #1.

    Par quelle définition initiale faire entrer plateau en scène ?
    Ça dépend aussi de la façon dont on envisage l'afficher.
    Je suis d'accord avec oiffrig: il ne faut pas indicer les cases par deux repères mais un seul indice. Ce n'est donc pas bon de redéfinir ligneA, ligneB etc. mais ça je crois que tu l'as vu.
    Pas un tuple, puisque plateau doit être modifiable.
    Reste liste ou dictionnaire. La nécessité d'itérer n'oriente pas le choix de façon déterminante puisque on itérera aussi bien sur l'indice d'une liste que sur les clés d'un dictionnaire.
    Par contre, une liste a un avantage pour l'affichage: elle permet d'utiliser join(), à condition que les éléments soient du type chaine. Perso, je suis d'avis de remplir plateau d'un signe 'rien' à l'initialisation. Voici la différence de traitement pour l'affichage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    li = 9*['-']
    li[3] = 'x'
    print ' '.join(li[0:3]) + '\n' + '  '.join(li[3:6]) + '\n' + ' '.join(li[6:9])
     
    #----------------------------------------
     
    dico = {}.fromkeys(xrange(9),'-')
    dico[8] = 'O'
    for i in dico.iterkeys().sort():
        if i==3 or i==6:
            print '\n '+dico[i]
        else:
            print ' '+dico[i]
    On peut encore améliorer pour l'affichage mais ceci devrait déjà répondre à ta question.




    Reste ensuite l'épineux problème du test du plateau pour voir s'il y a un gagnant. Ce n'est pas si évident que je croyais au départ.
    - Je ne suis pas d'accord avec les nombreuses cascades de if du message #1.
    - Le test touffu de tyrtamos
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
         if "".join(grille[0])==x or \
            "".join(grille[1])==x or \
            "".join(grille[2])==x or \
            grille[0][0]+grille[1][0]+grille[2][0]==x or \
            grille[0][1]+grille[1][1]+grille[2][1]==x or \
            grille[0][2]+grille[1][2]+grille[2][2]==x or \
            grille[0][0]+grille[1][1]+grille[2][2]==x or \
            grille[0][2]+grille[1][1]+grille[2][0]==x:
    est à peine mieux car tant qu'on n'est pas arrivé au coup gagnant, les 8 expressions sont testées, à chaque coup d'un joueur.
    - Le test plus léger sur un tableau unidimensionnel de oiffrig:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    tests = [(0, 1, 2), (3, 4, 5), (6, 7, 8),
             (0, 3, 6), (1, 4, 5), (2, 5, 8),
             (0, 4, 8), (2, 4, 6)]
    gagne = False
    for i, j, k in tests:
        gagne |= (plateau[i] == symb) \
             and (plateau[j] == symb) \
             and (plateau[k] == symb)
    parait être est un peu optimisé parce que dès qu'un test plateau[u] == symb est faux, la suite de l'expression n'est pas évaluée. Mais il reste que tant qu'on n'est pas au coup gagnant, les 8 triplets dans la liste tests sont passés en revue, avec pour chacun de 1 à 3 tests logiques. Je doute qu'on y gagne. Gagner quoi d'ailleurs ? en vitesse ? Quand on joue au morpion, c'est a priori pour tuer le temps



    Donc maintenant, avec le coup de pouce sur l'affichage, tu devrais t'en tirer en t'appuyant sur le test d'oiffrig, bien qu'il y ait une meilleure manière de faire. Mais peut ètre que seul le résultat compte, quels que soient l'art et la manière. Suis intéressé de voir la suite.

  18. #18
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Citation Envoyé par eyquem Voir le message
    J'ai aussi l'impression que tu n'assimiles pas bien les réponses laconiques de oiffrig qui ne veut sans doute pas te donner une solution toute cuite. Il faut dire que ces réponses me semblent entachées de quelques maladresses, auquel cas ce ne serait pas du laconisme mais de la précipitation. Mais il se peut aussi que ce soit moi qui me plante, ce ne serait pas la première fois.
    En fait, c'est un peu des deux, je ne veux pas faire son travail, mais en même temps parfois je vais trop vite.

    Citation Envoyé par eyquem Voir le message
    Donc dans le code, plateau va être un conteneur mais il ne faut pas se laisser induire en erreur par le message #1 de titimaxou qui commencer son programme en remplissant le plateau avec des chaines bi-caractères qui ne sont rien d'autres que les repères des cases de son plateau. (le plateau se repère lui-même ?....)
    Je pense que c'est pour indiquer au joueur comment jouer le coup qu'il veut.

    Citation Envoyé par eyquem Voir le message
    ni par le message #12 de oiffrig dans lequel i écrit plateau = range(9), ni par le schéma du message #8 dont on peut croire qu'il s'agit du plateau lui-même.
    En fait, c'était à le fois une illustration du mode de numérotation, et un moyen de garder l'indication pour le lecteur (cf commentaire précédent).

    Citation Envoyé par eyquem Voir le message
    NOTA: '|=' est une notation d'ensemble, ce doit être ici une coquille.
    Que veux-tu dire par là ?
    |= est l'opérateur OU logique "in-place".

  19. #19
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Je ne connais pas bien les opérateurs sur-place et notamment pas celui du OU logique.
    J'ai lu dans cette page
    http://www.python.org/doc/2.5.2/lib/types-set.html
    que
    l'opération de mise à jour d'un ensemble s avec les éléments d'un ensemble t s'écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    s.update(t)
    # ou, de façon équivalente
    s |= t
    J'ai cru que cette notation était exclusivement utilisée pour cette opération. Encore une croyance hâtive.


    Je croyais.......
    ....aussi que tu avais voulu écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gagne = (plateau[i] == symb) and (plateau[j] == symb)  and (plateau[k] == symb)
    pour que, à partir d'une situation où gagne vaut False, il devienne True dès qu'un triplet (plateau[i],plateau[j],plateau[k]) serait égal à (symb,symb,symb).
    Il me semblait d'ailleurs qu'il manquait un break pour stopper l'itération dans tests et éviter ainsi que gagne reprenne la valeur False sur le triplet suivant. Mais je n'ai pas souligné ceci, pensant que j'avais bien le temps de m'apercevoir que je me trompais ... Ce qui est le cas. J'ai appris à me méfier et j'avance maintenant le plus possible d'une manière pythonienne: je marche sur des œufs.
    Par contre, ouf, j'avais bien vu pour les autres remarques. Merci de les prendre de cette façon débonnaire.
    Merci aussi si tu pouvais indiquer la page où on trouve les opérateurs in-place. Je l'ai vue une fois mais je n'arrive pas à la retrouver et je perds mon temps dans Google.


    ERRATUM

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in dico.iterkeys().sort():
    ne marche pas:
    l'itérateur iterkeys() n'a pas de méthode sort()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in dico.keys().sort():
    ne marche pas non plus:
    sort() ne renvoie pas de liste, dico.keys().sort() est None


    On est obligé d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dicokeys = dico.keys()
    dicokeys.sort()
    for i in dicokeys:

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Points : 102
    Points
    102
    Par défaut
    @eyquem: Le lien vers le "|=" http://docs.python.org/reference/dat...object.__ior__

    Suivant le mouvement de ce topic, je me suis un peu penché sur le problème.
    Mais je me suis orienté sur un morpion dont la taille du plateau serait variable. Et donc forcement sans pouvoir coder en dur les set de coordonnées qui gagnent.

    Ca donne un code un poil cryptique (j'ai un peu l'impression d'écrire du Perl des fois ) mais ca marche. Si vous avez des commentaires dessus, ils seront les (très) bienvenue.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Apprendre à programmer avec Python exercices 4.2
    Par bellamy dans le forum Général Python
    Réponses: 5
    Dernier message: 15/10/2009, 15h53
  2. Apprendre à programmer avec Python exercices 5.14
    Par bellamy dans le forum Général Python
    Réponses: 7
    Dernier message: 02/08/2008, 11h03
  3. exécuter des programmes avec python
    Par piotrgavriloff dans le forum Général Python
    Réponses: 1
    Dernier message: 24/06/2007, 02h09
  4. comment démarrer un programme.win32 avec python
    Par mr maggoo dans le forum Bibliothèques tierces
    Réponses: 4
    Dernier message: 19/12/2006, 11h49
  5. Peut-on programmer un morpion avec Prolog ?
    Par c_khadi dans le forum Prolog
    Réponses: 1
    Dernier message: 16/12/2006, 22h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo