diff --git a/Emir/Champs.py b/Emir/Champs.py
old mode 100644
new mode 100755
index 525e78679b60c3855b7071f3f50455d7f230998a..c80f4cb5ff77bccd856bf99d49a0f46fa6f668cf
--- a/Emir/Champs.py
+++ b/Emir/Champs.py
@@ -1,41 +1,41 @@
-import pygame as py
-
-#class Champs:
-
-class Champs:
-
-    def __init__(self,coordonnee[]):
-        cooX = coordonnee[0]
-        cooY = coordonnee[1]
-        #taille height
-        #taille width
-        temperature
-        tauxEau
-        TauxInsecte
-        Construction[]
-
-    def image_graphique(self, image):
-        #selectionne l'image à afficher
-
-    def MouseHover(self):
-    #afficher le prix et la hitbox du champs
-
-
-    def debloquer(self):
-    #si le joueur à acheté et a débloquer ou pas
-    
-    
-
-    def plantation(self):
-    #info sur la plante choisi
-        
-    #méthode optionnelle   
-    def menu_des_plantations(self);
-    #menu deroulant ou fenetre qui affiche
-    #les trucs qu'on peut planter
-
-    def getcoordonee(self):
-    #Accesseur
-    
-    def stringAffichage(self):
-    #Affichage de toutes les infos
+import pygame as py
+
+#class Champs:
+
+class Champs:
+
+    def __init__(self,coordonnee[]):
+        cooX = coordonnee[0]
+        cooY = coordonnee[1]
+        #taille height
+        #taille width
+        temperature
+        tauxEau
+        TauxInsecte
+        Construction[]
+
+    def image_graphique(self, image):
+        #selectionne l'image à afficher
+
+    def MouseHover(self):
+    #afficher le prix et la hitbox du champs
+
+
+    def debloquer(self):
+    #si le joueur à acheté et a débloquer ou pas
+    
+    
+
+    def plantation(self):
+    #info sur la plante choisi
+        
+    #méthode optionnelle   
+    def menu_des_plantations(self);
+    #menu deroulant ou fenetre qui affiche
+    #les trucs qu'on peut planter
+
+    def getcoordonee(self):
+    #Accesseur
+    
+    def stringAffichage(self):
+    #Affichage de toutes les infos
diff --git a/Emir/teste pygame.py b/Emir/teste pygame.py
old mode 100644
new mode 100755
index ab5637323ad1031588bf3fcac4e022799d2ca07f..2b26c2fc70f19a7fc8cb137d4105e1610c076b4f
--- a/Emir/teste pygame.py	
+++ b/Emir/teste pygame.py	
@@ -1,24 +1,24 @@
-import pygame as pg
-
-
-#tour par tour
-
-tour_fini = false;
-
-def TourParTour(self):
-    while not tour_fini:
-        if(BoutonEstClicker)
-            tour_fini = true;
-            tourParTour(BoutonActiver)
-        elif(BoutonExitClicker):
-            quitter le jeu
-        
-    return tour_fini
-
-continuer = true
-
-#Boucle de jeu
-while not tour_fini : 
-    res = TourParTour(BoolBtnValider)
-    if(res):
-        Tour_score +=1
+import pygame as pg
+
+
+#tour par tour
+
+tour_fini = false;
+
+def TourParTour(self):
+    while not tour_fini:
+        if(BoutonEstClicker)
+            tour_fini = true;
+            tourParTour(BoutonActiver)
+        elif(BoutonExitClicker):
+            quitter le jeu
+        
+    return tour_fini
+
+continuer = true
+
+#Boucle de jeu
+while not tour_fini : 
+    res = TourParTour(BoolBtnValider)
+    if(res):
+        Tour_score +=1
diff --git "a/L\303\251o/Champs.py" "b/L\303\251o/Champs.py"
index e022fbc84cf6e6ab8ab9af1e97c7f359fe7d529a..71bac78225f2986ffc1f314bf9a29e49db310f38 100755
--- "a/L\303\251o/Champs.py"
+++ "b/L\303\251o/Champs.py"
@@ -1,36 +1,58 @@
 import pygame
