Partage
  • Partager sur Facebook
  • Partager sur Twitter

TP Roboc

création labytinthe à partir d'une chaîne

    29 juillet 2019 à 12:07:46

    Bonjour, 

    J'essaie de comprendre comment fonctionne la fonction fournie dans le corrigé, qui doit créer un labyrinthe à partir d'une chaîne.

    Je ne suis même pas capable de faire fonctionner le corrigé :D

    Bref, le code : 

    def creer_labyrinthe_depuis_chaine(chaine):
        """Crée un labyrinthe depuis une chaîne.
    
        Les symboles sont définis par correspondance ici.
    
        """
        symboles = {
            "o": Mur,
            "x": Robot,
            ".": Porte,
            "u": Sortie,
        }
    
        x = 0
        y = 0
        robot = None
        obstacles = []
        for lettre in chaine:
            if lettre == "\n":
                x = 0
                y += 1
                continue
            elif lettre == " ":
                pass
            elif lettre.lower() in symboles:
                classe = symboles[lettre.lower()]
                objet = classe(x, y)
                if type(objet) is Robot:
                    if robot:
                        raise ValueError("il ne peut y avoir qu'un robot")
    
                    robot = objet
                else:
                    obstacles.append(objet)
            else:
                raise ValueError("symbole inconnu {}".format(lettre))
    
            x += 1
    
        labyrinthe = Labyrinthe(robot, obstacles)
        return labyrinthe
    

    j'ai essayé de le tester comme ça : 

    if __name__ == "__main__" :
        ch = """OOOOO.  .  OOO\n
    O...   O\n
    O      O\n
    OOOOOOOO"""
        creer_labyrinthe_depuis_chaine(ch)
        charger_labyrinthe()

    mais ça marche pas.

    Il doit bien y avoir un moyen de le faire fonctionner indépendamment du programme, puisque c'est une fonctionne qui est indépendante des autres classes.

    Quelqu'un pour m'aider svp ?


    • Partager sur Facebook
    • Partager sur Twitter
      29 juillet 2019 à 14:34:18

      Actuellement :

      symboles = {
              "o": Mur,
              "x": Robot,
              ".": Porte,
              "u": Sortie,
          }

      Mur/Robot/etc... sont appelés comme des variables non-définies. Donc ça ne peut pas marcher. Elles doivent être déclarées plus haut dans ton programme. Sinon il faut modifier le code que tu nous présente pour qu'il soit fonctionnel de façon indépendante.

      • Partager sur Facebook
      • Partager sur Twitter

      Try->Fail->Learn->Converge to success :{\displaystyle Q[s,a]:=(1-\alpha )Q[s,a]+\alpha (r+\gamma ~max_{a'}Q[s',a'])}

        29 juillet 2019 à 14:47:52

        oulà, j'ai rien compris. C'est décourageant parfois :(

        Dans les choses à faire pour ce TP, il fallait, je cite : "permettre la création d'un labyrinthe depuis une chaîne de caractères"

        Je n'ai pas compris à l'époque ce que ça voulait dire, et je ne comprends malheureusement toujours pas, même avec le corrigé entre les mains.

        Pour moi, pour que l'utilisateur puisse créer un labyrinthe, il lui suffit d'ouvrir un éditeur de texte, faire son labyrinthe avec ses "O", ses "." et ses espaces, l'enregistrer dans l'onglet 'cartes', et c'est terminé.

        Chez moi, c'est suffisant pour avoir une nouvelle carte, qui peut être utilisée par le programme.

        Donc je ne comprends pas à quoi peut ressembler une fonction qui créée un labyrinthe à partir d'une chaîne, ni à quoi elle peut bien servir. Et, encore une fois, même avec le corrigé je ne comprends toujours pas. 

        :(

        • Partager sur Facebook
        • Partager sur Twitter
          29 juillet 2019 à 15:03:51

          Je pense que t'as compris l'essentiel. Ce que tu n'as peut-être pas compris c'est la différence entre la chaîne et le retour de ta fonction.

           Pour faire simple, il y a une différence entre :

          "Mur"

          Et

          class Mur:
            def __init__(self):
              self.taille = 0

          L'un est une simple "chaîne de caractères", l'autre est une classe.

          avec ta classe, tu vas pouvoir appeler des fonctions (exemple: Robot.avance()).

          Le "but" de ta fonction creer_labyrinthe_depuis_chaine(chaine)

          C'est juste de "traduire" une chaîne (ex : "ooxo") en "objet" de classe. Dans ton cas Mur-Mur-Robot-Mur

          En faisant le lien entre le caractère 'o' et ta classe Mur.

          Il faut juste faire attention au TYPE des variables. Ici ta fonction doit juste traduire des caractères en objet.

          Compris :) ?

          Si t'as besoin d'explication plus détaillés n'hésite pas. Il est important de bien comprendre.

          -
          Edité par WorstDevEver 29 juillet 2019 à 15:15:47

          • Partager sur Facebook
          • Partager sur Twitter

          Try->Fail->Learn->Converge to success :{\displaystyle Q[s,a]:=(1-\alpha )Q[s,a]+\alpha (r+\gamma ~max_{a'}Q[s',a'])}

            29 juillet 2019 à 15:16:05

            Je ne sais pas.

            Peut-être.

            Donc, pour "créer un labyrinthe depuis une chaîne", il faudrait : saisir une chaîne, puis utiliser la def qui transforme la chaîne en un objet labyrinthe, mais uniquement pour l'utiliser dans le reste du programme ?

            Pour ça que le programme du corrigé utilise Pickle ?

            Je pense que le problème, c'est que je n'ai pas compris le corrigé du tout. Je n'ai pas compris comment il fonctionnait ce labyrinthe, et je n'ai pas vraiment cherché puisque le mien fonctionne. (et ça semble bien plus simple d'y ajouter de nouveaux labyrinthes)

            Je crois que je vais laisser tomber. 

            Pour la suite du TP, je vais faire ce que je sais, c'est à dire pas grand chose. Je serai au bout du cours Python OC, dommage d'en savoir aussi peu après avoir passé autant de temps sur ce cours (les 40h prévues, je pense que c'est une blague, pas très marrante d'ailleurs)

            -
            Edité par Thia 29 juillet 2019 à 15:16:41

            • Partager sur Facebook
            • Partager sur Twitter
              29 juillet 2019 à 15:23:18

              Ne sois pas défaitiste :)

              Je n'ai jamais suivis de cours python sur OC donc je en sais pas ce qu'il vaut niveau pédagogie, mais je suis là pour t'aider à comprendre les bases.

              Je vais te faire une description ligne par ligne du corrigé. Mais il faut juste que tu persévères un peu!

              Je réédite mon message avec le corrigé commenté dans quelques minutes.

              ----

              # La fonction prend en paramètre une chaine de caractère, et renvoi un OBJET de TYPE : Labyrinthe
              def creer_labyrinthe_depuis_chaine(chaine):
                  """Crée un labyrinthe depuis une chaîne.
               
                  Les symboles sont définis par correspondance ici.
               
                  """
                  
                  # Ceci est un dictionnaire, il sert à faire le lien entre un caratère 'o' et une CLASSE Mur
                  symboles = {
                      "o": Mur,
                      "x": Robot,
                      ".": Porte,
                      "u": Sortie,
                  }
                  
                  # On parcour la boucle pour créer le labyrinthe (x = longueur * y = hauteur)
                  # Un index pour la colonne (largeur)
                  x = 0
                  # Un index pour la ligne (hauteur)
                  y = 0
                  # Ton OBJET robot
                  robot = None
                  # Une liste d'OBJETS constitué d'obstacle
                  obstacles = []
                  # Pour chaque lettre dans ta chaine
                  for lettre in chaine:
                      # si la lettre est "\n" => Ca signifie une nouvelle ligne
                      if lettre == "\n":
                          # On remet donc l'index de la colone à 0
                          x = 0
                          # On incrémente l'index de la ligne
                          y += 1
                          # On n'effectue pas les opération du bas de la boucle
                          continue
                          # Dans ce cas, on fait rien
                      elif lettre == " ":
                          pass
                          # Dans ce cas :
                      elif lettre.lower() in symboles:
                          # On récupère le TYPE de CLASSE définit dans le DICTIONNAIRE définit plus haut, exemple symboles['o'] => Mur
                          classe = symboles[lettre.lower()]
                          # On créer notre OBJET grâce au type récupéré juste au dessus, exemple objet = Mur(2,2) 
                          objet = classe(x, y)
                          # Si le TYPE de l'objet est un robot
                          if type(objet) is Robot:
                              # Si il en existe déjà un on lève une erreur
                              if robot:
                                  raise ValueError("il ne peut y avoir qu'un robot")
                              # Sinon on définit notre robot
                              robot = objet
                              # Sinon, pour n'importe quel autre TYPE d'objet
                          else:
                              # On ajoute l'objet en cours en tant "qu'obstacle" à la liste des obstacles
                              obstacles.append(objet)
                      else:
                          raise ValueError("symbole inconnu {}".format(lettre))
                      #On incrémente l'index de la colonne
                      x += 1
                  # On créer l'OBJET de TYPE Labyrinthe avec les PARAMETRES :  OBJET de TYPE Robot, Listes d'OBJET (étant des d'obstacles)
                  labyrinthe = Labyrinthe(robot, obstacles)
                  # On retourne l'OBJET Labyrinthe
                  return labyrinthe

              En espérant que ça t'aide !

              A quoi ça va servir ? 

              Ca va surement permettre de faire "tonLabyrinthe.robot.position", ce qui te renverra la position du robot dans le labyrinthe (x,y) => "Le robot est à la case 3,6", et bien d'autre chose.

              -
              Edité par WorstDevEver 29 juillet 2019 à 15:45:24

              • Partager sur Facebook
              • Partager sur Twitter

              Try->Fail->Learn->Converge to success :{\displaystyle Q[s,a]:=(1-\alpha )Q[s,a]+\alpha (r+\gamma ~max_{a'}Q[s',a'])}

                30 juillet 2019 à 8:37:31

                OK merci d'avoir pris tout ce temps pour m'aider. Je comprends à peu près comment il est fait.

                Ce qui me gène, c'est que cette fonction n'est pas utilisée.

                Dans le programme, on devait pouvoir, en effet, créer un labyrinthe depuis une chaîne.

                Donc la fonction est là, sauf qu'on ne peut pas l'utiliser telle quelle. OK. Mais elle n'est pas non plus utilisée dans le programme. Je viens de faire une recherche, je ne la vois pas.

                Donc c'est un oubli ? Il a fait une fonction et a oublié de l'intégrer dans le programme ? 

                Quoi qu'il en soit, on nous demande de documenter notre code pour indiquer comment il doit être utiliser. Autant dire que si je devais noter celui qui a pondu ce corrigé.....

                Edit : je suis désolée. Je ne cherche pas la petite bête, simplement pour bien comprendre comment est fait un programme, j'ai BESOIN de l'utiliser, pour voir ce qu'il fait. Or là je n'y arrive pas. Je ne trouve pas de moyens de l'utiliser. Donc je ne l'ai pas vu fonctionner.....du coup c'est très abstrait tout ça:(

                -
                Edité par Thia 30 juillet 2019 à 8:38:57

                • Partager sur Facebook
                • Partager sur Twitter
                  30 juillet 2019 à 9:16:50

                  Comme je t'ai dis, je ne connais pas du tout le projet, c'est bien possible qu'il ne soit pas utilisé et ce serait bien dommage. Surtout que c'est pas vraiment pour "débutant" de faire des choses tel que stocker des classes dans un dictionnaire pour mapper des objets dynamiquement.

                  Du coup c'est pas très grave pour ton apprentissage si tu n'utilise pas ce code (si ça te bloque pas pour la suite des exo). 

                  Essais juste de comprendre son fonctionnement ligne par ligne et pose des questions si t'en as.

                  Mais c'est sur que pour un corrigé c'est pas bien documenté ;)

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Try->Fail->Learn->Converge to success :{\displaystyle Q[s,a]:=(1-\alpha )Q[s,a]+\alpha (r+\gamma ~max_{a'}Q[s',a'])}

                    30 juillet 2019 à 12:52:13

                    Disons qu'il y a 2 TP Roboc, le 2ème consistant à améliorer le 1er.

                    Cette fonction je ne l'ai pas faite, en effet, dans ma 1ère version, je ne voyais pas l'intérêt.

                    Sauf que là, pour l'amélioration, des tests unitaires sont exigés, et l'un d'entre eux doit vérifier justement la création d'un labyrinthe à partir d'une chaine de caractère.

                    Donc je voulais la faire, cette possibilité, pour pouvoir faire le test unitaire qui va avec.

                    Mais je ne vais pas reprendre le corrigé, puisqu'il n'est pas adapté à la façon dont j'ai conçu mon programme.

                    Pour ça que j'essayais un peu désespérément de le comprendre.

                    Si je comprenais comment il fonctionne, concrètement comment on l'utilise, je pourrai proposer quelque chose de similaire.

                    Tant pis.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    TP Roboc

                    × 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