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()
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.