diff --git a/MyTestProject/.project b/MyTestProject/.project
new file mode 100644
index 0000000..c7cba7c
--- /dev/null
+++ b/MyTestProject/.project
@@ -0,0 +1,17 @@
+
+
+ MyTestProject
+
+
+
+
+
+ org.python.pydev.PyDevBuilder
+
+
+
+
+
+ org.python.pydev.pythonNature
+
+
diff --git a/MyTestProject/.pydevproject b/MyTestProject/.pydevproject
new file mode 100644
index 0000000..9de26f7
--- /dev/null
+++ b/MyTestProject/.pydevproject
@@ -0,0 +1,8 @@
+
+
+
+/${PROJECT_DIR_NAME}/src
+
+python 3.0
+Default
+
diff --git a/MyTestProject/src/root/__init__.py b/MyTestProject/src/root/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/MyTestProject/src/root/__pycache__/__init__.cpython-35.pyc b/MyTestProject/src/root/__pycache__/__init__.cpython-35.pyc
new file mode 100644
index 0000000..e57336a
Binary files /dev/null and b/MyTestProject/src/root/__pycache__/__init__.cpython-35.pyc differ
diff --git a/MyTestProject/src/root/__pycache__/__init__.cpython-36.pyc b/MyTestProject/src/root/__pycache__/__init__.cpython-36.pyc
new file mode 100644
index 0000000..b4efaf6
Binary files /dev/null and b/MyTestProject/src/root/__pycache__/__init__.cpython-36.pyc differ
diff --git a/MyTestProject/src/root/nested/RepeatedTimer.py b/MyTestProject/src/root/nested/RepeatedTimer.py
new file mode 100644
index 0000000..90016d9
--- /dev/null
+++ b/MyTestProject/src/root/nested/RepeatedTimer.py
@@ -0,0 +1,33 @@
+'''
+Created on 9 févr. 2017
+
+@author: opbo6311
+'''
+
+from threading import Timer
+
+class RepeatedTimer(object):
+ def __init__(self, interval, function, *args, **kwargs):
+ self._timer = None
+ self.interval = interval
+ self.function = function
+ self.args = args
+ self.kwargs = kwargs
+ self.is_running = False
+ self.start()
+
+ def _run(self):
+ self.is_running = False
+ self.start()
+ self.function(*self.args, **self.kwargs)
+
+ def start(self):
+ if not self.is_running:
+ self._timer = Timer(self.interval, self._run)
+ self._timer.start()
+ self.is_running = True
+
+ def stop(self):
+ self._timer.cancel()
+ self.is_running = False
+
\ No newline at end of file
diff --git a/MyTestProject/src/root/nested/__init__.py b/MyTestProject/src/root/nested/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/MyTestProject/src/root/nested/__pycache__/RepeatedTimer.cpython-36.pyc b/MyTestProject/src/root/nested/__pycache__/RepeatedTimer.cpython-36.pyc
new file mode 100644
index 0000000..5918584
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/RepeatedTimer.cpython-36.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/__init__.cpython-35.pyc b/MyTestProject/src/root/nested/__pycache__/__init__.cpython-35.pyc
new file mode 100644
index 0000000..fdd6c0d
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/__init__.cpython-35.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/__init__.cpython-36.pyc b/MyTestProject/src/root/nested/__pycache__/__init__.cpython-36.pyc
new file mode 100644
index 0000000..7650d03
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/__init__.cpython-36.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/cobaye.cpython-35.pyc b/MyTestProject/src/root/nested/__pycache__/cobaye.cpython-35.pyc
new file mode 100644
index 0000000..ea7b2a3
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/cobaye.cpython-35.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/cobaye.cpython-36.pyc b/MyTestProject/src/root/nested/__pycache__/cobaye.cpython-36.pyc
new file mode 100644
index 0000000..11c2428
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/cobaye.cpython-36.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/constantes.cpython-35.pyc b/MyTestProject/src/root/nested/__pycache__/constantes.cpython-35.pyc
new file mode 100644
index 0000000..20f765f
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/constantes.cpython-35.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/constantes.cpython-36.pyc b/MyTestProject/src/root/nested/__pycache__/constantes.cpython-36.pyc
new file mode 100644
index 0000000..4fed084
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/constantes.cpython-36.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/habitant.cpython-35.pyc b/MyTestProject/src/root/nested/__pycache__/habitant.cpython-35.pyc
new file mode 100644
index 0000000..3ee63ff
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/habitant.cpython-35.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/habitant.cpython-36.pyc b/MyTestProject/src/root/nested/__pycache__/habitant.cpython-36.pyc
new file mode 100644
index 0000000..6238ee0
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/habitant.cpython-36.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/nourriture.cpython-35.pyc b/MyTestProject/src/root/nested/__pycache__/nourriture.cpython-35.pyc
new file mode 100644
index 0000000..5fb0761
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/nourriture.cpython-35.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/nourriture.cpython-36.pyc b/MyTestProject/src/root/nested/__pycache__/nourriture.cpython-36.pyc
new file mode 100644
index 0000000..4411b23
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/nourriture.cpython-36.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/nourriturefixe.cpython-35.pyc b/MyTestProject/src/root/nested/__pycache__/nourriturefixe.cpython-35.pyc
new file mode 100644
index 0000000..b4046c6
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/nourriturefixe.cpython-35.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/nourriturefixe.cpython-36.pyc b/MyTestProject/src/root/nested/__pycache__/nourriturefixe.cpython-36.pyc
new file mode 100644
index 0000000..9c7491f
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/nourriturefixe.cpython-36.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/predateur.cpython-35.pyc b/MyTestProject/src/root/nested/__pycache__/predateur.cpython-35.pyc
new file mode 100644
index 0000000..795ecf9
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/predateur.cpython-35.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/predateur.cpython-36.pyc b/MyTestProject/src/root/nested/__pycache__/predateur.cpython-36.pyc
new file mode 100644
index 0000000..0f78e29
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/predateur.cpython-36.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/simulateur.cpython-35.pyc b/MyTestProject/src/root/nested/__pycache__/simulateur.cpython-35.pyc
new file mode 100644
index 0000000..e1e1830
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/simulateur.cpython-35.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/simulateur.cpython-36.pyc b/MyTestProject/src/root/nested/__pycache__/simulateur.cpython-36.pyc
new file mode 100644
index 0000000..063f6c5
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/simulateur.cpython-36.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/terrain.cpython-35.pyc b/MyTestProject/src/root/nested/__pycache__/terrain.cpython-35.pyc
new file mode 100644
index 0000000..89dd4ab
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/terrain.cpython-35.pyc differ
diff --git a/MyTestProject/src/root/nested/__pycache__/terrain.cpython-36.pyc b/MyTestProject/src/root/nested/__pycache__/terrain.cpython-36.pyc
new file mode 100644
index 0000000..8250655
Binary files /dev/null and b/MyTestProject/src/root/nested/__pycache__/terrain.cpython-36.pyc differ
diff --git a/MyTestProject/src/root/nested/cobaye.py b/MyTestProject/src/root/nested/cobaye.py
new file mode 100644
index 0000000..2647bdd
--- /dev/null
+++ b/MyTestProject/src/root/nested/cobaye.py
@@ -0,0 +1,142 @@
+'''
+Created on 30 nov. 2016
+
+@author: opbo6311
+'''
+from root.nested.habitant import Habitant
+from tkinter import *
+from root.nested.terrain import *
+from root.nested.constantes import Constantes
+from math import sqrt
+
+class Cobaye(Habitant):
+ "Un cobaye dans le monde virtuel"
+ nivenergie=Constantes.cobayeenergiedepart
+ distancenourriture=Constantes.infini
+
+ def __init__(self, ter, posx, posy):
+ "Constructeur de la classe Cobaye"
+ super().__init__(ter, posx, posy)
+ self.vitessemax=10
+ self.vision=40
+ self.forme = self.terrain.canvas.create_oval(self.positionx-5 , self.positiony-5, self.positionx+5, self.positiony+5, width=2, fill='blue')
+ self.type="Cobaye"
+ self.nivenergie=Constantes.cobayeenergiedepart
+ self.terrain.stockage.append(["Cobaye Start", self.positionx, self.positiony])
+ #self.terrain.stockagestr=self.terrain.stockagestr+"{{'catégorie':'cobaye','x':{0},'y':{1},'energie':{2}}}".format(self.positionx, self.positiony, self.nivenergie)
+ #print("stockagestr:", self.terrain.stockagestr)
+
+ def computemove(self):
+ "Calcul du prochain mouvement de ce cobaye"
+ # Trouver les prédateurs à proximité. Choisir le plus proche. Le fuir.
+ predposx, predposy = self.terrain.plusprocheselontype(self.positionx, self.positiony, "Predateur")
+ #print ("positions retournées move fuite cobaye", predposx, predposy)
+ vecteurdepx=0
+ vecteurdepy=0
+ self.nextpositionx=Constantes.nondefini
+ self.nextpositiony=Constantes.nondefini
+ if (predposx != Constantes.nondefini):
+ vecteurdepx=self.positionx-predposx
+ vecteurdepy=self.positiony-predposy
+ #print ("vecteurdep brut move fuite cobaye", vecteurdepx, vecteurdepy)
+ # Normalisation par rapport à la vitessemax
+ normevecteurdep=sqrt((vecteurdepx)**2 + (vecteurdepy)**2)
+ if normevecteurdep <= self.vision:
+ vecteurdepx=self.vitessemax*vecteurdepx/normevecteurdep
+ vecteurdepy=self.vitessemax*vecteurdepy/normevecteurdep
+ #print ("vecteurdep normalisé move fuite cobaye", vecteurdepx, vecteurdepy)
+ self.nextpositionx=self.positionx+vecteurdepx
+ if (self.nextpositionx<7):
+ self.nextpositionx=7
+ if (self.nextpositionx>self.terrain.dimensionx-7):
+ self.nextpositionx=self.terrain.dimensionx-7
+ self.nextpositiony=self.positiony+vecteurdepy
+ if (self.nextpositiony<7):
+ self.nextpositiony=7
+ if (self.nextpositiony>self.terrain.dimensiony-7):
+ self.nextpositiony=self.terrain.dimensiony-7
+ # Affichage du vecteur
+ self.formemove=self.terrain.canvas.create_line(self.positionx, self.positiony, self.nextpositionx, self.nextpositiony, arrow="last", width=2, fill='blue')
+ if (self.nextpositionx == Constantes.nondefini):
+ # Si la faim tiraille, il faut chercher à manger.
+ nourposx, nourposy = self.terrain.plusprocheselontype(self.positionx, self.positiony, "NourritureFixe")
+ #print ("positions retournées move nourriture cobaye", nourposx, nourposy)
+ if (nourposx != Constantes.nondefini):
+ # Aller dans la direction en question
+ vecteurdepx=self.positionx-nourposx
+ vecteurdepy=self.positiony-nourposy
+ #print ("vecteurdep brut move nourriture cobaye", vecteurdepx, vecteurdepy)
+ # Normalisation par rapport à la vitessemax
+ normevecteurdep=sqrt((vecteurdepx)**2 + (vecteurdepy)**2)
+ if normevecteurdep <= 20*self.vision:
+ if normevecteurdep>self.vitessemax:
+ vecteurdepx=-self.vitessemax*vecteurdepx/normevecteurdep
+ vecteurdepy=-self.vitessemax*vecteurdepy/normevecteurdep
+ else:
+ vecteurdepx=-vecteurdepx
+ vecteurdepy=-vecteurdepy
+ #print ("vecteurdep normalisé move nourriture cobaye", vecteurdepx, vecteurdepy)
+ self.nextpositionx=self.positionx+vecteurdepx
+ self.nextpositiony=self.positiony+vecteurdepy
+ # Affichage du vecteur
+ self.formemove=self.terrain.canvas.create_line(self.positionx, self.positiony, self.nextpositionx, self.nextpositiony, arrow="last", width=2, fill='blue')
+ #else:
+ # Se déplacer au hasard
+
+ def performmove(self):
+ "Réalisation du move déjà calculé"
+ # Le tour de mouvement coute de la nourriture
+ self.nivenergie=self.nivenergie-Constantes.coutenergiecobayepartour
+ self.terrain.stockage.append(["Cobaye Energie", self.nivenergie])
+ # Tester si mouvement nécessaire
+ if self.nextpositionx != Constantes.nondefini:
+ # Effacer la flèche.
+ self.terrain.canvas.delete(self.formemove)
+ self.formemove=Constantes.nondefini
+ # Bouger le cobaye.
+ self.positionx=self.nextpositionx
+ self.positiony=self.nextpositiony
+ self.nextpositionx=Constantes.nondefini
+ self.nextpositiony=Constantes.nondefini
+ self.terrain.canvas.coords(self.forme, self.positionx-5, self.positiony-5, self.positionx+5, self.positiony+5)
+ self.terrain.stockage.append(["Cobaye Move", self.positionx, self.positiony])
+
+ def aftermove(self):
+ "Réalisation des actions post move"
+ # Si la nourriture est atteinte, recharger le compteur de nourriture, et dire à la nourriture qu'elle est consommée.
+ # Savoir si une nourriture est au contact.
+ nourposx, nourposy = self.terrain.plusprocheselontype(self.positionx, self.positiony, "NourritureFixe")
+ #print ("positions retournées after move nourriture cobaye", nourposx, nourposy)
+ if (nourposx != Constantes.nondefini):
+ # mesurer la distance
+ vecteurx=self.positionx-nourposx
+ vecteury=self.positiony-nourposy
+ #print ("vecteurdep brut after move nourriture cobaye", vecteurx, vecteury)
+ # Calcul de la distance
+ self.distancenourriture=sqrt((vecteurx)**2 + (vecteury)**2)
+ #print("Distance after move nourriture cobaye", distancenourriture)
+ if (self.distancenourriture < 0.1):
+ self.nivenergie=self.nivenergie+Constantes.energienourriturefixe
+ lanourriture=self.terrain.trouverhabitant("NourritureFixe", nourposx, nourposy)
+ self.terrain.retirerhabitant(lanourriture)
+
+ # Si le cobaye n'a plus d'énergie, il meurt.
+ if (self.nivenergie == 0):
+ self.terrain.retirerhabitant(self)
+ print("Le cobaye est mort de faim")
+
+ # Si on est mort, sortir du plateau.
+
+ def disparaitre(self):
+ "Actions à réaliser avant de faire sortir cet habitant"
+ self.terrain.canvas.delete(self.forme)
+ self.terrain.stockage.append(["Cobaye Delete", self.positionx, self.positiony ])
+
+ def display(self, txtwidget):
+ "Donner à chaque objet (habitant, mais pas que...) l'opportunité d'afficher quelque chose sur le controleur"
+ txtwidget.insert(END, "Cobaye: distance à la nourriture: {}.\n".format(self.distancenourriture))
+ txtwidget.insert(END, "Cobaye: niveau d'énergie: {}.\n ".format(self.nivenergie))
+
+ def stocker(self, first=0):
+ "Stockage dans je json"
+ self.terrain.stockagestr=self.terrain.stockagestr+"{{'catégorie':'cobaye','x':{0},'y':{1},'energie':{2}}}".format(self.positionx, self.positiony, self.nivenergie)
diff --git a/MyTestProject/src/root/nested/constantes.py b/MyTestProject/src/root/nested/constantes.py
new file mode 100644
index 0000000..6ed823f
--- /dev/null
+++ b/MyTestProject/src/root/nested/constantes.py
@@ -0,0 +1,52 @@
+'''
+Created on 12 déc. 2016
+
+@author: opbo6311
+'''
+
+class Constantes(object):
+ "Les constantes pour tout l'environnement"
+ infini=99999999
+ nondefini=-1
+ cobayeenergiedepart=100
+ coutenergiecobayepartour=1
+ energienourriturefixe=50
+ dimensionresultx=750
+ dimensionresulty=100
+
+ def __init__(self):
+ "Constructeur de la classe des constantes"
+
+
+""" Exemple de format de message
+{
+ "start":{
+ "dimensions": { "x": 300, "y": 600}
+ },
+ "tours": [
+ {
+ "tour nb": 0,
+ "population":[
+ {"catégorie":"cobaye", "x": 305, "y": 700, "energie": 45},
+ {"catégorie":"predateur", "x": 301, "y": 600},
+ {"catégorie":"predateur", "x": 302, "y": 600},
+ {"catégorie":"predateur", "x": 303, "y": 600},
+ {"catégorie":"nourriturefixe", "x": 303, "y": 600}
+ ]
+ },
+ {
+ "tour nb": 1,
+ "population":[
+ {"catégorie":"cobaye", "x": 305, "y": 700, "energie": 45},
+ {"catégorie":"predateur", "x": 301, "y": 600},
+ {"catégorie":"predateur", "x": 302, "y": 600},
+ {"catégorie":"predateur", "x": 303, "y": 600},
+ {"catégorie":"nourriturefixe", "x": 303, "y": 600}
+ ]
+ }
+ ],
+ "end":{
+ "survie": 100
+ }
+}
+"""
\ No newline at end of file
diff --git a/MyTestProject/src/root/nested/controleur.py b/MyTestProject/src/root/nested/controleur.py
new file mode 100644
index 0000000..c874170
--- /dev/null
+++ b/MyTestProject/src/root/nested/controleur.py
@@ -0,0 +1,169 @@
+'''
+Created on 4 déc. 2016
+
+@author: opbo6311
+'''
+from tkinter import *
+from root.nested.simulateur import Simulateur
+from root.nested.constantes import Constantes
+import time
+import requests
+import random
+import json
+import gc
+from colour import Color
+from root.nested.RepeatedTimer import RepeatedTimer
+
+if __name__ == '__main__':
+
+ def serialrun():
+ global sim
+ startsimulation()
+ while (sim.isgameover()==False):
+ sim.computemove()
+ sim.performmove()
+ sim.aftermove()
+ sim.display(txtwidget)
+ # fenctrl.after(50, automove)
+ # fenctrl.after(10000, automove)
+ #time.sleep(0.1)
+ txtwidget.insert(END, "La cobaye est mort")
+ del sim
+ gc.collect()
+
+ def startsimulation():
+ "Démarrage de la simulation"
+ global sim
+ print("Démarrage de la simulation")
+ dicoparam={}
+ largeur=int(vlg.get())
+ dicoparam['largeur']=largeur
+ hauteur=int(vht.get())
+ dicoparam['hauteur']=hauteur
+ nbcob=int(vnbcob.get())
+ dicoparam['nb cobayes']=nbcob
+ nbpred=int(vnbpred.get())
+ dicoparam['nb prédateurs']=nbpred
+ nbnour=int(vnbnour.get())
+ dicoparam['nb nourritures']=nbnour
+ newnour=int(vnewnour.get())
+ dicoparam['nb tours réapparition nourriture']=newnour
+ sim=Simulateur(dicoparam)
+
+ def computemove():
+ "Calculs nécessaires pour les mouvements sur le terrain"
+ sim.computemove()
+
+ def performmove():
+ "Réalisation des mouvements"
+ sim.performmove()
+
+ def aftermove():
+ "Réalisation des actions post mouvements"
+ sim.aftermove()
+ sim.display(txtwidget)
+
+ def automove():
+ "Automatisation du compute puis move en boucle"
+ while (sim.isgameover()==False):
+ sim.computemove()
+ sim.performmove()
+ sim.aftermove()
+ sim.display(txtwidget)
+ # fenctrl.after(50, automove)
+ # fenctrl.after(10000, automove)
+ time.sleep(0.1)
+ txtwidget.insert(END, "La cobaye est mort")
+
+ def apitestpost():
+ "Test d'un POST vers l'API server"
+ for i in range(0,5):
+ jsonaenvoyer='{"Survie":'+str(random.randrange(1,1000))+',"Trace":"longue chaine d etapes"}'
+ r=requests.post('http://127.0.0.1:5000/serverAPI', json=jsonaenvoyer)
+ print("status code:", r.status_code)
+ print("response:", r.text)
+ #time.sleep(0.0001)
+
+ def apitestget():
+ "Test d'un GET vers l'API server"
+ global cansummarylastentrynb
+ r=requests.get('http://127.0.0.1:5000/serverAPI')
+ print("status code:", r.status_code)
+ print("response:", r.text)
+ parsedjson = json.loads(r.text)
+ #print("L'entrée 4:", parsedjson["4"])
+ #print("La sous-entrée Survie:", parsedjson["4"]["Survie"])
+ taille=parsedjson["Taille"]
+ cansummary.delete("all")
+ cansummarylastentrynb=0
+ for i in range(1,taille+1):
+ survie=parsedjson[str(i)]["Survie"]
+ addsummaryentry(survie)
+
+ def apitestgetentry():
+ "Test d'un GET(entry) vers l'API server"
+ for i in range(0,5000):
+ addsummaryentry(random.randrange(0,999))
+
+ def addsummaryentry(value):
+ "Ajout d'une entrée dans le canvas d'affichage des résultats"
+ # value entre 0 et 999.
+ global cansummarylastentrynb, colors
+ posentryx=10*(cansummarylastentrynb % (Constantes.dimensionresultx/10))
+ posentryy=10*(cansummarylastentrynb // (Constantes.dimensionresultx/10))
+ cansummary.create_rectangle(posentryx,posentryy,posentryx+9,posentryy+9,fill=colors[value])
+ cansummarylastentrynb=cansummarylastentrynb+1
+
+ fenctrl=Tk()
+ fenctrl.title("Controleur")
+
+ txtlg = Label(fenctrl, text ='Terrain de simulation, largeur :').grid(row=1, sticky=E)
+ vlg = StringVar(fenctrl, value='600')
+ entrylg = Entry(fenctrl, textvariable=vlg).grid(row=1, column=1)
+ txtht = Label(fenctrl, text ='Terrain de simulation, hauteur :').grid(row=2, sticky=E)
+ vht = StringVar(fenctrl, value='300')
+ entryht = Entry(fenctrl, textvariable=vht).grid(row=2, column=1)
+ txtnbcob = Label(fenctrl, text ='Terrain de simulation, nb de cobayes :').grid(row=3, sticky=E)
+ vnbcob = StringVar(fenctrl, value='1')
+ entrynbcob = Entry(fenctrl, textvariable=vnbcob).grid(row=3, column=1)
+ txtnbpred = Label(fenctrl, text ='Terrain de simulation, nb de prédateurs :').grid(row=4, sticky=E)
+ vnbpred = StringVar(fenctrl, value='6')
+ entrynbpred = Entry(fenctrl, textvariable=vnbpred).grid(row=4, column=1)
+ txtnbnour = Label(fenctrl, text ='Terrain de simulation, nb de nourritures au départ :').grid(row=5, sticky=E)
+ vnbnour = StringVar(fenctrl, value='4')
+ entrynbnour = Entry(fenctrl, textvariable=vnbnour).grid(row=5, column=1)
+ txtnewnour = Label(fenctrl, text ='Terrain de simulation, nb de tours pour faire réapparaitre la nourriture :').grid(row=6, sticky=E)
+ vnewnour = StringVar(fenctrl, value='65')
+ entrynewnour = Entry(fenctrl, textvariable=vnewnour).grid(row=6, column=1)
+ txtnbtour = Label(fenctrl, text ='Terrain de simulation, nb de tours maximum :').grid(row=7, sticky=E)
+ vnbtour = StringVar(fenctrl, value='1000')
+ entrynbtour = Entry(fenctrl, textvariable=vnbtour).grid(row=7, column=1)
+
+ bstartsim = Button(fenctrl, text='Start simulation', command=startsimulation).grid(row=8, column=0, sticky=E)
+ bcompmove = Button(fenctrl, text='Compute move', command=computemove).grid(row=8, column=1)
+ bmove = Button(fenctrl, text='Move', command=performmove).grid(row=8, column=2)
+ baftermove = Button(fenctrl, text='After Move', command=aftermove).grid(row=8, column=3)
+ bauto = Button(fenctrl, text='Auto move', command=automove).grid(row=8, column=4)
+ bserialrun = Button(fenctrl, text='Serial Run', command=serialrun).grid(row=8, column=5)
+
+ txtwidget= Text(fenctrl, height=10, width=80)
+ txtwidget.grid(row=9, columnspan=6, sticky=W)
+
+ btestAPIpost = Button(fenctrl, text='API test (POST)', command=apitestpost).grid(row=10, column=0, sticky=W)
+ btestAPIget = Button(fenctrl, text='API test (GET)', command=apitestget).grid(row=10, column=1)
+ btestAPIgetentry = Button(fenctrl, text='API test (Get entry)', command=apitestgetentry).grid(row=10, column=2)
+
+ cansummary= Canvas(fenctrl, width =Constantes.dimensionresultx, height =Constantes.dimensionresulty, bg ='white', scrollregion=(0,0,Constantes.dimensionresultx,1000))
+ cansummary.grid(row=11, columnspan=6, sticky=W)
+ cansummarylastentrynb=0
+ red = Color("red")
+ colors = list(red.range_to(Color("green"),1000))
+ vbar=Scrollbar(fenctrl,orient=VERTICAL)
+ vbar.grid(row=11, column=5, sticky='ns')
+ vbar.config(command=cansummary.yview)
+ cansummary.config(width =Constantes.dimensionresultx, height =Constantes.dimensionresulty)
+ cansummary.config(yscrollcommand=vbar.set)
+
+ rt = RepeatedTimer(2, apitestget) # it auto-starts, no need of rt.start()
+
+ fenctrl.mainloop()
\ No newline at end of file
diff --git a/MyTestProject/src/root/nested/example.py b/MyTestProject/src/root/nested/example.py
new file mode 100644
index 0000000..3a4b0f3
--- /dev/null
+++ b/MyTestProject/src/root/nested/example.py
@@ -0,0 +1,33 @@
+'''
+Created on 21 nov. 2016
+
+@author: opbo6311
+'''
+
+import tkinter as tk
+
+class Application(tk.Frame):
+ def __init__(self, master=None):
+ super().__init__(master)
+ self.ptr=master
+ self.pack()
+ self.create_widgets()
+
+ def create_widgets(self):
+ self.hi_there = tk.Button(self)
+ self.hi_there["text"] = "Hello World\n(click me)"
+ self.hi_there["command"] = self.say_hi
+ self.hi_there.pack(side="top")
+
+ self.quit = tk.Button(self, text="QUIT", fg="red",
+ command=self.ptr.destroy)
+ self.quit.pack(side="bottom")
+
+ def say_hi(self):
+ print("hi there, everyone!")
+
+root = tk.Tk()
+root2 = tk.Tk()
+app = Application(master=root)
+app2=Application(master=root2)
+app.mainloop()
\ No newline at end of file
diff --git a/MyTestProject/src/root/nested/example2.py b/MyTestProject/src/root/nested/example2.py
new file mode 100644
index 0000000..814c416
--- /dev/null
+++ b/MyTestProject/src/root/nested/example2.py
@@ -0,0 +1,54 @@
+from tkinter import *
+# définition des gestionnaires
+# d'événements :
+def move():
+ "déplacement de la balle"
+ global x1, y1, dx, dy, flag
+ x1, y1 = x1 +dx, y1 + dy
+ if x1 >210:
+ x1, dx, dy = 210, 0, 15
+ if y1 >210:
+ y1, dx, dy = 210, -15, 0
+ if x1 <10:
+ x1, dx, dy = 10, 0, -15
+ if y1 <10:
+ y1, dx, dy = 10, 15, 0
+ can1.coords(oval1,x1,y1,x1+30,y1+30)
+ if flag >0:
+ fen1.after(100,move)
+# => boucler, après 50 millisecondes
+def stop_it():
+ "arrêt de l'animation"
+ global flag
+ flag =0
+def start_it():
+ "démarrage de l'animation"
+ global flag
+ if flag ==0:
+# pour ne lancer qu’une seule boucle
+ flag =1
+ move()
+
+#========== Programme principal =============
+# les variables suivantes seront utilisées de manière globale :
+x1, y1 = 10, 10
+# coordonnées initiales
+dx, dy = 15, 0
+# 'pas' du déplacement
+flag =0
+# commutateur
+# Création du widget principal ("parent") :
+fen1 = Tk()
+fen1.title("Exercice d'animation avec tkinter")
+# création des widgets "enfants" :
+can1 = Canvas(fen1,bg='dark grey',height=250, width=250)
+can1.pack(side=LEFT, padx =5, pady =5)
+oval1 = can1.create_oval(x1, y1, x1+30, y1+30, width=2, fill='red')
+bou1 = Button(fen1,text='Quitter', width =8, command=fen1.quit)
+bou1.pack(side=BOTTOM)
+bou2 = Button(fen1, text='Démarrer', width =8, command=start_it)
+bou2.pack()
+bou3 = Button(fen1, text='Arrêter', width =8, command=stop_it)
+bou3.pack()
+# démarrage du réceptionnaire d'événements (boucle principale) :
+fen1.mainloop()
\ No newline at end of file
diff --git a/MyTestProject/src/root/nested/habitant.py b/MyTestProject/src/root/nested/habitant.py
new file mode 100644
index 0000000..4ff3cb2
--- /dev/null
+++ b/MyTestProject/src/root/nested/habitant.py
@@ -0,0 +1,51 @@
+'''
+Created on 30 nov. 2016
+
+@author: opbo6311
+'''
+from root.nested.constantes import Constantes
+
+class Habitant(object):
+ "Un habitant du monde virtuel"
+ vitessemax=0
+ vision=0
+ positionx=Constantes.nondefini
+ positiony=Constantes.nondefini
+ nextpositionx=Constantes.nondefini
+ nextpositiony=Constantes.nondefini
+ terrain=Constantes.nondefini
+ forme=Constantes.nondefini
+ formemove=Constantes.nondefini
+ type=""
+
+ def __init__(self, ter, posx, posy):
+ "Constructeur de la classe habitant"
+ self.positionx=posx
+ self.positiony=posy
+ self.terrain=ter
+ self.type="Habitant"
+
+ def computemove(self):
+ "Fonction par défaut si pas instanciée en héritage"
+ #print ("This inhabitant as no computemove() method")
+ #print(type(self))
+
+ def performmove(self):
+ "Fonction par défaut si pas instanciée en héritage"
+ #print ("This inhabitant as no performmove() method")
+ #print(type(self))
+
+ def aftermove(self):
+ "Fonction par défaut si pas instanciée en héritage"
+ #print ("This inhabitant as no aftermove() method")
+ #print(type(self))
+
+ def display(self, txtwidget):
+ "Fonction par défaut si pas instanciée en héritage"
+ #print ("This inhabitant as no display() method")
+ #print(type(self))
+
+ def disparaitre(self):
+ "Fonction par défaut si pas instanciée en héritage"
+ #print ("This inhabitant as no disparaitre() method")
+ #print(type(self))
\ No newline at end of file
diff --git a/MyTestProject/src/root/nested/nourriture.py b/MyTestProject/src/root/nested/nourriture.py
new file mode 100644
index 0000000..0cd4821
--- /dev/null
+++ b/MyTestProject/src/root/nested/nourriture.py
@@ -0,0 +1,15 @@
+'''
+Created on 30 nov. 2016
+
+@author: opbo6311
+'''
+from root.nested.habitant import Habitant
+
+class Nourriture(Habitant):
+ "De la nourriture pour le cobaye dans le monde virtuel"
+
+
+ def __init__(self, ter, posx, posy):
+ "Constructeur de la classe Nourriture"
+ super().__init__(ter, posx, posy)
+ self.type="Nourriture"
\ No newline at end of file
diff --git a/MyTestProject/src/root/nested/nourriturefixe.py b/MyTestProject/src/root/nested/nourriturefixe.py
new file mode 100644
index 0000000..871fe67
--- /dev/null
+++ b/MyTestProject/src/root/nested/nourriturefixe.py
@@ -0,0 +1,36 @@
+'''
+Created on 30 nov. 2016
+
+@author: opbo6311
+'''
+from root.nested.nourriture import Nourriture
+from root.nested.habitant import Habitant
+
+class Nourriturefixe(Nourriture):
+ "De la nourriture fixe pour le cobaye dans le monde virtuel"
+
+
+ def __init__(self, ter, posx, posy):
+ "Constructeur de la classe Nourriturefixe"
+ super().__init__(ter, posx, posy)
+ self.vitessemax=0
+ self.forme = self.terrain.canvas.create_rectangle(self.positionx-5 , self.positiony-5, self.positionx+5, self.positiony+5, width=2, fill='green')
+ self.terrain.stockage.append(["Nourriture Fixe Start", self.positionx, self.positiony])
+ self.type="NourritureFixe"
+ #self.terrain.stockagestr=self.terrain.stockagestr+",{{'catégorie':'nourriturefixe','x':{0},'y':{1}}}".format(self.positionx, self.positiony)
+ #print("stockagestr:", self.terrain.stockagestr)
+
+ def aftermove(self):
+ "Réalisation des actions post move"
+ # Si on est consommé, sortir du plateau.
+
+ def disparaitre(self):
+ "Actions à réaliser avant de faire sortir cet habitant"
+ self.terrain.canvas.delete(self.forme)
+ self.terrain.stockage.append(["Nourriture Fixe Delete", self.positionx, self.positiony ])
+
+ def stocker(self, first=0):
+ "Stockage dans je json"
+ if (first==0):
+ self.terrain.stockagestr=self.terrain.stockagestr+","
+ self.terrain.stockagestr=self.terrain.stockagestr+"{{'catégorie':'nourriturefixe','x':{0},'y':{1}}}".format(self.positionx, self.positiony)
diff --git a/MyTestProject/src/root/nested/nourritureproie.py b/MyTestProject/src/root/nested/nourritureproie.py
new file mode 100644
index 0000000..1f6c3c4
--- /dev/null
+++ b/MyTestProject/src/root/nested/nourritureproie.py
@@ -0,0 +1,15 @@
+'''
+Created on 30 nov. 2016
+
+@author: opbo6311
+'''
+from root.nested.nourriture import Nourriture
+
+class Nourritureproie(Nourriture):
+ "Nourriture mobile dans le monde virtuel, donc une proie à chasser pour le cobaye"
+
+
+ def __init__(self):
+ "Constructeur de la classe Nourritureproie"
+ self.vitessemax=6
+ self.type="Nourritureproie"
\ No newline at end of file
diff --git a/MyTestProject/src/root/nested/nourriturestatique.py b/MyTestProject/src/root/nested/nourriturestatique.py
new file mode 100644
index 0000000..f5af8c6
--- /dev/null
+++ b/MyTestProject/src/root/nested/nourriturestatique.py
@@ -0,0 +1,14 @@
+'''
+Created on 30 nov. 2016
+
+@author: opbo6311
+'''
+from root.nested.nourriture import Nourriture
+
+class Nourriturestatique(Nourriture):
+ "De la nourriture statique pour le cobaye"
+
+ def __init__(self):
+ "Constructeur de la classe Nourriturestatique"
+ self.vitessemax=0
+ self.type="Nourriturestatique"
\ No newline at end of file
diff --git a/MyTestProject/src/root/nested/simulateur.py b/MyTestProject/src/root/nested/simulateur.py
new file mode 100644
index 0000000..4f8b952
--- /dev/null
+++ b/MyTestProject/src/root/nested/simulateur.py
@@ -0,0 +1,71 @@
+'''
+Created on 30 nov. 2016
+
+@author: opbo6311
+'''
+from root.nested.terrain import Terrain
+from tkinter import *
+from random import randrange
+
+class Simulateur(object):
+ "le simulateur faisant tourner le monde virtuel"
+ terrain=0
+ cptmove=0
+ newnour=0
+
+ def __init__(self, dicoparam):
+ "Constructeur de la classe Simulateur"
+ terrainlg=dicoparam['largeur']
+ terrainht=dicoparam["hauteur"]
+ nbcob=dicoparam['nb cobayes']
+ nbpred=dicoparam['nb prédateurs']
+ nbnour=dicoparam['nb nourritures']
+ self.newnour=dicoparam['nb tours réapparition nourriture']
+ self.terrain=Terrain(terrainlg, terrainht) # Création de l'aire de jeu
+ self.cptmove=0
+ self.terrain.stockagestr=self.terrain.stockagestr+"'tours':["
+ #self.terrain.stockagestr=self.terrain.stockagestr+"'tours':[{{'tour nb':{0},".format(self.cptmove)
+ #self.terrain.stockagestr=self.terrain.stockagestr+"'population':["
+ #print("stockagestr:", self.terrain.stockagestr)
+ # Ajout des habitants
+ for i in range(nbcob):
+ self.terrain.ajouthabitant("Cobaye", randrange(self.terrain.dimensionx-10+5) , randrange(self.terrain.dimensiony-10+5))
+ for i in range(nbpred):
+ self.terrain.ajouthabitant("Predateur", randrange(self.terrain.dimensionx-10+5) , randrange(self.terrain.dimensiony-10+5))
+ for i in range(nbnour):
+ self.terrain.ajouthabitant("NourritureFixe", randrange(self.terrain.dimensionx-10+5) , randrange(self.terrain.dimensiony-10+5))
+ self.terrain.stocker(self.cptmove, first=1)
+ #self.terrain.stockagestr=self.terrain.stockagestr+"]}"
+ #print("stockagestr:", self.terrain.stockagestr)
+
+
+ def computemove(self):
+ "Calcul des mouvements à venir de tous les habitants du terrain"
+ self.terrain.computemove()
+
+ def performmove(self):
+ "Réalisation des mouvements calculés de tous les habitants du terrain"
+ self.terrain.stockage.append(["Simulation Nbmove", self.cptmove])
+ self.terrain.performmove()
+
+ def aftermove(self):
+ "Réalisation des actions post mouvements de tous les habitants du terrain"
+ self.terrain.aftermove()
+ self.cptmove=self.cptmove+1
+ if (self.cptmove%self.newnour == 0):
+ self.terrain.ajouthabitant("NourritureFixe", randrange(self.terrain.dimensionx-10+5) , randrange(self.terrain.dimensiony-10+5))
+ self.terrain.stocker(self.cptmove)
+
+ def display(self, txtwidget):
+ "Donner à chaque objet (habitant, mais pas que...) l'opportunité d'afficher quelque chose sur le controleur"
+ txtwidget.delete(1.0, END)
+ txtwidget.insert(END, "Compteur de mouvement: {}.\n".format(self.cptmove))
+ self.terrain.display(txtwidget)
+ if (self.terrain.gameover==True):
+ self.terrain.fenterrain.destroy()
+ self.terrain.stockagestr=self.terrain.stockagestr+"],'end':{{'survie':{0}}}}}".format(self.cptmove)
+ print("stockagestr:", self.terrain.stockagestr)
+
+ def isgameover(self):
+ "Détermine si la partie est terminée"
+ return self.terrain.isgameover(self.cptmove)
\ No newline at end of file
diff --git a/MyTestProject/src/root/nested/terrain.py b/MyTestProject/src/root/nested/terrain.py
new file mode 100644
index 0000000..7f9e92d
--- /dev/null
+++ b/MyTestProject/src/root/nested/terrain.py
@@ -0,0 +1,137 @@
+'''
+Created on 30 nov. 2016
+
+@author: opbo6311
+'''
+from root.nested.cobaye import Cobaye
+from root.nested.predateur import Predateur
+from tkinter import *
+from root.nested.nourriturefixe import Nourriturefixe
+from root.nested.constantes import Constantes
+from math import sqrt
+
+class Terrain(object):
+ "Le terrain virtuel dans lequel les cobayes, prédateurs et nourritures se trouvent, et vivent"
+ dimensionx=400
+ dimensiony=400
+ population=[]
+ fenterrain=Constantes.nondefini
+ canvas=Constantes.nondefini
+ gameover=False
+ stockage=[]
+ stockagestr=""
+
+ def __init__(self, dimx, dimy):
+ "Constructeur de la classe Terrain"
+ del self.population[:]
+ del self.stockage[:]
+ self.stockagestr=""
+ self.dimensionx=dimx
+ self.dimensiony=dimy
+ self.fenterrain=Tk()
+ self.fenterrain.title("Simulation")
+ self.canvas = Canvas(self.fenterrain,bg='dark grey',height=self.dimensiony,width=self.dimensionx)
+ self.canvas.pack(side=LEFT)
+ self.gameover=False
+ self.stockagestr="{{'start':{{'dimensions':{{'x':{0},'y':{1}}}}},".format(dimx, dimy)
+ print("stockagestr:", self.stockagestr)
+ self.stockage.append(['Dimensions', dimx, dimy])
+
+ def ajouthabitant(self, ltype, posx, posy):
+ "Ajout d'un habitant à une certaine position"
+ if (ltype == "Cobaye"):
+ hab=Cobaye(self, posx, posy)
+ self.population.append(hab)
+ elif (ltype=="Predateur"):
+ hab=Predateur(self, posx, posy)
+ self.population.append(hab)
+ elif (ltype=="NourritureFixe"):
+ hab=Nourriturefixe(self, posx, posy)
+ self.population.append(hab)
+
+ def retirerhabitant(self, habitantaretirer):
+ "Retirer un habitant du terrain"
+ habitantaretirer.disparaitre()
+ self.population.remove(habitantaretirer)
+ if (habitantaretirer.type=="Cobaye"):
+ self.gameover=True
+ del habitantaretirer
+ #print("Habitant retiré du terrain")
+
+ def trouverhabitant(self, type, posx, posy):
+ "Retourne le pointeur vers l'habitant le plus proche de la position donnée, avec le type donné"
+ lhabitant=Constantes.nondefini
+ distance=Constantes.infini
+
+ for hab in self.population:
+ if hab.type==type:
+ dist=sqrt((hab.positionx-posx)**2+(hab.positiony-posy)**2)
+ if dist