-
-police = pygame.font.SysFont("Alef", 22) #pygame.font.get_fonts() -> liste des fonts
+import numpy as np
 
 class Champs:
     def __init__ (self, tempature, humidite, tempsAvantMaturation, pos, image):
         self.temperature = tempature
         self.humidite = humidite
         self.TAM = tempsAvantMaturation
-        self.pos = pos
+        self.pos = np.array(pos)
         self.image = image
+        self.imageSize = np.array(self.image.get_size())
         self.rect = pygame.rect.Rect(self.pos, self.image.get_rect().size)
+        self.rectScale = self.rect
+        self.police = pygame.font.SysFont("Alef", 22) #pygame.font.get_fonts() -> liste des fonts
+        self.imgZoom = pygame.transform.scale(self.image, self.imageSize)
+
+    def draw (self, screen, camera):
+        scaleImage = camera.scaleImage(self.image)
 
-    def draw (self, screen):
-        screen.blit(self.image, self.pos)
+        if scaleImage: # != None
+            self.imgZoom = scaleImage
+            self.rectScale = pygame.rect.Rect(camera.convertLocation(self.pos), self.imgZoom.get_size())
+        
+        screen.blit(self.imgZoom, camera.convertLocation(self.pos))
+
+    def changeText (self, camera):
+        scaleText = camera.scaleImage(self.text)
+        if scaleText:
+            self.zoomText = scaleText
 
 class Houblon (Champs):
     def __init__ (self, pos):
         super().__init__(0, 0, 0, pos, pygame.image.load('../assets/champ.png'))
+        self.text = self.police.render("Température : " + str(self.temperature), False, (0,0,0))
+        self.zoomText = self.text
 
-    def showInfo (self, screen):
-        text = police.render("Température : " + str(self.temperature), False, (0,0,0))
+    def showInfo (self, screen, camera):
+        pygame.draw.rect(screen, (255, 255, 255), pygame.rect.Rect(camera.convertLocation(self.pos), np.array(self.rect.size)*0.75*abs(camera.zoom)))
+        self.changeText(camera)
 
-        pygame.draw.rect(screen, (255, 255, 255), pygame.rect.Rect(self.pos, (self.rect.width*0.75, self.rect.height*0.75)))
-        screen.blit(text, self.pos)
+        screen.blit(self.zoomText, camera.convertLocation(self.pos))
 
 class Buisson (Champs):
     def __init__ (self, pos, prix = 10000):
-        super().__init__(0, 0, 0, pos, pygame.image.load('../assets/buisson.png'))
+        super().__init__(0, 0, 0, pos, pygame.image.load('../assets/buissonCadenas.png'))
         self.prix = prix
+        self.text = self.police.render("Champ disponible à l'achat : " + str(self.prix), False, (0,0,0))
+        self.zoomText = self.text
+
+    def showInfo (self, screen, camera):
+        pygame.draw.rect(screen, (255, 255, 255), pygame.rect.Rect(camera.convertLocation(self.pos), np.array(self.rect.size)*0.75*abs(camera.zoom)))
+        self.changeText(camera)
 
-    def showInfo (self, screen):
-        text = police.render("Champ disponible à l'achat : " + str(self.prix), False, (0,0,0))
+        screen.blit(self.zoomText, camera.convertLocation(self.pos))
 
-        pygame.draw.rect(screen, (255, 255, 255), pygame.rect.Rect(self.pos, (self.rect.width*0.75, self.rect.height*0.75)))
-        screen.blit(text, self.pos)
+    def buyField (self):
+        # Clique sur buisson -> Pop up "Êtes-vous certain ?" -> Oui ? -> Supprime le buisson de la liste et ajoute un Houblon aux mêmes coordonnées
+        return Houblon(self.pos)
diff --git "a/L\303\251o/Game.py" "b/L\303\251o/Game.py"
index 40e7087f73d7c080bc6f1b7f06bdad1af30c5ac4..4ebfe349910a7865cacb64e2774c94a4c745e3da 100755
--- "a/L\303\251o/Game.py"
+++ "b/L\303\251o/Game.py"
@@ -1,49 +1,158 @@
 import pygame
 from Champs import *
