Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème projet Uno ISN

    3 mai 2015 à 13:16:46

    Bonjour à tous, alors voilà cette année j'ai un projet ISN où je dois réaliser le jeu du Uno en programme Python, j'ai déjà bien avancé, mais j'ai un problème lors de la vérification si la carte est "posable" ou pas, alors j'aurais voulu savoir si quelqu'un aurait la possibilité de m'aider à comprendre quelle est mon erreur dans mon programme. Je vous mets mon programme juste en dessous. 
    #importation
    
    from random import *
    
    
    #fonctions locales
    
    def jeu_de_cartes():
        """ Fonction qui renvoie un jeu de cartes triées"""
        jeu = [[0,"bleu"],[0,"rouge"],[0,"vert"],[0,"jaune"],
               [1,"bleu"],[1,"rouge"],[1,"vert"],[1,"jaune"]]
        return jeu
    
    
    def affichage(jeu):
        n = len(jeu)
        for k in range(n):
            print(jeu[k])
    
    
    def melange(jeu):
        """Prend en entree un jeu de cartes et le renvoie mélangé"""
        #simple fonction
        shuffle(jeu)
        return jeu
    
    
    def distribuer(jeu_mel):
        """fonction qui prend le jeu mélangé, le coupe en deux et le sépare en deux liste"""
        carte_joueur_1 = jeu_mel[0:2]
        carte_joueur_2 = jeu_mel[2:4]
        return carte_joueur_1,carte_joueur_2
    
    
    def pioche(jeu_mel):
        pioche = jeu_mel[4:7]
        return pioche
    
    
    def premiere_carte_posee(jeu_mel):
        """fonction qui choisit la dernière carte du jeu mélangé et en fait le talon"""
        talon = jeu_mel[7:8]
        return talon
    
    def jouer(talon):
        print ("la première carte est : " , talon)
        print ("joueur 1, vos cartes sont :" ,(j1))
        carte_jouee = []
        a = (input ("joueur 1, quelle carte voulez vous jouer ?"))
        carte_jouee.append(a)
        return carte_jouee
    
    
    def verification(talon,carte_jouee):
        n = len(talon)
        carte_talon = talon[n-1]
        verif = 0
        if carte_talon[0] == carte_jouee[0]: #Talon et carte même numéro
            verif = 1
        if talon[1] == carte_jouee[1]: #Talon et carte même couleur
            verif = 1
        return verif
    
    
       
        
    
    #programme principal
    
    jeu = jeu_de_cartes()
    
    jeu_mel = melange(jeu)
    
    j1,j2 = distribuer(jeu_mel)
    
    piioche = pioche(jeu_mel)
    
    talon = premiere_carte_posee(jeu_mel)
    
    carte_jouee = jouer(talon)
    
    verification(talon,carte_jouee)
    • Partager sur Facebook
    • Partager sur Twitter
      3 mai 2015 à 13:30:59

      salut,

      c'est parce que dans ta fonction jouer() :

      def jouer(talon):
          print ("la première carte est : " , talon)
          print ("joueur 1, vos cartes sont :" ,(j1))
          carte_jouee = []
          a = (input ("joueur 1, quelle carte voulez vous jouer ?"))
          carte_jouee.append(a)
          
          return carte_jouee
       

      Tu n'ajoutes qu'une donnée (ici 'a') à la liste carte_jouee, du coup au moment des comparaisons dans la fonction verifier():

          if talon[1] == carte_jouee[1]: #Talon et carte même couleur
              verif = 1
          return verif


      carte_jouee[1] n'existe pas d'ou ton erreur : IndexError: list index out of range.

      -
      Edité par HSystem 3 mai 2015 à 13:31:26

      • Partager sur Facebook
      • Partager sur Twitter
        3 mai 2015 à 13:54:26

        Ah oui en effet ! du coup mon problème vient de mes cartes, mais je n'arrive pas à définir mes cartes pour faire en sorte que, par exemple si l'on tape : talon[0] , python m'affiche le numéro de la carte et si l'on tape : talon[1] , il m'affiche la couleur carte talon et carte_jouee sont des listes de liste comme le montre là : 

        >>> talon
        [[0, 'jaune']]
        >>> talon[0]
        [0, 'jaune']
        >>> carte_jouee
        [[1, 'bleu']]



        • Partager sur Facebook
        • Partager sur Twitter
          3 mai 2015 à 14:09:18

          Par exemple sans modifier trop ton code, l'utilisateur devra saisir:

          Joueur 1, quelle carte voulez vous jouer? 1 vert

          et modifier jouer() en :

          def jouer(talon):
              print ("la première carte est : " , talon)
              print ("joueur 1, vos cartes sont :" ,(j1))
              carte_jouee = []
              a = (input ("joueur 1, quelle carte voulez vous jouer ?"))
              
              a=a.split(' ')
              
              carte_jouee.append(a[0])
              carte_jouee.append(a[1])
              
              return carte_jouee




          • Partager sur Facebook
          • Partager sur Twitter
            3 mai 2015 à 14:14:36

            Salut,

            Lors de la création du talon dans la fonction premiere_carte_posee(), tu utilise l'indexation: jeu_mel[7:8]. Or avec cette écriture, python te renverra une liste de listes. Par exemple -> [[1, "vert"]].

            C'est ce qui induit ton erreur: dans la fonction verification(). Avec carte_talon tu récupère bien la carte, et la comparaison avec carte_jouee est bien faite, mais la deuxième comparaison n'est pas bonne, car d'une part comme tu n'as qu'une carte dans ton talon, talon[1] te renverra une erreur, mais même si tu avais plusieurs cartes, ta comparaison se ferait entre la carte entière [1, "vert"] et simplement la couleur de la carte du joueur. Pour y remédier, il faut de nouveau utiliser carte_talon: if carte_talon[1] == carte_jouee[1]

            Sinon ton code est plutôt bien stucturé (en tout cas il est clair). Quelques petites remarques:

            #La boucle for permet de parcourir immédiatement les élément d'un itérable:
            def affichage(jeu):
                for elt in jeu:
                    print(elt)
            
            
            #shuffle n'as pas besoin d'être utilisé dans une fonction
            shuffle(jeu)  #suffit
            
            
            #Pas besoin de variable intermédiaire
            def distribuer(jeu_mel):
                """fonction qui prend le jeu mélangé, le coupe en deux et le sépare en deux liste"""
                return jeu_mel[0:2], jeu_mel[2:4]
            
            def pioche(jeu_mel):
                return jeu_mel[4:7]
            
            def premiere_carte_posee(jeu_mel):
                """fonction qui choisit la dernière carte du jeu mélangé et en fait le talon"""
                return jeu_mel[7:8]
            
            
            #Pas besoin d'initialiser verif
            def verification(talon,carte_jouee):
                carte_talon = talon[-1]  #La dernière carte de talon
                if carte_talon[0] == carte_jouee[0]: #Talon et carte même numéro
                    return 1
                if carte_talon[1] == carte_jouee[1]: #Talon et carte même couleur
                    return 1



            -
            Edité par Olygrim 3 mai 2015 à 14:16:13

            • Partager sur Facebook
            • Partager sur Twitter
            Précepte: Le mieux est l'ennemi du bien
              3 mai 2015 à 14:30:46

              Merci pour ces conseils, je vais re-bosser dessus en prenant en compte ce que vous m'avez dit, et merci aussi de m'avoir consacré du temps en tout cas !

              -
              Edité par JulienIborra 3 mai 2015 à 14:33:25

              • Partager sur Facebook
              • Partager sur Twitter
                3 mai 2015 à 14:37:05

                [VIDE]





                -
                Edité par HSystem 3 mai 2015 à 14:39:46

                • Partager sur Facebook
                • Partager sur Twitter
                  18 mai 2015 à 9:33:23

                  Bonjour, alors voilà j'ai bien avancédans le programme, enfin je crois, et j'ai de nouveau un problème dont je ne vois pas d'où vient l'erreur, est ce que quelqu'un pourrait m'orienter un peu s'il vous plait ?

                  #importation
                  
                  from random import *
                  
                  
                  #fonctions locales
                  
                  def jeu_de_cartes():
                      """ Fonction qui renvoie un jeu de cartes triees"""
                      jeu = [[0,"bleu"],[0,"rouge"],[0,"vert"],[0,"jaune"],
                             [1,"bleu"],[1,"rouge"],[1,"vert"],[1,"jaune"]]
                      return jeu
                  
                  
                  def affichage(jeu):
                      n = len(jeu)
                      for k in range(n):
                          print(jeu[k])
                          
                  
                  
                  def melange(jeu):
                      """Prend en entree un jeu de cartes et le renvoie mélangé"""
                      #simple fonction
                      shuffle(jeu)
                      return jeu
                  
                  
                  def distribuer(jeu_mel):
                      """fonction qui prend le jeu mélangé, le coupe en deux et le sépare en deux liste"""
                      carte_joueur_1 = jeu_mel[0:2]
                      carte_joueur_2 = jeu_mel[2:4]
                      return carte_joueur_1,carte_joueur_2
                  
                  
                  def pioche(jeu_mel):
                      pioche = jeu_mel[4:7]
                      return pioche
                  
                  
                  def premiere_carte_posee(jeu_mel):
                      """fonction qui choisit la dernière carte du jeu mélangé et en fait le talon"""
                      talon = jeu_mel[7:8]
                      return talon
                  
                  def jouerj1(talon):
                      print ("La premiere carte est : " , talon)
                      print ("Joueur 1, vos cartes sont :", j1)
                      a = eval(input ("Joueur 1, quelle carte voulez vous jouer ?"))
                      carte_joueej1 = j1[a-1]
                      return carte_joueej1
                  
                  def jouerj2(talon):
                      print ("La premiere carte est : " ,talon)
                      print ("Joueur 2, vos cartes sont :" ,j2)
                      a = eval(input ("Joueur 2, quelle carte voulez vous jouer ?"))
                      carte_joueej2 = j2[a-1]
                      return carte_joueej2
                  
                  
                  def verificationj1(carte_talon,carte_joueej1):
                      verifj1 = 0
                      if carte_talon[0] == carte_joueej1[0]: #Talon et carte même numéro
                          verifj1 = 1
                      if carte_talon[1] == carte_joueej1[1]: #Talon et carte même couleur
                          verifj1 = 1
                      return verifj1
                      
                  
                  def verificationj2(carte_talon,carte_joueej2):
                      verifj2 = 0
                      if carte_talon[0] == carte_joueej2[0]: #Talon et carte même numéro
                          verifj2 = 1
                      if carte_talon[1] == carte_joueej2[1]: #Talon et carte même couleur
                          verifj2 = 1     
                      return verifj2
                  
                  def remplacementj1(talon,carte_joueej1):
                      if verifj1 == 1:
                          print ("Vous pouvez poser la carte.")
                          del(talon[-1])
                          talon.append(carte_joueej1)
                          return carte_talon
                      else:
                          print ("Vous ne pouvez pas poser cette carte, piochez.")
                      
                  
                  
                  def remplacementj2(talon,carte_joueej2):
                      if verifj2 == 1:
                          print ("Vous pouvez poser la carte.")
                          del(talon[-1])
                          talon.append(carte_joueej2)
                          return carte_talon
                      else:
                          print ("Vous ne pouvez pas poser cette carte, piochez.")
                      
                  
                  #programme principal
                  
                  jeu = jeu_de_cartes()
                  
                  jeu_mel = melange(jeu)
                  
                  j1,j2 = distribuer(jeu_mel)
                  
                  piioche = pioche(jeu_mel)
                  
                  talon = premiere_carte_posee(jeu_mel)
                  
                  carte_joueej1 = jouerj1(talon)
                  
                  carte_talon = talon[-1]
                  
                  verifj1 = verificationj1(carte_talon,carte_joueej1)
                  
                  remplacementj1(talon,carte_joueej1)
                  
                  carte_talon = talon[-1]
                      
                  carte_joueej2 = jouerj2(talon)
                  
                  carte_talon = talon[-1]
                  
                  verifj2 = verificationj2(carte_talon,carte_joueej2)
                  
                  remplacementj2(talon,carte_joueej2)
                  
                  carte_talon = talon[-1]
                  



                  La premiere carte est :  [[1, 'bleu']]
                  Joueur 1, vos cartes sont : [[1, 'vert'], [0, 'rouge']]
                  Joueur 1, quelle carte voulez vous jouer ?[1, 'vert']
                  Traceback (most recent call last):
                    File "F:\Python projet blanc UNO à récupéré.py", line 112, in <module>
                      carte_joueej1 = jouerj1(talon)
                    File "F:\Python projet blanc UNO à récupéré.py", line 51, in jouerj1
                      carte_joueej1 = j1[a-1]
                  TypeError: unsupported operand type(s) for -: 'list' and 'int'
                  >>> 
                  Voilà mon erreur.

                  -
                  Edité par JulienIborra 18 mai 2015 à 9:34:46

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 mai 2015 à 18:27:23

                    On utilise JAMAIS la méthode eval() sur un input() (une entrée utilisateur). Tout simplement parce que du code malveillant pourrait être exécuté. Ensuite qu'est-ce que tu entre dans le input()?
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Précepte: Le mieux est l'ennemi du bien
                      18 mai 2015 à 20:05:25

                      En fait j'aimerais que ce que je vais mettre dans mon input, ne soit pas renvoyer en tant que str.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 mai 2015 à 20:13:53

                        Ok, mais tu met quoi dans ton input(). Un exemple?
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Précepte: Le mieux est l'ennemi du bien
                          18 mai 2015 à 20:20:17

                          oui, en fait je fais le copier - coller d'une des cartes proposées que le joueur possède, par exemple [0 ; 'vert']
                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 mai 2015 à 20:40:07

                            Il vaut mieux changer cette façon de faire. Je m'explique, quand tu fais cet input, l'utilisateur peut rentrer n'importe quelle carte. Rien ne l'oblige à prendre une carte qu'il possède. De plus, l'utilisateur va pas rentrer à chaque fois la forme: [numéro, "couleur"], c'est fastidieux.

                            C'est à toi de faire un lien simple entre ce que va rentrer l'utilisateur et ce que tu vas récupérer: c'est ce qu'on appelle une interface. Autrement dit, au lieu de demander à l'utilisateur la carte qu'il veut jouer, demande-lui plutôt le numéro que tu vas associer à la carte:

                            jeu = [[0,"bleu"],[0,"rouge"],[0,"vert"],[0,"jaune"],
                                       [1,"bleu"],[1,"rouge"],[1,"vert"],[1,"jaune"]]
                            
                            for indice, carte in enumerate(jeu):
                                print("{}. Carte {}".format(indice, carte))
                            
                            choix = int(input("Choisissez un numéro de carte à jouer: "))
                            
                            #affichage de la carte
                            print(jeu[choix])
                            
                            #Suppression de la carte
                            del jeu[choix]



                            • Partager sur Facebook
                            • Partager sur Twitter
                            Précepte: Le mieux est l'ennemi du bien
                              18 mai 2015 à 20:52:37

                              Merci beaucoup j'ai compris !
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Problème projet Uno ISN

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown