I.a. (débutant)

Description

Bonjour,
voici un mini programme que j'ai écrit y'a plus d'un an. Comme je me remets à Python, j'aimerai beaucoup avoir des feedbacks quant aux améliorations (quelles qu'elles soient) possible, notamment pour éviter de consommer trop de ressources.

Sommairement :
le programme permet d'afficher 4 "morp" qui se balladent aléatoirement. Ils s'arrêtent pour dormir et se déplacent vers un endroit cible quand ils "ont faim".

Voili voilou, merci à ceux qui prendront le temps d'y jeter un coup d'oeil.

Source / Exemple :


## -*- coding: cp1252 -*-
from tkinter import *
import random
from time import time
t = time()

global COLOR, MOOD, WayFeel, NBR
global DIC, Stat, POS

MOOD  = ["H","M","N"] # Heureux, Malheureux, Neutre
WayFeel = ["S","M","G"] # Suspicieux, Méchant, Gentil
COLOR = ["red","yellow","blue","black"]
NBR = 0
DIC = [175, 175, 210, 175, 245, 175, 280, ##################
       175, 315, 175, 350, 175, 385, 175, #                #
       420, 175, 455, 175, 490, 175, 490, # Données        #
       490, 455, 490, 420, 490, 385, 490, # servant        #
       350, 490, 315, 490, 280, 490, 245, # à créer        #
       490, 210, 490, 175, 490, 105, 175, # le quadrillage #
       105, 210, 105, 245, 105, 280, 105, # bleu,          #
       315, 105, 350, 105, 385, 105, 420, # qui ne         #
       105, 455, 105, 490, 560, 175, 560, # sert qu'à      #
       210, 560, 245, 560, 280, 560, 315, # décorer.       #
       560, 350, 560, 385, 560, 420, 560, ##################
       455, 560, 490]

Stat = [[] for i in range(4)]
POS = [[] for i in range(4)]
PosAfter = [[175, 140],[490, 140],[175, 525],[490, 525]]

class Plateau (Tk):
    def __init__(self):
        Tk.__init__(self)
        self.initialize()
        
    def initialize(self):
        self.DIC = DIC
        self.grid()
        self.nbr = NBR
        self.surface = Canvas(self,
                               width =700,
                               height =700,
                               bg ='ivory',
                               bd =3,
                               relief =SUNKEN)
        self.surface.grid(padx =8,
                          pady =8,
                          column=0,
                          row=1,)

        Button(self, text="Quitter", command=quit).grid(column=1, row=0)
        Button(self, text="Lancer", command=self.Launch).grid(column=0, row=0)
        self.Fond ()
        case = self.surface.create_rectangle(0, 0, 35, 35, outline="Brown", fill = "Brown")
        self.Test ()
        

    def Test (self):
        """pour tester ..."""
        print (COLOR, MOOD, WayFeel, NBR, Stat,sep="\n")

    def Fond (self):
        """Quadrillage: aide pour bien visualiser au départ."""
        
        row = 0
        col = 0
        for x in range (20):
            row = x*35
            for y in range(20):
                col = y*35
                case = self.surface.create_rectangle(col, row, col + 39, row+ 39, outline="Blue", fill = "cyan")
        
        i = 0
        while len(DIC) != i:
            case = self.surface.create_rectangle(DIC[i+1], DIC[i], DIC[i+1]+ 35, DIC[i]+ 35, outline="white", fill = "Blue")
            i = i+2
        
        self.surface.create_text(688,10, font='Arial 10 bold', text="Faim", fill = "Brown")
        self.surface.create_text(680,20, font='Arial 10 bold', text="Fatigue", fill = "White")    

        a=0
        for i in PosAfter :
            case = self.surface.create_rectangle(i[0], i[1],i[0]+35, i[1]+35, outline="black", fill = COLOR[a])
            a+=1
        
        return True
    
    def Launch (self):
        
        if self.nbr <= 3 :
            ColorT = COLOR[self.nbr]
            IdT = self.nbr
            MoodT = MOOD[random.randint(0,2)]
            WayFeelT = WayFeel[random.randint(0,2)]
            Stat[self.nbr] = [IdT, ColorT, MoodT, WayFeelT, 0, 0]
            MorpIon = Morp (self,self.surface,ColorT, IdT, MoodT, WayFeelT)
##            Str_text = StringVar()
##            labFile = Label(self,anchor="w",
##                            textvariable=Str_text,
##                            width=15,
##                            fg="white",
##                            bg="blue").grid(column=0,
##                                            row=self.nbr+3,
##                                            padx =8,
##                                            sticky='EW')
##            Str_text.set(u"Morp (n°"+str(self.nbr+1)+") : Couleur = "+ColorT+", Mood = "+MoodT+", Feel = "+WayFeelT)
            self.nbr = NBR = self.nbr+1
        else : print (Stat)

class Morp :
    def __init__ (self,tk,can,Color, Id, Mood, WayFeel):
        self.a = 0         # 0
        self.b = -2        # -2
        self.c = 0
        self.can = can
        self.tk = tk
        self.Color = Color
        self.Id = Id
        self.Mood = Mood
        self.Food = 100     # 100
        self.Dodo = 100    # 100
        self.Fatigue = self.Dodo
        self.Hungry = self.Food
        self.WayFeel = WayFeel
        self.Bool = True   # True
        self.Rencontre = False # False
        
        ## coordonnées initiales
        self.x1, self.y1 = PosAfter[self.Id][0], PosAfter[self.Id][1]
        ## coordonnées initiales : PosAfter [self.Id] # Avant : 350,350 (milieu du Canvas)
        
        POS[self.Id] = [self.x1, self.y1]
        #print "Morp : ",self.Color, self.Id, self.Mood, self.WayFeel
        self.Initialize ()

    def Initialize (self):
        
        self.rond = self.can.create_oval(self.x1,self.y1,self.x1+30,self.y1+30, outline="Blue", fill=self.Color)
        
        self.OeuilG = self.can.create_oval(self.x1+5,self.y1+8,self.x1+10,self.y1+13, outline="Black", fill="White")
        self.OeulD = self.can.create_oval(self.x1+20,self.y1+8,self.x1+25,self.y1+13, outline="Black", fill="White")
        
        self.Dors = self.can.create_rectangle(self.x1,self.y1+30,self.x1+self.Fatigue,self.y1+35, outline="Yellow", fill = "White")
        self.Faim = self.can.create_rectangle(self.x1,self.y1+25,self.x1+self.Hungry,self.y1+30, outline="Yellow", fill = "Brown")

        self.Str_text = StringVar()

        Label(self.tk,anchor="w",
                        textvariable=self.Str_text,
                        width=15,
                        fg="white",
                        bg="blue").grid(column=0,
                                        row=self.Id+3,
                                        sticky='EW')
        self.Str_text.set(("Morp n°"+str(self.Id+1)+", "+self.Color+" : pos (x = "+str(self.x1)+", y = "+str(self.y1)+"), faim ("+str(self.Food)+"), fatigue ("+str(self.Dodo)+")"))
        Button(self.tk, text="Stop", command=self.Stop).grid(column=1, row=self.Id+3)
        
        self.Mouvement ()

    def Stop (self):
        if self.Bool == True:
            app.after_cancel(self.Mouve)
            self.Str_text.set(("Morp n°"+str(self.Id+1)+" ("+self.Color+") en pause."))
            self.Bool = False
        else :
            self.Bool = True
            self.Mouvement ()

    def Mouvement (self):
        a = 0

        "Vérification : rencontre et faim"
        self.Encounter ()
        self.SelfEat ()

        "Exception :"
        if self.Rencontre == True:
            self.Bool = False
            self.x1, self.y1 = PosAfter[self.Id][0], PosAfter[self.Id][1]
            self.ShowMood ()
            app.after_cancel(self.Mouve)
            self.Moodet()
        
        "déplacement du Morp"
        if self.b == -2 :
            self.b = random.randint(0,40)
            self.a = random.randint(0,3)
        if self.b == -1 :  
            self.a = random.randint(0,3)
            self.b = random.randint(0,40)

        "Faim :"
        self.Hungry -= 0.1
        if self.Hungry <=  0:
            app.after_cancel(self.Mouve)
            self.Manger ()

        "Fatigue :"
        self.Fatigue -= 0.025
        if self.Fatigue <= 0 :
            app.after_cancel(self.Mouve)
            self.ZZzz = self.can.create_text(self.x1+20,self.y1, font='Arial 10 bold', text="ZZzz", fill = "Brown")
            self.Repos ()
            a = 1  

        "Mouvements :"
        if self.a == 0:
            self.Haut ()
        if self.a == 1:
            self.Bas ()
        if self.a == 2:
            self.Avant ()
        if self.a == 3:
            self.Arriere ()

        "Blocage et redirection :"
        self.b -= 1
        if a == 1 :
            app.after_cancel(self.Mouve)
        if self.Hungry >= 0 and a == 0 and self.Bool == True:
            self.Str_text.set(("Morp n°"+str(self.Id+1)+", "+self.Color+" : pos (x = "+str(self.x1)+", y = "+str(self.y1)+"), faim ("+str(round(self.Hungry,1))+"), fatigue ("+str(round(self.Fatigue,1))+")"))
            self.Mouve = app.after(10,self.Mouvement)
            
    def Repos (self):
        self.Fatigue += 2.5
        self.can.coords(self.Dors, self.x1,self.y1+20,self.x1+self.Fatigue,self.y1+25)

        self.Str_text.set(("Morp (n°"+str(self.Id+1)+", "+self.Color+") : pos (x = "+str(self.x1)+", y = "+str(self.y1)+"), faim ("+str(round(self.Hungry,1))+"), fatigue ("+str(round(self.Fatigue,1))+")"))

        if self.Fatigue >= self.Dodo :
            self.can.delete(self.ZZzz)
            app.after_cancel(self.Sieste)
            self.Mouvement ()
        else :
            self.Sieste = app.after(500, self.Repos)
    
    def Manger (self):
        self.Fatigue -= 0.025
        if self.x1 > 5 and self.y1 >5  :
            self.Trans ()
        elif self.x1 <= 5 :
            self.Haut ()
        elif self.y1 <=5  :
            self.Arriere ()
        
        if self.x1 <=5 and self.y1 <=5 :
            self.Hungry = self.Food
            app.after_cancel(self.Mange)
            self.Mouvement ()
        else : self.Mange = app.after(10, self.Manger)
        
    def Haut (self):
        if self.y1 >5:
            self.y1= self.y1-5
            self.Changes ()

    def Arriere (self):
        if self.x1 >5:
            self.x1 = self.x1-5
            self.Changes ()

    def Bas (self):
        if self.x1 <670:
            self.x1 = self.x1+5
            self.Changes ()

    def Avant (self):
        if self.y1 <670:
            self.y1 = self.y1+5
            self.Changes ()

    def Trans(self):
        if self.y1 >5 and self.x1 >5:
            self.y1= self.y1-5
            self.x1 = self.x1-5
            self.Changes ()

    def SelfEat (self):
        if self.x1 <=5 and self.y1 <=5 :
            self.Hungry = self.Food

    def Changes (self):
        ##  Exemple : pos = x :5 ; y :  165
        ## 
        ## 5        x   165+e
        ## 5+faim   x   165+e+5
        ##      
        ## 
        ## 
        
        POS[self.Id] = [self.x1, self.y1]
        self.can.coords(self.Dors, self.x1,self.y1+30,self.x1+self.Fatigue,self.y1+35)
        self.can.coords(self.Faim, self.x1,self.y1+25,self.x1+self.Hungry,self.y1+30)
        
        self.can.coords(self.OeuilG, self.x1+5,self.y1+8,self.x1+10,self.y1+13)
        self.can.coords(self.OeulD, self.x1+20,self.y1+8,self.x1+25,self.y1+13)
        self.can.coords(self.rond,self.x1,self.y1,self.x1+30,self.y1+30)
            

    def Encounter (self):
        ## chaque rond est dans un carré de 30x30,
        ## exemple : 350x350 -> carré comme cela
        ## 320x350     380x380
        ## 
        ## 350x350     350x380
        ##
        ## 5x165 --> 5 <= Autre <= 35 x 165 <= Autre <= 165
        ## DONC  -->     [5,35[       x      [165,165[
        ##

        for i in range(4) :
            if i == self.Id : continue
            try :
                if POS[self.Id][0] <= POS[i][0] and POS[self.Id][0]+30 >= POS[i][0] :
                    if POS[self.Id][1] <= POS[i][1] and POS[self.Id][1]+30 >= POS[i][1] :
                        self.Rencontre = True
                        #print self.Id,"et",i
                        #print POS[self.Id]," !! ",POS[i]
            except : self.Rencontre = False #pass
            
    def Moodet (self):
        
        if self.Rencontre == False:
            self.can.delete(self.Smile)
            app.after_cancel(self.AfterEncounter)
            self.Bool = True
            self.Mouvement ()
        else :
            app.after_cancel(self.Mouve)
            self.Rencontre = False
            self.AfterEncounter = app.after(2000,self.Moodet)

    def ShowMood (self) :
        ## Smileys = :), :\, :(,:( !#?%, :p, :'(, :D Hi !, :o, (oµO)..l.. 
        ## MOOD  = ["H","M","N"] # Heureux, Malheureux, Neutre
        ## WayFeel = ["S","M","G"] # Suspicieux, Méchant, Gentil
        self.Str_text.set(("Morp n°"+str(self.Id+1)+" ("+self.Color+") : Rencontre avec un Morp."))

        e = 40
        font = 'Arial 15 bold'
        couleur = 'brown'
        
        if self.Mood == "H" and self.WayFeel == "S" : ##
            self.Smile = self.can.create_text(self.x1+e,self.y1, font=font,  text=":D", fill = couleur)
        elif self.Mood == "H" and self.WayFeel == "M" : ##
            self.Smile = self.can.create_text(self.x1+e,self.y1, font=font, text="(oµO)..l..", fill = couleur)
        elif self.Mood == "H" and self.WayFeel == "G" : ##
            self.Smile = self.can.create_text(self.x1+e,self.y1, font=font, text=":p Hi !", fill = couleur)
        elif self.Mood == "M" and self.WayFeel == "S" : ##
            self.Smile = self.can.create_text(self.x1+e,self.y1, font=font, text=":\\", fill = couleur)
        elif self.Mood == "M" and self.WayFeel == "M" : ##
            self.Smile = self.can.create_text(self.x1+e,self.y1, font=font, text=":( !#?%", fill = couleur)
        elif self.Mood == "M" and self.WayFeel == "G" : ##
            self.Smile = self.can.create_text(self.x1+e,self.y1, font=font, text=":'(", fill = couleur)
        elif self.Mood == "N" and self.WayFeel == "S" : ##
            self.Smile = self.can.create_text(self.x1+e,self.y1, font=font, text=":| ?", fill = couleur)
        elif self.Mood == "N" and self.WayFeel == "M" : ##
            self.Smile = self.can.create_text(self.x1+e,self.y1, font=font, text=":| #Tss#", fill = couleur)
        elif self.Mood == "N" and self.WayFeel == "G" : ##
            self.Smile = self.can.create_text(self.x1+e,self.y1, font=font, text=":)", fill = couleur)

if __name__ == "__main__":
    app = Plateau()
    del DIC
    app.title('IA Simulator. Affiché en '+str(round(time()-t,5))+" secondes.")
    app.resizable(False,False)
    app.iconbitmap("ErwIco.ico")
    app.mainloop()

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.