1
0

farmer.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import pygame
  2. from tiles import *
  3. from variables import *
  4. from world import World
  5. def create_farmer(world, display):
  6. """Crée un fermier sur une tuile au bord de la map"""
  7. random_border_tile_example = world.random_border_tile(world.border_tiles(world.tiles_list))
  8. farmer = Farmer(random_border_tile_example.x, random_border_tile_example.y, world, display)
  9. return farmer
  10. def farmers_control(world, player, display):
  11. """Permet de controler l'apparition des fermiers, et de moduler leur nombre, ainsi que le moment ou ils apparraissent.
  12. On peut maintenant créer des vagues de fermiers en fonction du nombre de poussins"""
  13. if player.piou_piou_number in [0, 1, 2]:
  14. if world.egg == 4:
  15. world.farmers.append(create_farmer(world, display))
  16. elif player.piou_piou_number in [3, 4, 5]:
  17. if world.egg == 1:
  18. world.farmers.append(create_farmer(world, display))
  19. elif player.piou_piou_number > 5:
  20. if world.egg == 1:
  21. world.farmers.append(create_farmer(world, display))
  22. if world.egg == 4:
  23. world.farmers.append(create_farmer(world, display))
  24. if world.egg == 9:
  25. world.farmers.append(create_farmer(world, display))
  26. class Farmer:
  27. def __init__(self, x: int, y: int, world: World, display: pygame.display):
  28. """Un fermier, avec ses coordonnées (x, y)"""
  29. self.display = display
  30. self.x: int = x
  31. self.y: int = y
  32. self.world: World = world
  33. self.neighbors_list: list = self.neighbors(self.x, self.y, self.world)
  34. self.origin: Tile = self.find_current_tile()
  35. self.destination: Tile = world.pos_list[0]
  36. self.goal_done: bool = self.is_at_nest()
  37. self.alive: bool = True
  38. self.tuile_traversees = 0
  39. def draw(self):
  40. """Affiche le fermier"""
  41. if self.alive :
  42. image = pygame.transform.scale(FARMER, (self.world.tile_width, self.world.tile_height))
  43. self.display.blit(image, (self.x - self.world.tile_width // 2, self.y - self.world.tile_height // 2))
  44. self.tuile_traversees += 1
  45. def neighbors(self, x: int, y: int, world: World) -> list:
  46. """Prend la position d'une tuile ((x, y), qui n'est pas son centre), et renvoie la position des tuiles adjacentess dans une liste"""
  47. x_centre = x
  48. y_centre = y
  49. res = []
  50. top_tile = (x_centre, y_centre - world.gap - world.tile_height)
  51. bottom_tile = (x_centre, y_centre + world.gap + world.tile_height)
  52. left_high_tile = (x_centre - world.gap - 3 * world.tile_width // 4, y_centre - world.gap // 2 - world.tile_height // 2)
  53. left_bottom_tile = (x_centre - world.gap - 3 * world.tile_width // 4, y_centre + world.gap // 2 + world.tile_height // 2)
  54. right_high_tile = (x_centre + world.gap + 3 * world.tile_width // 4, y_centre - world.gap // 2 - world.tile_height // 2)
  55. right_bottom_tile = (x_centre + world.gap + 3 * world.tile_width // 4, y_centre + world.gap // 2 + world.tile_height // 2)
  56. res.append(top_tile)
  57. res.append(bottom_tile)
  58. res.append(left_high_tile)
  59. res.append(left_bottom_tile)
  60. res.append(right_high_tile)
  61. res.append(right_bottom_tile)
  62. return res
  63. def next_tuile(self) -> tuple:
  64. """Prend la tuile à atteindre et renvoie les coordonnées de la tuile sur laquelle le fermier doit aller pour s'en rapprocher le plus"""
  65. res = (0, 0)
  66. x_nest = self.destination["x"]
  67. y_nest = self.destination["y"]
  68. min = WINDOW_WIDTH ** 2 * 2
  69. for tuile in self.neighbors_list:
  70. x, y = tuile
  71. x = abs(x - x_nest)
  72. y = abs(y - y_nest)
  73. hypo = x ** 2 + y ** 2
  74. if min > hypo :
  75. min = hypo
  76. res = tuile
  77. return(res)
  78. def find_current_tile(self):
  79. """Renvoie la tuile sur laquelle se trouve le fermier"""
  80. found = False
  81. i = 0
  82. for tile in self.world.pos_list:
  83. if SPACE > abs(tile["x"] - self.x) and SPACE > abs(tile["y"] - self.y):
  84. found = True
  85. if found:
  86. return tile
  87. else:
  88. print("Aucune tuile trouvée")
  89. def is_at_nest(self) -> bool:
  90. """Renvoie True si le fermier est au nid False sinon. Met automatiquement a jour "self.goal_done" """
  91. res = False
  92. if self.find_current_tile() == self.world.pos_list[0]:
  93. res = True
  94. self.goal_done = True
  95. return res
  96. def is_at_origin(self) -> bool:
  97. """Renvoie True si le fermier est au nidn False sinon"""
  98. res = False
  99. if self.find_current_tile() == self.origin:
  100. res = True
  101. return res
  102. def change_destination(self) -> None:
  103. """Change la tuile destination du fermier lorsqu'il touche le nid"""
  104. if self.is_at_nest() :
  105. self.destination = self.origin
  106. elif self.is_at_origin():
  107. self.destination = self.world.pos_list[0]
  108. def way_to_follow(self) -> None:
  109. """Renvoie les coordonées par lesquelles va passer le fermier sous forme d'une liste"""
  110. return None
  111. def disappear(self) -> None:
  112. """Fais disparaitre le fermier si il a atteint le nid et si il est revenu à son point de départ"""
  113. if self.is_at_origin() and self.goal_done :
  114. self.alive = False
  115. return None
  116. def action(self) -> None:
  117. self.change_destination()
  118. self.x, self.y = self.next_tuile()
  119. self.neighbors_list = self.neighbors(self.x, self.y, self.world)
  120. self.find_current_tile()
  121. self.disappear()