Partage
  • Partager sur Facebook
  • Partager sur Twitter

Appartenance d'un caractère d'une liste à une autr

    22 février 2020 à 22:37:30

    Bonsoir à tous, j'essaye de faire un mastermind et j'ai presque tout fini mais UNE ligne de code me pose problème, il fait partie d'une fonction sensés trouver les couleurs d'une liste joueur qui sont identiques à une autre liste appeler ordi mais qui sont ne sont pas placé dans l'ordre de cette dernière liste (voir https://www.wikiwand.com/fr/Mastermind section principe).

    La fonction possède deux liste : - mal_place qui possède les même éléments que la liste joueur et qui ne possède pas de couleur bien placée / - verif qui est la liste qui possède les couleurs de ordi mais sans doublons.

    Voici le code en question :

    def recherche_mal_place () :
        mal_place = joueur[:]
        for i in range (4) :
            if joueur[i] == ordi[i] :
                del mal_place[i]
        verif =[]
        for str in ordi :
            if str not in verif:
                verif.append(str)
        for i in range(len(mal_place)) :
            if mal_place[i] in verif :
                del mal_place[i]
        return mal_place

    Mon problème c'est que mon dernier for ne veut pas s’exécuter à cause d'une erreur ci-dessous :

    <ipython-input-1-12a747c7306b> in recherche_mal_place()
         38     for i in range (4) :
         39         if joueur[i] == ordi[i] :
    ---> 40             del mal_place[i]
         41     verif =[]
         42     for str in ordi :
    
    IndexError: list assignment index out of range

    Pourriez vous m'aider s'il-vous-plait ?

    • Partager sur Facebook
    • Partager sur Twitter
      23 février 2020 à 0:13:00

      YasphinX a écrit:

      Bonsoir à tous, j'essaye de faire un mastermind et j'ai presque tout fini mais UNE ligne de code me pose problème, il fait partie d'une fonction sensés trouver les couleurs d'une liste joueur qui sont identiques à une autre liste appeler ordi mais qui sont ne sont pas placé dans l'ordre de cette dernière liste (voir https://www.wikiwand.com/fr/Mastermind section principe).

      La fonction possède deux liste : - mal_place qui possède les même éléments que la liste joueur et qui ne possède pas de couleur bien placée / - verif qui est la liste qui possède les couleurs de ordi mais sans doublons.

      Voici le code en question :

      def recherche_mal_place () :
          mal_place = joueur[:]
          for i in range (4) :
              if joueur[i] == ordi[i] :
                  del mal_place[i]
          verif =[]
          for str in ordi :
              if str not in verif:
                  verif.append(str)
          for i in range(len(mal_place)) :
              if mal_place[i] in verif :
                  del mal_place[i]
          return mal_place

      Mon problème c'est que mon dernier for ne veut pas s’exécuter à cause d'une erreur ci-dessous :

      <ipython-input-1-12a747c7306b> in recherche_mal_place()
           38     for i in range (4) :
           39         if joueur[i] == ordi[i] :
      ---> 40             del mal_place[i]
           41     verif =[]
           42     for str in ordi :
      
      IndexError: list assignment index out of range

      Pourriez vous m'aider s'il-vous-plait ?


      Oui, c'est normal, tu supprimes des termes de la liste et tu la parcours sans en tenir compte donc un moment tu tombes dans le vide (indexError). C'est très très très rarement une bonne idée de supprimer un élément au beau milieu d'une liste avec del (ou autre). 

      Ton code est assez curieux. Par exemple, tu utilises une fonction recherche_mal_place mais elle ne prend aucun paramètre alors qu'elle dépend de la liste joueur et de la liste ordi. Attention, tu utilises une variable str mais str représente un type en Python et tu as écrasé ce type (par grave pour ton programme mais ça ne se fait pas).

      Plutôt que d'effacer des éléments avec del, tu ferais mieux de partir d'une liste vide et d'ajouter ce qu'il faut. 

      EDIT A part ça, ton idée est correcte : tu gardes les positions où il y a une différence (ce qui revient à trouver le nombre de noirs) et tu cherches l'intersection des restes (ce qui donne le nombre de blancs).

      -
      Edité par PascalOrtiz 23 février 2020 à 1:01:11

      • Partager sur Facebook
      • Partager sur Twitter
        23 février 2020 à 15:18:22

        PascalOrtiz a écrit:


        Oui, c'est normal, tu supprimes des termes de la liste et tu la parcours sans en tenir compte donc un moment tu tombes dans le vide (indexError). C'est très très très rarement une bonne idée de supprimer un élément au beau milieu d'une liste avec del (ou autre). 

        Ton code est assez curieux. Par exemple, tu utilises une fonction recherche_mal_place mais elle ne prend aucun paramètre alors qu'elle dépend de la liste joueur et de la liste ordi. Attention, tu utilises une variable str mais str représente un type en Python et tu as écrasé ce type (par grave pour ton programme mais ça ne se fait pas).

        Plutôt que d'effacer des éléments avec del, tu ferais mieux de partir d'une liste vide et d'ajouter ce qu'il faut. 

        EDIT A part ça, ton idée est correcte : tu gardes les positions où il y a une différence (ce qui revient à trouver le nombre de noirs) et tu cherches l'intersection des restes (ce qui donne le nombre de blancs).

        -
        Edité par PascalOrtiz il y a environ 13 heures


        Merci pour votre réponse, tout d'abord pour revenir au liste joueur et ordi ils sont situés dans des fonctions à part comme vous pouvez le voir dans le code du programme en entier :

        titre_du_jeu = "Mastermind"
        nb_ligne = 4
        nb_de_chance = 12
        couleur = ("rouge","vert","bleu","jaune")
        ordi = []
        joueur = []
        i = 0 
        a = 0 
        
        def saisie_couleur(a) :
            reponse = ''
            while reponse not in couleur :
                reponse = input("Veuillez saisir la couleur de votre {}ème boule :".format(a)).strip()
            return reponse
        
        def saisie_joueur() :
            joueur = []
            for i in range(4) :
                joueur.append(saisie_couleur(i+1))
            return joueur
        
        def verification_joueur_ordi ():
            erreur = 0
            for i in range (4) :
                if joueur[i] != ordi[i] :
                    erreur = erreur + 1
            return erreur
        
        def recherche_bien_place () :
            bien_place = []
            for i in range (4) :
                if joueur[i] == ordi[i] :
                    bien_place.append(joueur[i])
            return bien_place
        
        def recherche_mal_place () :
            mal_place = joueur[:]
            for i in range (4) :
                if joueur[i] == ordi[i] :
                    del mal_place[i]
            verif =[]
            for str in ordi :
                if str not in verif:
                    verif.append(str)
            for i in range(len(mal_place)) :
                if mal_place[i] in verif :
                    del mal_place[i]
            return mal_place
        
        #execution du programme au démarrage
        from random import *
        for i in range (4) :
            ordi.append(choice(couleur))
        print(ordi)
        
        chance = 12
        while chance > 0 :
            joueur = saisie_joueur()
            if verification_joueur_ordi () > 0 :
                chance = chance - 1 
                print("Vous avez {} erreur(s), il vous reste {} chances !".format(verification_joueur_ordi (),chance))
                print("Vous avez {} boules bien placées et votre boule {} est de bonne couleur mais mal placée.".format(len(recherche_bien_place ()),recherche_mal_place ()))
            else :
                print("Vous avez réussi !")
                break
        if chance < 0 :
            print("Vous avez perdu !")

        Mais je ne vois pas en quoi ma fonction ne marcherait pas sans faire appelle à ces listes puisque dans d'autre fonction (comme recherche_bien_place ou verification_joueur_ordi) où j'en ai besoin aussi, je n'en fait pas appelle non plus et pourtant ça marche.


        Et pour le del, le problème c'est que je ne sais pas comment faire pour ajouter au lieu de supprimer car cette méthode m'a été donner par mon professeur et je ne saisi pas comment on pourrais ajouter dans une fonction sensé réduire une liste petit à petit. Pourriez vous m'aider à comprendre ?

        • Partager sur Facebook
        • Partager sur Twitter
          23 février 2020 à 19:09:04

          YasphinX a écrit:

          Mais je ne vois pas en quoi ma fonction ne marcherait pas sans faire appelle à ces listes puisque dans d'autre fonction (comme recherche_bien_place ou verification_joueur_ordi) où j'en ai besoin aussi, je n'en fait pas appelle non plus et pourtant ça marche.


          Et pour le del, le problème c'est que je ne sais pas comment faire pour ajouter au lieu de supprimer car cette méthode m'a été donner par mon professeur et 


          Concernant une fonction, un principe de base est qu'on lui donne en paramètres ce dont elle a besoin. Dans ton cas ça devrait donner ceci :

          def recherche_bien_place (joueur, ordi) :
              bien_place = []
              for i in range (4) :
                  if joueur[i] == ordi[i] :
                      bien_place.append(joueur[i])
              return bien_place
           
          def recherche_mal_place (joueur, ordi) :
              mal_place = joueur[:]
              for i in range (4) :
                  if joueur[i] == ordi[i] :
                      del mal_place[i]
              verif =[]
              for str in ordi :
                  if str not in verif:
                      verif.append(str)
              for i in range(len(mal_place)) :
                  if mal_place[i] in verif :
                      del mal_place[i]
              return mal_place

           Au passage, ta 1re fonction devrait renvoyer la longueur de la liste et pas la liste.

          YasphinX a écrit:

          Et pour le del, le problème c'est que je ne sais pas comment faire pour ajouter au lieu de supprimer car cette méthode m'a été donner par mon professeur et je ne saisi pas comment on pourrais ajouter dans une fonction sensé réduire une liste petit à petit. Pourriez vous m'aider à comprendre ?



          Tu as tout a fait la possibilité d'"ajouter" des éléments (au lieu de retrancher avec del) en utilisant la méthode append.


          Maintenant concernant l'algorithme de recherche des mal placés, il n'est pas aussi simple que ça. En oubliant les erreurs de programmation, l'algo que tu proposes est faux.

          Par exemple, supposons que ordi soit BRRB et que joueur soit BBRR

            ordi: BRRB
          
          joueur: BBRR
          
          

          Alors ton algo va donner 

          mal_place : RB
          verif : BR
          mal_place=[]


          alors qu'il y a deux mal placés (deux blancs). C'est pour ça que je t'ai dit dans mon premier message d'être sûr d'avoir bien compris comment se fait le comptage des jetons blancs/noirs car en cas de doublons, il faut faire attention. 

          -
          Edité par PascalOrtiz 23 février 2020 à 19:12:22

          • Partager sur Facebook
          • Partager sur Twitter

          Appartenance d'un caractère d'une liste à une autr

          × 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