+import numpy as np
 
-police = pygame.font.SysFont("Alef", 30)
+RAYON_MUR_INVISIBLE = 2000
 
 class Game:
     def __init__ (self, screen):
         self.screen = screen
+        self.screenSize = np.array(self.screen.get_size())
         self.score = 0
         self.money = 10000
+        self.displayMoney = 10000
         self.month = "janvier"
-        self.champs = [Houblon((100,100)), Houblon((400,100)), Houblon((700,100)), Houblon((100,300)), Houblon((400,300)), Houblon((700,300)), Houblon((100,500)), Houblon((400,500)), Buisson((700,500))]
+        self.champs = [Houblon((0,0)), Houblon((-200,0)), Houblon((0,-200)), Buisson((400,0)), Buisson((0,400)), Houblon((1000,1000))]#Houblon((100,100)), Houblon((400,100)), Houblon((700,100)), Houblon((100,300)), Houblon((400,300)), Houblon((700,300)), Houblon((100,500)), Houblon((400,500)), Buisson((700,500))]
         self.clock = pygame.time.Clock()
         self.selectedChamp = None
         self.imageMoney = pygame.image.load("../assets/money.png")
-
+        self.imageMoney = pygame.transform.scale(self.imageMoney, np.array(self.imageMoney.get_size())/3)
+        self.police = pygame.font.SysFont("Alef", 30)
+        self.camera = Camera(np.array(self.screen.get_size())/2)
+        self.background = pygame.image.load('../assets/terre.png')
+        self.background = pygame.transform.scale(self.background, (self.screen.get_width(), self.screen.get_height()))
+        self.pluie = pygame.image.load('../assets/pluie.png')
+        self.pluie = pygame.transform.scale(self.pluie, (200,200))
+        self.frame = 0
+        self.buyFrame = -1000
+    
     def gameLoop (self):
         while True:
-            self.screen.fill((0,0,0))
+            self.screen.blit(self.background, (0,0))
+
+            # Météo
+            pygame.draw.rect(self.screen, (127, 127, 127), (0, self.screen.get_height()*0.80, 200, 200))
+            self.screen.blit(self.pluie, (0, self.screen.get_height()*0.80))
 
             isChamp = False
-            #ici il faudra charger les textures du jeu
+            # Affichage des champs
             for champ in self.champs:
-                champ.draw(self.screen)
+                champ.draw(self.screen, self.camera)
+
+            # Affiche les fps
+            fpsText = self.police.render(("%.0f fps" %(self.clock.get_fps())), True, (180,180,180))
+            self.screen.blit(fpsText, (self.screen.get_width() - fpsText.get_width(), 0))
 
             # somme ajoutée ou enlevée au-dessus puis s'ajoute
-            textMoney = police.render(str(self.money), True, (255,255,255))
-            self.screen.blit(textMoney, (0, self.screen.get_height()-textMoney.get_height()*2))
-            self.screen.blit(self.imageMoney, (textMoney.get_width(), self.screen.get_height()-self.imageMoney.get_height()))
 
+            if self.money < self.displayMoney:
+                self.displayMoney -= 100 # Si quelque chose coûte moins que 100, changer par -= min(100, self.displayMoney - self.money)
+            elif self.money > self.displayMoney:
+                self.displayMoney += 100 # Si quelque chose coûte moins que 100, changer par -= min(100, self.money - self.displayMoney)
+
+            textMoney = self.police.render(str(self.displayMoney), True, (255,255,255))
+            self.screen.blit(textMoney, (210, self.screen.get_height()-textMoney.get_height()*2))
+            self.screen.blit(self.imageMoney, (220+textMoney.get_width(), self.screen.get_height()-self.imageMoney.get_height()))
+
+            print(self.clock.get_time())
+            print(self.clock.get_rawtime())
 
             for event in pygame.event.get():
                 if event.type == pygame.QUIT or event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                     exit()
                 elif event.type == pygame.MOUSEMOTION:
