IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
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 :

amelioration code Swinnen 13.23 variante 1


Sujet :

Python

  1. #1
    Membre confirm�
    Homme Profil pro
    Technicien
    Inscrit en
    F�vrier 2010
    Messages
    59
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loz�re (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : Technicien

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 59
    Par d�faut amelioration code Swinnen 13.23 variante 1
    Bonjour,

    J'ai fait l'exo du Swinnen 13.23 v1 ( Chaque utilisation du bouton <A> fera appara�tre 3
    nouveaux d�s (de m�me taille, plut�t petits) dispos�s sur une colonne (verticale), les valeurs
    de ces d�s �tant tir�es au hasard entre 1 et 6. Chaque nouvelle colonne sera dispos�e � la droite
    de la pr�c�dente. Si l�un des tirages de 3 d�s correspond � 4, 2, 1 (dans n�importe quel ordre),
    un message � gagn� � sera affich� dans la fen�tre (ou dans le canevas). Le bouton <B>
    provoquera l�effacement complet (pas seulement les points !) de tous les d�s affich�s)

    Quelqu'un peut il corriger mon code pour le rendre plus efficace? Merci

    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
    #variante 1
    from tkinter import *
    from random import randrange
     
    class FaceDom(object):
        def __init__(self, can, val, pos, taille =70):
            self.can =can
            self.val = val
            # creation du carré
            x, y, c = pos[0], pos[1], taille/2
            self.carre = can.create_rectangle(x -c, y-c, x+c, y+c, fill ='ivory', width =2)
            d = taille/3
            # déclaration de la liste contenant une reference des cercles
            self.pList =[]
            # liste contenant les coordonnées des cercles
            pDispo = [((0,0),), ((-d,d),(d,-d)), ((-d,-d), (0,0), (d,d)),((-d,-d),(-d,d),(d,-d),(d,d)),
                      ((-d,-d),(-d,d),(d,-d),(d,d),(0,0)),((-d,-d),(-d,d),(d,-d),(d,d),(d,0),(-d,0))]
            disp = pDispo[self.val -1]
            # creation des cercles
            for p in disp:
                self.cercle(x +p[0], y +p[1], 5, 'red')
     
        def cercle(self, x, y, r, coul):
            # ajout des cercles
            self.pList.append(self.can.create_oval(x-r, y-r, x+r, y+r, fill=coul))
     
        def effacer(self):
            # efface les dès
            for p in self.pList:
                self.can.delete(p)
            self.can.delete(self.carre)
     
    class Projet(Frame):
        def __init__(self, larg, haut):
            Frame.__init__(self)
            self.larg, self.haut = larg, haut
            self.can = Canvas(self, bg='dark green', width =larg, height =haut)
            self.can.pack(padx =5, pady =5)
            self.des=[] #liste contenant les faces des dès
     
            # Creation des boutons
            bList = [("A", self.boutA), ("B", self.boutB),            
                ("Quitter", self.boutQuit)]
            for b in bList:
                Button(self, text =b[0], command =b[1]).pack(side =RIGHT,padx =15, pady =15)
     
     
            self.pack()
     
        def boutA(self):
            rg = len(self.des)/3 #defini le rang
            a,da=0,80       #defini le pas pour l'ordonnée
            valDes = ''
            for i in range(3):
                dx,dy = self.larg/10,self.haut/10
                x = dx + (rg * 80)
                y = dy +a
                self.des.append(FaceDom(self.can,randrange(1,7),(x,y),50))
                a = a + da
                valDes = str(self.des[int(3*rg+i)].val) + valDes # recupere la valeur des 3 dès
            if valDes in ('421','412','214','241','142','124'):
                self.can.create_text(self.larg/2,self.haut/2,text='Gagné',fill ='ivory',font=('Helvetica', 30))
     
     
     
     
        def boutB(self):
            #efface les dès
            for i in range(len(self.des)):
                self.des[i].effacer()
            self.des=[]
     
     
        def boutQuit(self):
            self.master.destroy()
     
    Projet(600, 600).mainloop()

  2. #2
    Membre exp�riment� Avatar de cervo
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2012
    Messages
    220
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : C�te d'Ivoire

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2012
    Messages : 220
    Par d�faut Optimisation Code

    je crois qu'il avait fourni des propositions de solutions toutes optimis�es... !

  3. #3
    Membre confirm�
    Homme Profil pro
    Technicien
    Inscrit en
    F�vrier 2010
    Messages
    59
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loz�re (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : Technicien

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 59
    Par d�faut
    Salut,

    Dans le Swinnen, les principaux exo sont corrig�s mais pas tous.
    J'ai fait la variante 2 (Le bouton <A> fera appara�tre 5 d�s dispos�s en
    quinconce (c�est-�-dire comme les points d�une face de valeur 5). Les valeurs de ces d�s seront
    tir�es au hasard entre 1 et 6, mais il ne pourra pas y avoir de doublons. Le bouton <B>
    provoquera l�effacement complet (pas seulement les points !) de tous les d�s affich�s.)

    Je suis int�ress� par un codage plus "�l�gant" que le mien. Merci

    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
    #variante 1
    from tkinter import *
    from random import randrange,sample
     
    class FaceDom(object):
        def __init__(self, can, val, pos, taille =70):
            self.can =can
            self.val = val
            # creation du carré
            x, y, c = pos[0], pos[1], taille/2
            self.carre = can.create_rectangle(x -c, y-c, x+c, y+c, fill ='ivory', width =2)
            d = taille/3
            # déclaration de la liste contenant une reference des cercles
            self.pList =[]
            # liste contenant les coordonnées des cercles
            pDispo = [((0,0),), ((-d,d),(d,-d)), ((-d,-d), (0,0), (d,d)),((-d,-d),(-d,d),(d,-d),(d,d)),
                      ((-d,-d),(-d,d),(d,-d),(d,d),(0,0)),((-d,-d),(-d,d),(d,-d),(d,d),(d,0),(-d,0))]
            disp = pDispo[self.val -1]
            # creation des cercles
            for p in disp:
                self.cercle(x +p[0], y +p[1], 5, 'red')
     
        def cercle(self, x, y, r, coul):
            # ajout des cercles
            self.pList.append(self.can.create_oval(x-r, y-r, x+r, y+r, fill=coul))
     
        def effacer(self):
            # efface les dès
            for p in self.pList:
                self.can.delete(p)
            self.can.delete(self.carre)
     
    class Projet(Frame):
        def __init__(self, larg, haut):
            Frame.__init__(self)
            self.larg, self.haut = larg, haut
            self.can = Canvas(self, bg='dark green', width =larg, height =haut)
            self.can.pack(padx =5, pady =5)
            self.des=[] #liste contenant les faces des dès
     
            # Creation des boutons
            bList = [("A", self.boutA), ("B", self.boutB),            
                ("Quitter", self.boutQuit)]
            for b in bList:
                Button(self, text =b[0], command =b[1]).pack(side =RIGHT,padx =15, pady =15)
     
     
            self.pack()
     
        def boutA(self):
            #creation de 5 dès        
            taille = 50
            d = 2* taille
            dDispo = [(-d,-d),(-d,d),(d,-d),(d,d),(0,0)]
            valDes =[1,2,3,4,5,6]
     
            for i in dDispo:
                x,y = self.larg/2,self.haut/2
                j = randrange(0,len(valDes)) # recupere une valeur d'index au hazard dans dDispo
     
                # pop() retourne la valeur à l'index j et retire l'element de la liste
                self.des.append(FaceDom(self.can,valDes.pop(j),(x+i[0],y+i[1]),taille))
     
     
     
     
        def boutB(self):
            #efface les dès
            for i in range(len(self.des)):
                self.des[i].effacer()
            self.des=[]
     
     
        def boutQuit(self):
            self.master.destroy()
     
    Projet(600, 600).mainloop()

  4. #4
    Expert �minent
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 776
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activit� : Architecte technique retrait�
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 776
    Par d�faut
    Salut,

    Je suis int�ress� par un codage plus "�l�gant" que le mien. Merci
    Il faut peut �tre revoir:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        def boutA(self):
            #creation de 5 dès        
            taille = 50
            d = 2* taille
            dDispo = [(-d,-d),(-d,d),(d,-d),(d,d),(0,0)]
            valDes =[1,2,3,4,5,6]
     
            for i in dDispo:
                x,y = self.larg/2,self.haut/2
                j = randrange(0,len(valDes)) # recupere une valeur d'index au hazard dans dDispo
     
                # pop() retourne la valeur à l'index j et retire l'element de la liste
                self.des.append(FaceDom(self.can,valDes.pop(j),(x+i[0],y+i[1]),taille))
    essentiellement � cause des "r�p�titions" et en utilisant des constructions plus adhoc utilisant random.shuffle et zip:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
        def boutA(self):
            x0, y0 = self._center 
            random.shuffle(self._dices)
            for i, (x,y) in zip( self._dices, self._positions):
                self._faces.append(FaceDom(self.can, i, (x0 + x, y0+y), self._taille))
    Ce qui suppose avoir ajout� dans __init__:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
            self._dices = list(range(1, 7))
            taille = self._taille = 50
            d = 2* taille
            self._positions = [(-d,-d),(-d,d),(d,-d),(d,d),(0,0)]
            self._center = larg//2, haut//2
            self._faces = []
    Ici aussi:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
        def boutB(self):
            #efface les dès
            for i in range(len(self.des)):
                self.des[i].effacer()
            self.des=[]
    vous pourriez �crire:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
        def boutB(self):
            #efface les dès
            for d in self.des:
                d.effacer()
            self.des=[]
    Pour le reste, c'est pas encore du Python mais c'est pas si mal.

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

Discussions similaires

  1. Ameliorer code : Boucle trop longue
    Par diego45 dans le forum MATLAB
    R�ponses: 3
    Dernier message: 05/12/2014, 10h55
  2. Amelioration code VBA
    Par yannoch123 dans le forum Macros et VBA Excel
    R�ponses: 3
    Dernier message: 14/03/2013, 10h05
  3. Ameliorer code VBA creation graphique
    Par Potzo dans le forum Macros et VBA Excel
    R�ponses: 5
    Dernier message: 01/07/2010, 09h12
  4. [VBA-E] Amelioration dun code
    Par Elstak dans le forum Macros et VBA Excel
    R�ponses: 28
    Dernier message: 06/06/2007, 13h51
  5. amelioration de code
    Par deubelte dans le forum C++
    R�ponses: 18
    Dernier message: 27/12/2006, 14h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo