I.a. (débutant)

Soyez le premier à donner votre avis sur cette source.

Vue 8 878 fois - Téléchargée 533 fois

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

Ajouter un commentaire Commentaires
Rano Its
Messages postés
11
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
6 décembre 2008

23 juin 2010 à 22:43
Merci pour ton commentaire,
les commentaires dans la source étaient plutôt pour m'aider à imaginer les figures sur le canvas.
cs_Julien39
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
366
21 juin 2010 à 19:09
C'est déjà pas mal, faire une bonne ia est quelque chose d'assez difficile. Tu as fait un effort pour commenter, cependant, certains morceaux de code commentés viennent nuire à la compréhension générale.

Un très bon code quand même
Rano Its
Messages postés
11
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
6 décembre 2008

3 janv. 2010 à 00:20
Je suis d'accord, ça n'est pas une I.A.. À vrai dire, mon projet de début devait l'être, mais au final je n'avais pas l'expérience, ni les connaissances pour le faire, donc je n'étais pas aller plus loin.

Merci de ton commentaire.

Je garde ton idée de piège en tête :p.
xeolin
Messages postés
336
Date d'inscription
samedi 26 novembre 2005
Statut
Membre
Dernière intervention
8 novembre 2011
2
2 janv. 2010 à 23:26
Ce que tu as fait ici, ce n'est pas une IA, mais des robots, qui ont des actions qui ressemble à de l'intelligence mais qui ne le sont pas.

Ton programme est très bon, ne pense pas que je le critique, j'aime beaucoup les petit pacman qui se nourrissent tout seul !

Ce que c'est une intelligence, pour moi (j'ai pas envie d'entrer dans une discussion philosophique ici) c'est quelque chose qui s'adapte. Ajoute quelque chose, un piège par exemple ton petit robot tombera toujours dedans, il faudrait qu'il soit capable de s'adapter pour qu'il soit une vrai IA...

Enfin le programme, lui est bon. Bon boulot!

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.