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