+                    if event.buttons[2] == 1: #maintenir enfoncé clic droit
+                        self.camera.setPosition(np.array(event.rel))
+
                     for champ in self.champs:
-                        if champ.rect.contains(*event.pos,0,0):
+                        if champ.rectScale.contains(event.pos[0],event.pos[1],0,0):
                             self.selectedChamp = champ
                             isChamp = True
                 
                     if not isChamp:
                         self.selectedChamp = None
+                
+                elif event.type == pygame.MOUSEWHEEL:
+                    self.camera.zoomInOut(event.y)
+
+                # Achat d'un champ
+                elif event.type == pygame.MOUSEBUTTONDOWN:
+                    if event.button == 1:
+                        for champ in self.champs:
+                            if isinstance(champ, Buisson):
+                                if champ.rectScale.contains(event.pos[0],event.pos[1],0,0):
+                                    if self.money >= champ.prix:
+                                        self.moneyChange = self.police.render(str(-champ.prix), True, (255,0,0))
+
+                                        self.buyFrame = self.frame
+                                    
+                                        self.champs.append(champ.buyField())
+                                        self.champs.remove(champ)
+                                        self.money -= champ.prix
+                                    else:
+                                        self.moneyError()
+                                    
+
+            if self.frame < self.buyFrame + 100:
+                self.screen.blit(self.moneyChange, (210, self.screen.get_height()-textMoney.get_height()*4-(self.frame-self.buyFrame)*1.25))
 
             if self.selectedChamp:
-                self.selectedChamp.showInfo(self.screen)
-            
+                self.selectedChamp.showInfo(self.screen, self.camera)
+
+            pygame.display.update()
+            self.clock.tick(50)
+            self.frame += 1
+
+    def moneyError (self):
+        loop = True
+        while loop:
+            popUp = pygame.draw.rect(self.screen, (0,0,0), (self.screenSize/3, self.screenSize/3))
+
+            for event in pygame.event.get(pygame.MOUSEBUTTONDOWN):
+                if popUp.contains((*event.pos,0,0)):
+                    loop = False
+                    break
 
             pygame.display.update()
-            self.clock.tick(60)
+            self.clock.tick(50)
+                
+
+class Camera:
+    def __init__ (self, screenMid):
+        self.mid = screenMid
+        self.zoom = 1 # zoom actuel
+        self.lastZoom = 1.1 # dernier zoom
+        self.position = np.array([0,0]) # position du point visé (ici le milieu de l'écran)
+
+    def convertLocation (self, c1:np.array)->np.array: # Convertie les coordonnées de l'écran en coordonnées sur le jeu
+        c2 = (c1 * self.zoom) + self.mid + (self.position * self.zoom)
+        return c2
+
+    def changeScreenLocation (self, c2:np.array)->np.array: # Convertie les coordonnées du jeu en coordonnées de l'écran
+        c1 = (c2 - self.mid - (self.position / self.zoom)) / self.zoom
+        return c1
+
+    def zoomInOut (self, y): # Zoom en fonction de la molette
+        self.lastZoom = self.zoom
+        self.zoom += y*0.1
+
+        self.zoom = np.clip(self.zoom, 0.3, 2) # zoom min max
+
+    def setPosition (self, positionRelative): # Calcule la nouvelle position de l'écran
+        newPos = self.position + positionRelative
+
+        # Pour faire un carré (mur invisible) : 
+        self.position = np.clip(newPos, [-1000, -1000], [1000, 1000])
+
+        # Pour faire un cercle :
+        #if np.linalg.norm(newPos) < RAYON_MUR_INVISIBLE:
+            #self.position = newPos
+
+    def __repr__ (self):
+        return f"Zoom = {self.zoom}\nPosition = {self.position}\n"
+
+    def scaleImage (self, img): # Change le zoom d'une image si nécessaire
+        if self.zoom != self.lastZoom:
+            return pygame.transform.scale(img, np.array(img.get_size())*self.zoom)
+
+        return None
\ No newline at end of file
diff --git "a/L\303\251o/T3.py" "b/L\303\251o/T3.py"
index 55d487cf6519b79014860c15a99e1e41765e042b..439895ea71ff0f3c07d59485ee1ff3ed7629dcf6 100755
--- "a/L\303\251o/T3.py"
+++ "b/L\303\251o/T3.py"
@@ -1,4 +1,4 @@
-import pygame, time
+import pygame
 pygame.init()
 
 from datetime import date
