Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme Tile mapping

Sujet résolu
    13 janvier 2013 à 13:40:58

    Drawer a écrit:

    [...] aprés pour les classes, faut expliquer son code devant un jury et j'ai peur qu'on ne maitrise pas tous celà.

    Sinon pour modifier l'image attribué à un objet du coup, comment on fait ?


    Comme cité ci-dessus:

    • Partager sur Facebook
    • Partager sur Twitter
      13 janvier 2013 à 13:45:52

      Oui mais là ca parle de classe, et on ne maitrise pas ça..
      • Partager sur Facebook
      • Partager sur Twitter
        13 janvier 2013 à 13:52:51

        Justement, il te reste quelques mois avant ton bac. Lis le tutoriel officiel, renseignes toi et apprends :) .

        Tu verras tout deveindra plus clair si tu lis le tutoriel. La solution viendra à toi sans réfléchir.

        Tu peux également aller consulter d'autres sites, mais il faut essayer d'élargir ses connaissances afin de résoudre ce genre de problème.

        • Partager sur Facebook
        • Partager sur Twitter
          13 janvier 2013 à 13:55:52

          Oui mais le problème c'est que j'ai pas quelque mois juste pour faire un petit jeu, il faut vite le boucler et passer à la présentation, le discours, les différents aspects du pourquoi etc.. au départ on devait avoir juste un petit programme mais on as voulu voir plus grand !

          • Partager sur Facebook
          • Partager sur Twitter
            13 janvier 2013 à 14:11:19

            Non les gens, arrêtez de le pousser de force vers la POO. Je pense qu'il a des objectifs à court terme beaucoup plus importants que d'apprendre un paradigme qui ne lui est pas indispensable pour son bac.

            @Drawer : Par contre, il faut que tu jettes un oeil au tuto officiel. S'il ne t'es pas utile de connaître tout de la POO pour le moment (programmer avec des classes, etc.), il te sera indispensable, pour avoir un bon niveau pour ton bac, de :

            • Programmer en utilisant des objets (deuxième partie du tutoriel),
            • Oublier, définitivement et une bonne fois pour toutes, le mot-clé global qui va surtout te faire faire des conneries à ton niveau,
            • Apprendre à bien factoriser ton code, et à exprimer les choses de façon plus concise, un peu comme ce que fred t'a montré ici, (ça vient avec l'habitude et la pratique).

            À propos des "variables globales", dont plusieurs personnes (dont moi) ont dit que c'était sale : attention à bien définir ce que l'on entend par "variable globale". Ceci, en Python, n'est PAS sale :

            x, y = 0, 0
            
            def move_up():
                x += 1
                return (x, y)
            
            def move_down():
                x -= 1
                return (x, y)
            
            # etc.
            

            Dans n'importe quel autre langage, genre C, ça correspondrait à des variables globales (et donc à prendre avec des pincettes), mais pas en Python, où il s'agit de variables de module, qui sont protégées puisqu'elles n'appartiennent pas au scope global mais à celui du module où elles sont définies. Coder de cette façon en Python est donc une alternative acceptable à la POO (en fait, ça correspond pratiquement à programmer un Singleton).

            Ce qui est dangereux et dégueulasse, ce serait ça :

            def move_up():
                global x, y = 0, 0
                x += 1
                return (x, y)
            
            def move_down():
                global x, y = 0, 0
                x -= 1
                return (x, y)
            
            # etc.
            

            Je te laisse lire la documentation et te renseigner pour comprendre la différence entre ce code (dont je dis, et je le répète, qu'il est DÉGUEU), et le précédent qui est tout à fait acceptable si tu ne sais pas encore créer des classes ou que tu n'en as pas vraiment besoin.

            Pour finir : le secret n'est pas de TOUT connaître pour ton bac, mais d'expliquer pourquoi tu n'as pas créé une classe pour faire telle ou telle chose (ce sur quoi un examinateur un peu vicelard peut essayer de te piéger). La phrase magique c'est : « Je n'avais besoin que d'une seule instance pour modéliser l'état de mon programme. Ici (si tu as codé en suivant le modèle du premier code que je viens de te montrer), mes variables sont bien encapsulées dans mon module, et n'ont aucun risque d'être modifiées accidentellement par un code extérieur au mien, donc je n'avais pas besoin d'en faire plus pour avoir un programme fonctionnel. Voyez ça comme un Singleton (cette phrase, c'est l'estocade, et au niveau bac il y a fort à parier qu'il te foutra la paix avec ça, sans chercher à te piéger plus loin sur les Design Patterns, surtout si tu lui expliques que tu n'as pas encore appris à "programmer des classes"). »

            Bien sûr, il ne faut pas sortir cette phrase à tort et à travers, et il va donc falloir que tu te renseignes pour comprendre ce qu'elle veut dire. Si tu acquiers assez de notions en Python pour comprendre cette phrase et la sortir à bon escient, alors tu n'auras aucun soucis à te faire pour ton bac, même sans savoir programmer des classes.

            • Partager sur Facebook
            • Partager sur Twitter
            Zeste de Savoir, le site qui en a dans le citron !
              13 janvier 2013 à 14:25:21

              Je comprend la différence entre les deux codes, mais le mien ressemble plus à cela:

              x, y =0, 0
              
              def move_up():
                  global x, y
                  x += 1
                  return (x, y)
              
              def move_down():
                  global x, y
                  x -= 1
                  return (x, y)
              
              # etc.

              J'ai quand meme définit les variable au début, et donc pour pouvoir les utilisé dans la fonction je met global non ?

              Si j'enleve le global, la fonction ne marche plus..

              • Partager sur Facebook
              • Partager sur Twitter
                13 janvier 2013 à 14:33:44

                Dégage tes lignes `global x, y`. Ne mets global nulle part, tu n'en as PAS BESOIN pour que ton code fonctionne.

                • Partager sur Facebook
                • Partager sur Twitter
                Zeste de Savoir, le site qui en a dans le citron !
                  13 janvier 2013 à 14:38:51

                  Si je les enleve tous, quand je déclenche la fonction jai ça:

                  Exception in Tkinter callback
                  Traceback (most recent call last):
                    File "C:\Python33\lib\tkinter\__init__.py", line 1442, in __call__
                      return self.func(*args)
                    File "C:\Users\thomas\Documents\Projet ISN\canvas.py", line 45, in droite
                      if x<626:
                  UnboundLocalError: local variable 'x' referenced before assignment



                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    13 janvier 2013 à 14:43:55

                    Drawer a écrit:

                    Si j'enleve le global, la fonction ne marche plus..

                    En effet il y aura quelques changements, j'ai essayé au départ de garder ton code tel quel, mais il y a vraiment de gros défauts de "conception" qui font que maintenant tu es coincé avec tes globals.

                    Il te manque aussi l'apprentissage en python qui est insuffisant, il va falloir apprendre un peu...

                    Ce que te donne comme solution nohar est la bonne.

                    La fonction retournera un tuple et tu pourras récupérer la valeur x et y tout simplement comme ceci

                    x, y = fonction(x, y)

                    Seulement connaissais-tu cette façon de faire? Je pense que non...

                     Voici un exemple

                    >>> def move_up(x, y):
                    ...     return (x+1, y)
                    ... 
                    >>> x, y = 0, 0
                    >>> 
                    >>> x, y = move_up(x, y)
                    >>> 
                    >>> print(x); print(y)
                    1
                    0
                    



                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 janvier 2013 à 14:56:33

                      Oui je conaissais, mais du coup comment je déclenche tout ça si on appuie sur une touche du clavier ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 janvier 2013 à 17:36:06

                        C'est bien notre éducation nationale ça, de vouloir enseigner un langage aussi puissant et beau que Python avec les pieds et en commençant par la fin... Je plussoie realmagma, tu gagnerais énormément à lire le tuto officiel sur Python (ne serait-ce qu'à appréhender la philosophie intéressante du langage et à lire un tutoriel bien écrit et clair) ; il est illusoire de vouloir faire quelque chose d'un peu "complexe" et surtout de la prog' graphique en Python, avec une bibliothèque aussi bas niveau que TkInter, sans avoir des notions de POO (c'est quand même LE truc en Python).

                        Le tuto se lit assez vite, se comprend très bien et même s'il ne contient pas grand-chose sur TkInter (pour la bonne et simple raison que son rédacteur, malvoyant, est peu porté sur la programmation graphique), avec de bonnes bases tu pourras très certainement arriver à tes fins, quitte à fouiller un peu dans la doc de la bibliothèque (qui contient tout ce dont on peut avoir besoin) ! Surtout ne te décourage pas, l'échéance du bac est largement assez lointaine pour que tu y arrives.

                        :)

                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 janvier 2013 à 18:00:30

                          Lindorm a écrit:

                          il est illusoire de vouloir faire quelque chose d'un peu "complexe" et surtout de la prog' graphique en Python, avec une bibliothèque aussi bas niveau que TkInter, sans avoir des notions de POO (c'est quand même LE truc en Python).

                          Je ne suis pas d'accord avec tes arguments. LE truc en Python, c'est son data model, basé sur une définition très simple de la notion d'objet qui résume celle-ci au strict essentiel.

                          Mais la notion d'objet n'EST PAS la POO. Et croire que l'on ne peut pas se passer de ce paradigme pour concevoir un programme au niveau du PO, même en utilisant des modules orientés objet comme tkinter, c'est confondre conception et data model. Il est bien plus important de comprendre la factorisation, la portée lexicale des variables, les fermetures et les divers mécanismes internes du langage, que de savoir écrire une classe : on peut créer des programmes extrêmement bien conçus et parfaitement maintetables sans la moindre classe, tout comme on peut faire de réelles horreurs (du spaghetti with meatballs) en collant des classes partout et en croyant que c'est ca qui fait que notre programme est orienté objet et tire parti des bénéfices de ce paradigme.

                          Faire vraiment de la POO, même en Python, cela demande plus que quelques mois de pratique, et c'est rarement indispensable.

                          Le tuto se lit assez vite, se comprend très bien et même s'il ne contient pas grand-chose sur TkInter (pour la bonne et simple raison que son rédacteur, malvoyant, est peu porté sur la programmation graphique), avec de bonnes bases tu pourras très certainement arriver à tes fins, quitte à fouiller un peu dans la doc de la bibliothèque (qui contient tout ce dont on peut avoir besoin) ! Surtout ne te décourage pas, l'échéance du bac est largement assez lointaine pour que tu y arrives

                          Y arriver oui, mais réussir à bouffer toutes ces notions et BIEN programmer, je ne crois pas. Mettre les pieds dans la programmation orientée objet, c'est se lancer dans un apprentissage de plusieurs années, et très sincèrement je pense qu' il serait plus judicieux pour lui qu'il remette ça (la partie "apprendre a creer des classes") après le bac.

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Zeste de Savoir, le site qui en a dans le citron !
                            13 janvier 2013 à 18:28:20

                            Bon, merci à vous de vos opinion bien oposé, mais du coup je prend quel chemin moi ? :)

                            Merci d'avance!

                            • Partager sur Facebook
                            • Partager sur Twitter
                              13 janvier 2013 à 18:35:14

                              Lis déjà les deux premières parties du tutoriel, et pratique en créant plusieurs programmes, pour bien comprendre le langage et comment faire un code lisible et facile à maintenir. Quand les sujets de l'ancien forum seront rétablis ici, tu pourras aussi piocher dans les nombreux exercices que l'on avait concoctés sur le forum pour t'entraîner et travailler ta maîtrise du langage.

                              Et oublie global. Sérieux.

                              Ah, et si tu veux de l'aide sur ton programme en particulier : poste ici ton code tel qu'il est actuellement, ainsi que les images qu'il utilise. Sans ça, on ne peut pas lancer ton programme ni essayer de travailler sur ton code-source pour te montrer comment l'améliorer.

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Zeste de Savoir, le site qui en a dans le citron !
                                13 janvier 2013 à 18:38:35

                                Celui qui te semble le plus abordable et en corélation avec le temps qu'il te reste pour la réalisation de ton projet.

                                Nous sommes tous d'accord avec le fait qu'il faut que tu relises les chapitres I et II du tutoriel officiel.

                                Après rien en t'empêche d'essayer d'apprendre les classes, si ça te plait, pourquoi pas.

                                EDIT: Je plussoie Nohar pour que tu enlèves les global

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  13 janvier 2013 à 18:44:51

                                  Suis les conseils qui TE paressent les plus réalistes, utiles (ou autre) pour ton projet !

                                  Et si tu veux mon avis au passage : nohar a raison... La POO peut attendre mais les deux premières parties du tuto sur le sdz te seront vraiment utile, voir indispensable !

                                  EDIT: Dommage que le site ne nous prévienne plus quand un message a été posté entre temps...

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    13 janvier 2013 à 18:45:42

                                    realmagma a écrit:

                                    Après rien en t'empêche d'essayer d'apprendre les classes, si ça te plait, pourquoi pas.

                                    D'expérience, quand un débutant commence à programmer avec des classes, il en fout partout et code n'importe comment pendant des mois, parfois des années, avant de comprendre leur réel intérêt et comment les utiliser à bon escient. Donc oui, pourquoi pas... plus tard.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Zeste de Savoir, le site qui en a dans le citron !
                                      13 janvier 2013 à 18:53:50

                                      Je veux bien les enlever, mais sans ces globales, ça ne marche vraiment pas !

                                      Je vais donc lire ces 2 fameux chapitres, et je reviendrais si j'ai un problème, 

                                      Pour ceux que sa intérèsse: le code actuel avec les images:

                                      http://www.mediafire.com/?l00evk5p0l8z474

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        13 janvier 2013 à 22:05:47

                                        Voilà une version qui fonctionne en se passant de global.

                                        from tkinter import *
                                        
                                        carte = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                                                  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
                                                  1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1,
                                                  1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1,
                                                  1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1,
                                                  1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1,
                                                  1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1,
                                                  1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1,
                                                  1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
                                                  1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,
                                                  1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,
                                                  1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1,
                                                  1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1,
                                                  1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1,
                                                  1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1,
                                                  1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1,
                                                  1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1,
                                                  1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1,
                                                  1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
                                                  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
                                        
                                        
                                        def to_win(coord):
                                            """ Conversion coordonnées modèle -> fenêtre """
                                            return 18 + coord * 32
                                        
                                        def to_map(coord):
                                            """ Conversion coordonnées fenêtre -> modèle """
                                            return (coord - 18) // 32
                                        
                                        def to_index(x, y):
                                            """ Conversion coordonnées fenêtre -> indice """
                                            return int(to_map(y) * 20 + to_map(x))
                                        
                                        def draw_map():
                                            case = 0
                                            for y in range(18, 640, 32):
                                                for x in range(18, 640, 32):
                                                    can.create_image(x, y, image=texture[carte[case]])
                                                    case += 1
                                              
                                        def droite(event):
                                            x, y = can.coords(item)
                                            if x < to_win(19) and carte[to_index(x+32, y)] == 0:
                                                    can.coords(item, x+32, y)
                                        
                                        def gauche(event):
                                            x, y = can.coords(item)
                                            if x >= to_win(1) and carte[to_index(x-32, y)] == 0:
                                                    can.coords(item, x-32, y)
                                        
                                        def haut(event):
                                            x, y = can.coords(item)
                                            if y >= to_win(1) and carte[to_index(x, y-32)] == 0:
                                                    can.coords(item, x, y-32)
                                          
                                        def bas(event):
                                            x, y = can.coords(item)
                                            if y < to_win(19) and carte[to_index(x, y+32)] == 0:
                                                    can.coords(item, x, y+32)
                                          
                                          
                                        game = Tk()
                                        character = PhotoImage(file='a_bas.gif')
                                        texture = [PhotoImage(file='c.gif'),   # 0 = sol
                                                   PhotoImage(file='b.gif')]   # 1 = mur
                                        
                                        can = Canvas(game, width =640, height =640, bg ='pink')
                                        draw_map()
                                        item = can.create_image(18 + 32, 18 + 32, image=character)
                                        can.pack()
                                        
                                        game.bind('<Right>', droite)
                                        game.bind('<Left>', gauche)
                                        game.bind('<Up>', haut)
                                        game.bind('<Down>', bas)
                                        game.mainloop()
                                        
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Zeste de Savoir, le site qui en a dans le citron !
                                          7 février 2013 à 8:49:59

                                          Merci pour cette version ! :)

                                          Mais du coup je galere toujours autant popur changer l'image du personnage, d'abord je change le lien de l'image, mais aprés comment je raffraichis sont affichage?

                                          Merci d'avance.

                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Probleme Tile mapping

                                          × 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