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 :

Besoin d'aide programme PYTHON UNO


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Besoin d'aide programme PYTHON UNO
    Bonsoir, j'ai une erreur dans mon code et j'aimerai la corriger mais n'y parvient pas. Elle est toute simple : J'aimerais que lorsque ma liste z est vide, alors z=tas . Le probleme , je l'ai écrit en fonction, (qui est la fonction remplissage, ligne 183) c'est censé marcher, mais l'explorateur de variable me dit le contraire, et forcément, le code plante. Je vous remercie de votre aide. Je dois sûrement rajouter quelque chose dans le if __name__=="__main__": . Je précise , j'ai un niveau de terminale.
    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
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    # -*- coding: utf-8 -*-
    """
    Created on Mon Oct  5 14:14:57 2020
     
    @author: MORTAGNET
    """
    import random
     
     
     
    def jeu_uno():
     
        uno=[]
        chiffre=["1","2","3","4","5","6","7","8","9"]
        couleur=["r","v","b","j"]
        chiffre_0=["0"]
        for k in range(2):
            for i in chiffre:
                for j in couleur:
                    jeuentier=j+i
                    uno.append(jeuentier)
    #    print(uno)
        for e in chiffre_0:
            for k in couleur:
                jeuentier_0=k+e
                uno.insert(0,jeuentier_0)
        print("Votre jeu est le suivant :")
        return uno
     
     
    def melange(uno):
        random.shuffle(uno)
        print("Le jeu mélangé est :")
        return uno
     
     
     
    def distributionj1(uno):
        unojoueur1=[]
        # unojoueur2=[]
        # unojoueur3=[]
    #    input("Combien de joueur voulez vous dans votre partie ? ")
    #    print(uno)
        for i in range(7):
            unojoueur1.append(uno[0])
            del uno[0]
            # unojoueur2.append(uno[0])
            # del uno[0]
            # unojoueur3.append(uno[0])
            # del uno[0]
        # print("Joueur 1 : ")
        # print("Joueur 2 : ",unojoueur2)
        # print("Joueur 3 : ",unojoueur3)
        return unojoueur1
    tas=[]
    def distributionj2(uno):
        unojoueur2=[]
        for i in range(7):
            unojoueur2.append(uno[0])
            del uno[0]
        # print("Joueur 2 : ")
        return unojoueur2
     
    def distributionj3(uno):
        unojoueur3=[]
        for i in range(7):
            unojoueur3.append(uno[0])
            del uno[0]
        # print('''
              # Joueur 3 :
                  # ''')
        return unojoueur3
     
    def pioche(uno):
        piocheuno=uno[0]
        print("La première carte de la pioche est :")
        return piocheuno
     
     
     
    def jeu_d(d,piocheuno,uno): 
            print("C'est au tour du joueur 3 de jouer !")
            print(d)
            for i in d:
                if i[0]==piocheuno[0] or i[1]==piocheuno[1]:
                    a="test"
     
                    while a[0]!=piocheuno[0] and a[1]!=piocheuno[1] or a not in d:
                          a=input("Entrez la carte que vous souhaitez placer : ")
                    d.remove(a)
                    piocheuno=a
                    tas.append(a)
                    if d==[]:
                        return "Victoire du joueur 3 !"
                    print(piocheuno)
                    return jeu_b(b,piocheuno,uno)
     
            else:
                 remplissage(z)
                 print("Vous piochez jusqu'à obtenir une carte que vous pourrez poser")
                 for h in z:
     
                     d.append(h)
                     z.remove(h)
                     if h[0]==piocheuno[0] or h[1]==piocheuno[1]:
                         return jeu_d(d,piocheuno,uno)
            return jeu_b(b,piocheuno,uno)
     
    def jeu_b(b,piocheuno,uno):
            print("C'est au tour du joueur 1 de jouer !")
            print(b)
            for i in b:
                if i[0]==piocheuno[0] or i[1]==piocheuno[1]:
                    a="test"
     
    #                while a[0]!=piocheuno[0] or len(a)!=2 or a not in b:
                    while a[0]!=piocheuno[0] and a[1]!=piocheuno[1]:
                            a=input("Entrez la carte que vous souhaitez placer : ")
                    b.remove(a)
                    piocheuno=a
                    tas.append(a)
                    if b==[]:
                        return "Victoire du joueur 1 !"
                    print(piocheuno)
                    return jeu_c(c,piocheuno,uno)
     
     
            else:
                 remplissage(z)
                 print("Vous piochez jusqu'à obtenir une carte que vous pourrez poser")
                 for h in z:
     
                     b.append(h)
                     z.remove(h)
                     if h[0]==piocheuno[0] or h[1]==piocheuno[1]:
                         return jeu_b(b,piocheuno,uno)
            return jeu_c(c,piocheuno,uno)
     
     
    def jeu_c(c,piocheuno,uno):
     
            print("C'est au tour du joueur 2 de jouer !")
            print(c)
            for i in c:
                if i[0]==piocheuno[0] or i[1]==piocheuno[1]:
                    a="test"
     
                    while a[0]!=piocheuno[0] and a[1]!=piocheuno[1] or a not in c:
                          a=input("Entrez la carte que vous souhaitez placer : ")
                    c.remove(a)
                    piocheuno=a
                    tas.append(a)
                    if c==[]:
                        return "Victoire du joueur 2 !"
                    print(piocheuno)
                    return jeu_d(d,piocheuno,uno)
     
            else:
                 remplissage(z)
                 print("Vous piochez jusqu'à obtenir une carte que vous pourrez poser")
                 for h in z:
     
     
                     c.append(h)
                     z.remove(h)
                     if h[0]==piocheuno[0] or h[1]==piocheuno[1]:
                         return jeu_c(c,piocheuno,uno)
     
    #                 c.append(h)
    #                 print(c)
     
     
     
     
            return jeu_d(d,piocheuno,uno)
     
     
    #        
     
    #    else:
    #        pass
     
    def remplissage(z):
        if z==[]:
            z=tas
            print("La pioche a été remplie")
     
     
     
     
    if __name__=="__main__":
        x=melange(jeu_uno())
        truc=(jeu_uno())
        print(truc)
        print(melange(truc))
        z=melange(truc)
        b=distributionj1(truc)
        c=distributionj2(truc)
        d=distributionj3(truc)
        piocheuno=pioche(truc)
        print('''
              Jeu du joueur 1 :
                  ''')
        print(b)
        print('''
              Jeu du joueur 2 :
                  ''')
        print(c)
        print('''
              Jeu du joueur 3 :
                ''')
        print(d)
        print(pioche(truc))
        print(jeu_b(b,piocheuno,truc))

  2. #2
    Membre actif
    Bonjour,

    Déjà(lecture rapide en diagonale) il y a un souci indentation dans ton code... --> voir le else ligne 158

  3. #3
    Membre confirmé
    Citation Envoyé par Hominidé Voir le message
    Bonjour,

    Déjà(lecture rapide en diagonale) il y a un souci indentation dans ton code... --> voir le else ligne 158
    La syntaxe suivante est valide en python:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for i in items:
      if do_something(i):
        break
    else:
      # bloc exécuter si le for termine l'itération (i.e n'est pas terminé avec un break)
    Il est agréable d'avoir le choix. La difficulté est alors de faire le bon (ou le moins pire).

  4. #4
    Expert éminent sénior
    Salut,

    Citation Envoyé par Sh3perd Voir le message
    c'est censé marcher, mais l'explorateur de variable me dit le contraire, et forcément, le code plante. Je vous remercie de votre aide.
    Lorsque Python plante, il affiche un message d'erreur et l'instruction qui... sans cette information, difficile de faire un diagnostic.

    D'abord parce qu'il faut reproduire... i.e. passer du temps à jouer et ensuite espérer qu'il y aura une erreur au bout d'un moment (le plus court possible) et que ce soit la bonne (la même que vous constatez).

    Citation Envoyé par Fifan31 Voir le message
    La syntaxe suivante est valide en python
    La syntaxe est "valide" mais s'il n'y a pas de "break", on ira dans le block du else dans tous les cas et il ne sert à rien...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Je ne vois pas ce qui plante (dans mes tests, ça ne plante pas), z est bien remplie...

  6. #6
    Nouveau Candidat au Club
    Réponse pour tout le monde
    Bonjour à tous ! Avant tout, merci à tous de vos réponses nombreuses, en tant que nouveau sur ce site je ne m'attendais vraiment pas à une telle réactivité et une telle entraide. Je vais répondre à tous vos messages dans celui ci. Premièrement je contextualise : J'ai donc ce code à rendre pour lundi et la difficulté qu'il me reste à surmonter est le problème que j'ai énoncé. Je sais que le code n'est pas parfait (je vais le corriger avec vos améliorations, dont je vous remercie encore) mais je dois corriger cette erreur. Précisions : La pioche semble se remplir en effet, mais le soucis est le suivant: J'aimerais que puisque la pioche s'est remplie, le joueur pioche dans cette (nouvelle) pioche jusqu'à qu'il puisse poser une carte (comme le fait bien mon programme initial !) Le soucis c'est qu'au lieu de piocher quand il ne peut plus jouer, il passe au joueur suivant. Et, ducoup, les joueurs se passent chacun le tour et cela me donne une erreur de récursivité infinie : RecursionError: maximum recursion depth exceeded while calling a Python object . Je ne comprend pas pourquoi le joueur passe son tour et ne pioche pas. Regardez : (voici ce que me donne l'interpréteur python)
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    C'est au tour du joueur 2 de jouer !
    ['b2', 'b6']
    La pioche a été remplie
    Vous piochez jusqu'à obtenir une carte que vous pourrez poser
    C'est au tour du joueur 3 de jouer !
    ['v9']
    Ici, le joueur est censé piocher jusqu'à pouvoir jouer. Or, c'est le tour du joueur 3 qui prend sa place. Voila mon problème.
    Je vais répondre à vos questions :

    Citation Envoyé par Hominidé Voir le message
    Bonjour,

    Déjà(lecture rapide en diagonale) il y a un souci indentation dans ton code... --> voir le else ligne 158
    et
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Lorsque Python plante, il affiche un message d'erreur et l'instruction qui... sans cette information, difficile de faire un diagnostic.

    D'abord parce qu'il faut reproduire... i.e. passer du temps à jouer et ensuite espérer qu'il y aura une erreur au bout d'un moment (le plus court possible) et que ce soit la bonne (la même que vous constatez).



    La syntaxe est "valide" mais s'il n'y a pas de "break", on ira dans le block du else dans tous les cas et il ne sert à rien...

    - W
    et
    Citation Envoyé par Fifan31 Voir le message
    La syntaxe suivante est valide en python:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for i in items:
      if do_something(i):
        break
    else:
      # bloc exécuter si le for termine l'itération (i.e n'est pas terminé avec un break)
    Merci de vos réponses, j'ai ajouté le break comme indiqué , dans mon code. UPDATE : Le break empêche le joueur 2 de jouer. Je l'ai donc retiré, en revanche, si le problème vient de là, je suis prêt à modifier ma fonction autant de fois qu'il le faudra.
    Citation Envoyé par fatbob Voir le message
    Je ne vois pas ce qui plante (dans mes tests, ça ne plante pas), z est bien remplie...
    Tu as raison, cela semble marcher.

  7. #7
    Expert éminent sénior
    Salut,

    Citation Envoyé par Sh3perd Voir le message
    Et, ducoup, les joueurs se passent chacun le tour et cela me donne une erreur de récursivité infinie : RecursionError: maximum recursion depth exceeded while calling a Python object .
    Une fonction récursive, c'est comme une boucle, il faut tester une condition d'arrêt avant de descendre dans l'appel suivant.

    Mais le gros soucis, c'est que vous utilisez la récursivité pour vous éviter de structurer votre code correctement: il n'y a rien de récursif la dedans!

    Vous devriez avoir une fonction jouer prenant le numéro du joueur en paramètre et l'appeler en boucle depuis la partie principale qui décide éventuellement si la partie n'est pas terminée le jouer suivant avec lequel appeler jouer. Plus de récursion et plus d'erreur...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Nouveau Candidat au Club
    Mmh, je vois. C'est ce que j'avais tenté de faire mais je me demandais comment m'y prendre, si je devais faire une boucle qui appelle le joueur 1 de manière infinie, ou je ne sais pas trop, mais je vais tenter merci de votre réponse !


    J'ai tenté, mais sans succès, le programme estime que ma variable a ne peut être posée alors qu'elle est censée pouvoir l'être. Comment donc devrais-je m'y prendre ?

  9. #9
    Expert éminent sénior
    Citation Envoyé par Sh3perd Voir le message
    Comment donc devrais-je m'y prendre ?
    Le but est de remplacer jeu_d, jeu_b, jeu_c par une seule fonction jouer.
    Allez y par étapes.

    Vous voyez que jeu_d appelle jeu_b que jeu_b appelle jeu_c et que ce dernier appelle jeu_d.

    Dans un premier temps, il faut arriver à remplacer les return jeu_xyz(....) par return d'un booléen: soit xyz à gagné soit on fait jouer le jouer suivant. On devrait avoir un truc de la forme:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    j = 0
    while True:
           if jouer(j):
              j = (j + 1) % 3
           else:
              print (f'le joueur {j} a gagné')
              break


    Problème vous n'avez pas encore écrit jouer mais vous avez juste essayé de modifier jeu_{b, c, d}...
    Çà devrait fonctionner en fabriquant 2 listes:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    jeux = a, b, c
    jouer = jeu_b, jeu_c, jeu_d
    j = 0
    while True:
           if jouer[j](jeux[i], piocheuno, truc):
              j = (j + 1) % 3
           else:
              print (f'le joueur {j} a gagné')
              break

    Mais ce n'est qu'une étape qui suppose que vous avez modifié vos fonctions jeu_{b, c, d}...

    Une autre solution serait de recommencer en vous forçant à écrire une seule fonction prenant le n° du joeur en paramètre et en l'utilisant comme index dans les listes qui vont bien.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

###raw>template_hook.ano_emploi###