player.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import pygame
  2. from tiles import *
  3. from variables import *
  4. from world import World
  5. class Player:
  6. def __init__(self, x: int, y: int, world: World, display: pygame.display):
  7. """Un joueur, avec ses coordonnées (x, y)"""
  8. self.display = display
  9. self.x: int = x
  10. self.y: int = y
  11. self.picture = PLAYER_RU
  12. self.world: World = world
  13. self.next_move = "up"
  14. self.moving = True
  15. self.actions_till_next_farmer = 10
  16. self.last_tile = self.find_current_tile()
  17. self.pos_history = [(self.x, self.y)]
  18. self.piou_piou_number = 0
  19. def draw(self):
  20. """Affiche le joueur"""
  21. image = pygame.transform.scale(self.picture, (self.world.tile_width, self.world.tile_height))
  22. 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
  23. # On dessine tous les poussins
  24. for i in range(2, self.piou_piou_number + 2):
  25. pioumage = pygame.transform.scale(PIOU_PIOU, (self.world.tile_width, self.world.tile_height))
  26. self.display.blit(pioumage, (self.pos_history[-i][0] - self.world.tile_width // 2, self.pos_history[-i][1] - self.world.tile_height // 2))
  27. def move(self, direction: str):
  28. """Modifie les coordonnées x et y du joueur en fonction de la direction donnée"""
  29. really_move = True
  30. if direction == "up":
  31. if self.y - self.world.gap - self.world.tile_height >= self.world.top_border: # Il faut que ça soit supérieur parce que les coos descendent
  32. self.y -= self.world.gap + self.world.tile_height
  33. self.next_move = "up"
  34. if self.picture == PLAYER_LD:
  35. self.picture = PLAYER_LU
  36. elif self.picture == PLAYER_RD:
  37. self.picture = PLAYER_RU
  38. # Si un poussin est déjà là
  39. if self.piou_piou_number > 1:
  40. if (self.x, self.y) in self.pos_history[-self.piou_piou_number:]:
  41. really_move = False
  42. self.move("up")
  43. else:
  44. really_move = False
  45. elif direction == "down":
  46. if self.y + self.world.gap + self.world.tile_height <= self.world.bottom_border: # Inversement ici
  47. self.y += self.world.gap + self.world.tile_height
  48. self.next_move = "down"
  49. if self.picture == PLAYER_LU:
  50. self.picture = PLAYER_LD
  51. elif self.picture == PLAYER_RU:
  52. self.picture = PLAYER_RD
  53. # Si un poussin est déjà là
  54. if self.piou_piou_number > 1:
  55. if (self.x, self.y) in self.pos_history[-self.piou_piou_number:]:
  56. really_move = False
  57. self.move("down")
  58. else:
  59. really_move = False
  60. elif direction == "left":
  61. if self.x - self.world.gap - 3 * self.world.tile_width // 4 >= self.world.left_border:
  62. if self.next_move == "up":
  63. if self.y - self.world.gap // 2 - self.world.tile_height // 2 >= self.world.top_border:
  64. self.x -= self.world.gap + 3 * self.world.tile_width // 4
  65. self.y -= self.world.gap // 2 + self.world.tile_height // 2
  66. self.next_move = "down"
  67. self.picture = PLAYER_LD
  68. # Si un poussin est déjà là
  69. if self.piou_piou_number > 1:
  70. if (self.x, self.y) in self.pos_history[-self.piou_piou_number:]:
  71. really_move = False
  72. self.move("left")
  73. else:
  74. self.next_move = "down"
  75. self.move("left")
  76. really_move = False
  77. elif self.next_move == "down":
  78. if self.y + self.world.gap // 2 + self.world.tile_height // 2 <= self.world.bottom_border:
  79. self.x -= self.world.gap + 3 * self.world.tile_width // 4
  80. self.y += self.world.gap // 2 + self.world.tile_height // 2
  81. self.next_move = "up"
  82. self.picture = PLAYER_LU
  83. # Si un poussin est déjà là
  84. if self.piou_piou_number > 1:
  85. if (self.x, self.y) in self.pos_history[-self.piou_piou_number:]:
  86. really_move = False
  87. self.move("left")
  88. else:
  89. self.next_move = "up"
  90. self.move("left")
  91. really_move = False
  92. else:
  93. really_move = False
  94. elif direction == "right":
  95. if self.x + self.world.gap + 3 * self.world.tile_width // 4 <= self.world.right_border:
  96. if self.next_move == "up":
  97. if self.y - self.world.gap // 2 - self.world.tile_height // 2 >= self.world.top_border:
  98. self.x += self.world.gap + 3 * self.world.tile_width // 4
  99. self.y -= self.world.gap // 2 + self.world.tile_height // 2
  100. self.next_move = "down"
  101. self.picture = PLAYER_RD
  102. # Si un poussin est déjà là
  103. if self.piou_piou_number > 1:
  104. if (self.x, self.y) in self.pos_history[-self.piou_piou_number:]:
  105. really_move = False
  106. self.move("right")
  107. else:
  108. self.next_move = "down"
  109. self.move("right")
  110. really_move = False
  111. elif self.next_move == "down":
  112. if self.y + self.world.gap // 2 + self.world.tile_height // 2 <= self.world.bottom_border:
  113. self.x += self.world.gap + 3 * self.world.tile_width // 4
  114. self.y += self.world.gap // 2 + self.world.tile_height // 2
  115. self.next_move = "up"
  116. self.picture = PLAYER_RU
  117. # Si au moins deux poussins sont là
  118. if self.piou_piou_number > 1:
  119. if (self.x, self.y) in self.pos_history[-self.piou_piou_number:]:
  120. really_move = False
  121. self.move("right")
  122. else:
  123. self.next_move = "up"
  124. self.move("right")
  125. really_move = False
  126. else:
  127. really_move = False
  128. if really_move:
  129. self.handle_egg()
  130. self.pos_history.append((self.x, self.y))
  131. def find_current_tile(self):
  132. """Renvoie la tuile sur laquelle se trouve le joueur"""
  133. found = False
  134. i = 0
  135. while not found and i < len(self.world.pos_list):
  136. if self.world.pos_list[i] == {"x": self.x, "y": self.y}:
  137. found = True
  138. else:
  139. i += 1
  140. if found:
  141. return self.world.tiles_list[i]
  142. else:
  143. print("Aucune tuile trouvée")
  144. def action(self):
  145. """L'action de ce tour"""
  146. tile = self.find_current_tile()
  147. if (tile.x, tile.y) != (self.last_tile.x, self.last_tile.y):
  148. if tile.tiletype == "seed":
  149. self.moving = False
  150. self.seed()
  151. tile.tiletype = "green"
  152. self.world.spawn_new_seed()
  153. self.actions_till_next_farmer -= 1
  154. self.last_tile = tile
  155. self.moving = True
  156. def seed(self):
  157. if self.world.egg == 0:
  158. self.world.egg = 1
  159. self.world.tiles_list[0].tiletype = "egg1"
  160. self.world.have_egg = True
  161. def handle_egg(self):
  162. """Gère l'oeuf"""
  163. if self.world.egg == 4:
  164. self.world.tiles_list[0].type = "egg2"
  165. self.world.tiles_list[0].tiletype = "egg2"
  166. elif self.world.egg == 8:
  167. self.world.tiles_list[0].type = "egg3"
  168. self.world.tiles_list[0].tiletype = "egg3"
  169. elif self.world.egg == 12:
  170. self.world.tiles_list[0].type = "egg4"
  171. self.world.tiles_list[0].tiletype = "egg4"
  172. elif self.world.egg == 16:
  173. self.world.tiles_list[0].type = "egg5"
  174. self.world.tiles_list[0].tiletype = "egg5"
  175. if self.world.egg == 20:
  176. self.world.egg = 0
  177. self.world.have_egg = False
  178. self.world.tiles_list[0].tiletype = "nest"
  179. self.piou_piou_number += 1
  180. elif self.world.egg != 0:
  181. self.world.egg += 1