| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- import pygame
- from tiles import *
- from variables import *
- from world import World
- def create_farmer(world, display):
- """Crée un fermier sur une tuile au bord de la map"""
- 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)
- return farmer
- def farmers_control(world, player, display):
- """Permet de controler l'apparition des fermiers, et de moduler leur nombre, ainsi que le moment ou ils apparraissent.
- On peut maintenant créer des vagues de fermiers en fonction du nombre de poussins"""
- if player.piou_piou_number in [0, 1, 2]:
- if world.egg == 4:
- world.farmers.append(create_farmer(world, display))
- elif player.piou_piou_number in [3, 4, 5]:
- if world.egg == 1:
- world.farmers.append(create_farmer(world, display))
- elif player.piou_piou_number > 5:
- if world.egg == 1:
- world.farmers.append(create_farmer(world, display))
- if world.egg == 4:
- world.farmers.append(create_farmer(world, display))
- if world.egg == 9:
- world.farmers.append(create_farmer(world, display))
- 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)
- self.origin: Tile = self.find_current_tile()
- self.destination: Tile = world.pos_list[0]
- self.goal_done: bool = self.is_at_nest()
- self.alive: bool = True
- self.tuile_traversees = 0
- def draw(self):
- """Affiche le fermier"""
- if self.alive :
- 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))
- self.tuile_traversees += 1
- 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) -> tuple:
- """Prend la tuile à atteindre 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 = self.destination["x"]
- y_nest = self.destination["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 find_current_tile(self):
- """Renvoie la tuile sur laquelle se trouve le fermier"""
- found = False
- i = 0
- for tile in self.world.pos_list:
- if SPACE > abs(tile["x"] - self.x) and SPACE > abs(tile["y"] - self.y):
- found = True
- if found:
- return tile
- else:
- print("Aucune tuile trouvée")
- def is_at_nest(self) -> bool:
- """Renvoie True si le fermier est au nid False sinon. Met automatiquement a jour "self.goal_done" """
- res = False
- if self.find_current_tile() == self.world.pos_list[0]:
- res = True
- self.goal_done = True
- return res
- def is_at_origin(self) -> bool:
- """Renvoie True si le fermier est au nidn False sinon"""
- res = False
- if self.find_current_tile() == self.origin:
- res = True
- return res
- def change_destination(self) -> None:
- """Change la tuile destination du fermier lorsqu'il touche le nid"""
- if self.is_at_nest() :
- self.destination = self.origin
- elif self.is_at_origin():
- self.destination = self.world.pos_list[0]
-
- def way_to_follow(self) -> None:
- """Renvoie les coordonées par lesquelles va passer le fermier sous forme d'une liste"""
- return None
- def disappear(self) -> None:
- """Fais disparaitre le fermier si il a atteint le nid et si il est revenu à son point de départ"""
- if self.is_at_origin() and self.goal_done :
- self.alive = False
- return None
- def action(self) -> None:
- self.change_destination()
- self.x, self.y = self.next_tuile()
- self.neighbors_list = self.neighbors(self.x, self.y, self.world)
- self.find_current_tile()
- self.disappear()
|