@@ -53,10 +53,5 @@ while inMenu:
         elif event.type == pygame.QUIT or event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
             exit(0)
 
-Game.Game(screen).gameLoop()
-
-#après l'appui de start
-#time.sleep(2)
-#screen.fill((0,0,0))
-#pygame.display.flip()
-#time.sleep(2)
\ No newline at end of file
+# à l'appui du bouton start
+Game.Game(screen).gameLoop()
\ No newline at end of file
diff --git "a/L\303\251o/__pycache__/Champs.cpython-39.pyc" "b/L\303\251o/__pycache__/Champs.cpython-39.pyc"
index ff137bda13dc2351b254840d28f35b8453cd60fe..2d425dc2d01b653d7a0a64c31ecc95258016dc30 100755
Binary files "a/L\303\251o/__pycache__/Champs.cpython-39.pyc" and "b/L\303\251o/__pycache__/Champs.cpython-39.pyc" differ
diff --git "a/L\303\251o/__pycache__/Game.cpython-39.pyc" "b/L\303\251o/__pycache__/Game.cpython-39.pyc"
index 018ab015f72bc5ca6b677eaac1de07bd76331735..5d72a2bda6a362bc7848f567038bbe6c27299824 100755
Binary files "a/L\303\251o/__pycache__/Game.cpython-39.pyc" and "b/L\303\251o/__pycache__/Game.cpython-39.pyc" differ
diff --git a/assets/accueil.jpg b/assets/accueil.jpg
old mode 100644
new mode 100755
diff --git a/assets/banner.png b/assets/banner.png
old mode 100644
new mode 100755
diff --git a/assets/buisson.png b/assets/buisson.png
old mode 100644
new mode 100755
diff --git a/assets/buissonCadenas.png b/assets/buissonCadenas.png
new file mode 100755
index 0000000000000000000000000000000000000000..133a33d7577f7da6d72aa265487358234ea9d038
Binary files /dev/null and b/assets/buissonCadenas.png differ
diff --git a/assets/button.png b/assets/button.png
old mode 100644
new mode 100755
diff --git a/assets/cadenas.png b/assets/cadenas.png
old mode 100644
new mode 100755
diff --git a/assets/champ.png b/assets/champ.png
old mode 100644
new mode 100755
diff --git a/assets/grange.webp b/assets/grange.webp
old mode 100644
new mode 100755
diff --git a/assets/money.png b/assets/money.png
new file mode 100755
index 0000000000000000000000000000000000000000..14c3dbdd0d2b8a4c631f8d3a3e6287d1c10fc2bd
Binary files /dev/null and b/assets/money.png differ
diff --git a/assets/pluie.gif b/assets/pluie.gif
new file mode 100755
index 0000000000000000000000000000000000000000..15328b93933821d7c8d146fd052cadaf7c28a6ba
Binary files /dev/null and b/assets/pluie.gif differ
diff --git a/assets/pluie.png b/assets/pluie.png
new file mode 100755
index 0000000000000000000000000000000000000000..af969c3c090ad26c3a7a78d48508d8f79f4d4446
Binary files /dev/null and b/assets/pluie.png differ
diff --git a/assets/terre.png b/assets/terre.png
new file mode 100755
index 0000000000000000000000000000000000000000..1ea7ac101683d5d5d6cfae2148931ad27314886e
Binary files /dev/null and b/assets/terre.png differ