Jelajahi Sumber

ajout du fermier, de son déplacement vers le nid

louciane 2 minggu lalu
induk
melakukan
b8e1401bc2
7 mengubah file dengan 116 tambahan dan 6 penghapusan
  1. 70 0
      farmer.py
  2. TEMPAT SAMPAH
      images/farmer.png
  3. 16 0
      main.py
  4. 0 2
      player.py
  5. 1 2
      tiles.py
  6. 3 2
      variables.py
  7. 26 0
      world.py

+ 70 - 0
farmer.py

@@ -0,0 +1,70 @@
+import pygame
+from tiles import *
+from variables import *
+from world import World
+
+class Farmer:
+    def __init__(self, x: int, y: int, world: World, display: pygame.display):
+        """Un fermier, avec ses coordonnées (x, y)"""
+        self.display = display
+        self.x: int = x
+        self.y: int = y
+        self.world: World = world
+        self.neighbors_list: list = self.neighbors(self.x, self.y, self.world)
+
+    def draw(self):
+        """Affiche le fermier"""
+        image = pygame.transform.scale(FARMER, (self.world.tile_width, self.world.tile_height))
+        self.display.blit(image, (self.x - self.world.tile_width // 2, self.y - self.world.tile_height // 2))  
+
+
+
+    def neighbors(self, x: int, y: int, world: World) -> list:
+        """Prend la position d'une tuile ((x, y), qui n'est pas son centre), et renvoie la position des tuiles adjacentess dans une liste"""
+        x_centre = x
+        y_centre = y
+
+        res = []
+
+        top_tile = (x_centre, y_centre - world.gap - world.tile_height)
+        bottom_tile = (x_centre, y_centre  + world.gap + world.tile_height)
+        left_high_tile = (x_centre - world.gap - 3 * world.tile_width // 4, y_centre - world.gap // 2 - world.tile_height // 2)
+        left_bottom_tile = (x_centre - world.gap - 3 * world.tile_width // 4, y_centre + world.gap // 2 + world.tile_height // 2)
+        right_high_tile = (x_centre + world.gap + 3 * world.tile_width // 4, y_centre - world.gap // 2 - world.tile_height // 2)
+        right_bottom_tile = (x_centre + world.gap + 3 * world.tile_width // 4, y_centre + world.gap // 2 + world.tile_height // 2)
+
+        res.append(top_tile)
+        res.append(bottom_tile)
+        res.append(left_high_tile)
+        res.append(left_bottom_tile)
+        res.append(right_high_tile)
+        res.append(right_bottom_tile)
+        
+        return res
+
+    def next_tuile(self, world: World) -> tuple:
+        """Prend les coordonnées du nid et renvoie les coordonnées de la tuile sur laquelle le fermier doit aller pour s'en rapprocher le plus"""
+        res = (0, 0)
+        x_nest = world.pos_list[0]["x"]
+        y_nest = world.pos_list[0]["y"]
+
+        min = WINDOW_WIDTH ** 2 * 2
+        for tuile in self.neighbors_list:
+            x, y = tuile   
+
+            x = abs(x - x_nest)
+            y = abs(y - y_nest)
+
+            hypo = x ** 2 + y ** 2
+
+            if min > hypo :
+                min = hypo
+                res = tuile
+
+        return(res)
+
+
+    def way_to_follow(self, world: World):
+        """Renvoie les coordonées par lesquelles va passer le fermier sous forme d'une liste"""
+        return None
+        

TEMPAT SAMPAH
images/farmer.png


+ 16 - 0
main.py

@@ -4,6 +4,7 @@ from world import World
 from variables import *
 from player import *
 from nest import *
+from farmer import *
 
 
 def main():
@@ -26,6 +27,11 @@ def main():
 
     nest = Nest(0, display)
 
+    random_border_tile_example = world.random_border_tile(world.border_tiles(world.tiles_list))
+    farmer = Farmer(random_border_tile_example.x, random_border_tile_example.y, world, display)
+
+    farmer.draw()
+
     ### Boucle principale ###
     while True:
 
@@ -34,6 +40,14 @@ def main():
 
             # On gère les touches
             if event.type == pygame.KEYDOWN:
+
+                farmer.x, farmer.y = farmer.next_tuile(world)
+                farmer.neighbors_list = farmer.neighbors(farmer.x, farmer.y, farmer.world)
+                print("FARMER FARMER FARMER FARMER FARMER FARMER FARMER FARMER FARMER FARMER FARMER ")
+                print(farmer.x, farmer.y)
+                print("LISTE   LISTE   LISTE   LISTE   LISTE   LISTE   LISTE   LISTE   LISTE   LISTE   LISTE   ")
+                farmer.way_to_follow(world)
+
                 if event.key == pygame.K_z:
                     player.move("up")
 
@@ -50,7 +64,9 @@ def main():
         world.draw()
         player.draw()
         nest.draw(world.pos_list[0], 0)
+        farmer.draw()
 
+            
         pygame.display.update()
         clock.tick(FPS)
 

+ 0 - 2
player.py

@@ -1,6 +1,5 @@
 import pygame
 from tiles import *
-from variables import *
 from world import World
 
 
@@ -18,7 +17,6 @@ class Player:
         image = pygame.transform.scale(PLAYER, (self.world.tile_width, self.world.tile_height))
         self.display.blit(image, (self.x - self.world.tile_width // 2, self.y - self.world.tile_height // 2))  #la valeur ici est arbitraire mais marche. elle est la pour centrer l'affichage du joueur sur une tuile, a changer dans le futur
     
-    
     def move(self, direction: str):
         """Modifie les coordonnées x et y du joueur en fonction de la direction donnée"""
         if direction == "up":

+ 1 - 2
tiles.py

@@ -20,5 +20,4 @@ class Tile:
             image = pygame.transform.scale(HEXA, (self.width, self.height))
         self.display.blit(image, (self.x - self.width // 2, self.y - self.height // 2))
 
-        
-        
+

+ 3 - 2
variables.py

@@ -2,8 +2,8 @@ from pygame import image
 from os import path
 
 # taille de la fenêtre
-WINDOW_WIDTH = 1920
-WINDOW_HEIGHT = 1080
+WINDOW_WIDTH = 1000
+WINDOW_HEIGHT = 700
 
 # Nombre d'images par secondes
 FPS = 60
@@ -21,6 +21,7 @@ HEXA = image.load(path.join("images/hexa.png"))
 SEED = image.load(path.join("images/seed.png"))
 
 PLAYER = image.load(path.join("images/player.png"))
+FARMER = image.load(path.join("images/farmer.png"))
 
 NEST = image.load(path.join("images/nest.png"))
 

+ 26 - 0
world.py

@@ -17,6 +17,7 @@ class World:
         self.right_border = max([tile["x"] for tile in self.pos_list])
         self.top_border = min([tile["y"] for tile in self.pos_list])
         self.bottom_border = max([tile["y"] for tile in self.pos_list])
+        self.border_tiles_list = self.border_tiles(self.tiles_list)
 
     
     def draw(self):
@@ -168,3 +169,28 @@ class World:
             res.append({"x": x, "y": y})
 
         return res
+
+    def border_tiles(self, tiles_list: list) -> list:
+        """Renvoie une liste contenant les tuiles des bordures de la map, les tuiles étant les plus éloignées concernant celles d'en haut et d'en bas"""
+        res = []
+        for tuile in tiles_list:
+            if tuile.y == self.top_border or tuile.y == self.bottom_border:
+                res.append(tuile)
+            elif tuile.x == self.left_border or tuile.x == self.right_border:
+                res.append(tuile)                               #######################A EFFACER ####################################
+        return res
+
+    def random_border_tile(self, border_tiles_list: list) -> list:
+        """Renvoie une tuile aléatoire du bord de la map"""
+        res = choice(border_tiles_list)
+        return res
+
+
+
+
+
+
+
+
+
+#           res.append(Tile(self.pos_list[0]["x"], self.pos_list[0]["y"], self.tile_width, self.tile_height, "green", self.display))