1
0

world.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. from tiles import *
  2. from variables import *
  3. from random import choice
  4. class World:
  5. def __init__(self, display: pygame.display, nb_col: int, nb_row: int, gap: int):
  6. """Un monde avec le nombre de colonnes et de lignes données, et l'espacement donné entre les tuiles"""
  7. self.display = display
  8. self.nb_col = nb_col
  9. self.nb_row = nb_row
  10. self.gap = gap
  11. self.tile_width, self.tile_height = self.tile_size()
  12. self.pos_list = self.position_of_tiles((WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2))
  13. self.tiles_list = self.create_tiles()
  14. self.left_border = min([tile["x"] for tile in self.pos_list])
  15. self.right_border = max([tile["x"] for tile in self.pos_list])
  16. self.top_border = min([tile["y"] for tile in self.pos_list])
  17. self.bottom_border = max([tile["y"] for tile in self.pos_list])
  18. self.egg = 0
  19. self.border_tiles_list = self.border_tiles(self.tiles_list)
  20. self.farmers = []
  21. def draw(self):
  22. """Dessine les tuiles du monde"""
  23. for tile in self.tiles_list:
  24. tile.draw()
  25. def random_tile_type(self) -> str:
  26. """Renvoie une chaine de caractère contenant 'green' ou 'seed' avec une probabilité respective de 90% et 10%"""
  27. t_type = ["green"] * 15 + ["seed"]
  28. return choice(t_type)
  29. def create_tiles(self):
  30. """Renvoie une liste avec toutes les tuiles du monde, générées en partie aléatoirement"""
  31. res = []
  32. # Tuile centrale
  33. res.append(Tile(self.pos_list[0]["x"], self.pos_list[0]["y"], self.tile_width, self.tile_height, "nest", self.display))
  34. # Toutes les autres
  35. for pos in self.pos_list[1:]:
  36. res.append(Tile(pos["x"], pos["y"], self.tile_width, self.tile_height, self.random_tile_type(), self.display))
  37. return res
  38. def tile_size(self) -> tuple:
  39. """Renvoie un tuple contenant la largeur et la hauteur d'une tuile en fonction du nombre de lignes, de colonnes, et de l'espacement entre le tuiles"""
  40. width = (WINDOW_WIDTH - self.nb_col * self.gap) // self.nb_col
  41. height = (WINDOW_HEIGHT - self.nb_row * self.gap) // self.nb_row
  42. # On cale le plus grand sur le plus petit pour conserver la forme des tuiles et ne pas dépasser d'un côté
  43. if height < 0.86 * width:
  44. width = height // 0.86
  45. else:
  46. height = round(width * 0.86)
  47. return (width, height)
  48. def position_of_tiles(self, center: tuple) -> list:
  49. """Renvoie la position du centre de toutes les tuiles du monde en fonction des paramètres donnés"""
  50. # Le nombre de colonnes doit être impair
  51. if self.nb_col % 2 != 0:
  52. self.nb_col += 1
  53. print("Il y a déjà un oeuf")
  54. res = []
  55. x = center[0]
  56. # Si le nombre de lignes est pair
  57. if self.nb_row % 2 == 0:
  58. # Colonne centrale
  59. res += self.position_of_odd_columns(self.nb_row - 1, x)
  60. # Colonnes paires de droite
  61. x += (self.tile_width * 3) // 4 + self.gap
  62. res += self.position_of_even_columns(self.nb_row, x)
  63. for i in range(self.nb_col // 4 - 1):
  64. x += (self.tile_width * 3) // 2 + 2 * self.gap
  65. res += self.position_of_even_columns(self.nb_row, x)
  66. # Colonnes paires de gauche
  67. x = center[0] - (self.tile_width * 3) // 4 - self.gap
  68. res += self.position_of_even_columns(self.nb_row, x)
  69. for i in range(self.nb_col // 4 - 1):
  70. x -= (self.tile_width * 3) // 2 + 2 * self.gap
  71. res += self.position_of_even_columns(self.nb_row, x)
  72. # Colonnes impaires de droite
  73. x = center[0]
  74. for i in range(self.nb_col // 4):
  75. x += (self.tile_width * 3) // 2 + 2 * self.gap
  76. res += self.position_of_odd_columns(self.nb_row - 1, x)
  77. # Colonnes impaires de gauche
  78. x = center[0]
  79. for i in range(self.nb_col // 4):
  80. x -= (self.tile_width * 3) // 2 + 2 * self.gap
  81. res += self.position_of_odd_columns(self.nb_row - 1, x)
  82. # Si le nombre de lignes est impair
  83. else:
  84. # Colonne centrale
  85. res += self.position_of_odd_columns(self.nb_row, x)
  86. # Colonnes paires de droite
  87. x += (self.tile_width * 3) // 4 + self.gap
  88. res += self.position_of_even_columns(self.nb_row - 1, x)
  89. for i in range(self.nb_col // 4 - 1):
  90. x += (self.tile_width * 3) // 2 + 2 * self.gap
  91. res += self.position_of_even_columns(self.nb_row - 1, x)
  92. # Colonnes paires de gauche
  93. x = center[0] - (self.tile_width * 3) // 4 - self.gap
  94. res += self.position_of_even_columns(self.nb_row - 1, x)
  95. for i in range(self.nb_col // 4 - 1):
  96. x -= (self.tile_width * 3) // 2 + 2 * self.gap
  97. res += self.position_of_even_columns(self.nb_row - 1, x)
  98. # Colonnes impaires de droite
  99. x = center[0]
  100. for i in range(self.nb_col // 4 - 1):
  101. x += (self.tile_width * 3) // 2 + 2 * self.gap
  102. res += self.position_of_odd_columns(self.nb_row, x)
  103. # Colonnes impaires de gauche
  104. x = center[0]
  105. for i in range(self.nb_col // 4 - 1):
  106. x -= (self.tile_width * 3) // 2 + 2 * self.gap
  107. res += self.position_of_odd_columns(self.nb_row, x)
  108. return res
  109. def position_of_odd_columns(self, nb_row: int, x: int) -> list:
  110. """Renvoie la position des tuiles dans une colonne au nombre de tuiles impair"""
  111. y = WINDOW_HEIGHT // 2
  112. # Tuile du milieu
  113. res = [{"x": x, "y": y}]
  114. # Tuiles en dessous du milieu
  115. for i in range(nb_row // 2):
  116. y += self.tile_height + self.gap
  117. res.append({"x": x, "y": y})
  118. y = WINDOW_HEIGHT // 2
  119. # Tuiles en dessous du milieu
  120. for i in range(nb_row // 2):
  121. y -= self.tile_height + self.gap
  122. res.append({"x": x, "y": y})
  123. return res
  124. def position_of_even_columns(self, nb_row: int, x: int) -> list:
  125. """Renvoie la position des tuiles dans une colonne au nombre de tuiles pair"""
  126. res = []
  127. # Tuiles du bas
  128. y = WINDOW_HEIGHT // 2 + self.gap // 2 + self.tile_height // 2
  129. res.append({"x": x, "y": y})
  130. for i in range(nb_row // 2 - 1):
  131. y += self.tile_height + self.gap
  132. res.append({"x": x, "y": y})
  133. # Tuiles du haut
  134. y = WINDOW_HEIGHT // 2 - self.gap // 2 - self.tile_height // 2
  135. res.append({"x": x, "y": y})
  136. for i in range(nb_row // 2 - 1):
  137. y -= self.tile_height + self.gap
  138. res.append({"x": x, "y": y})
  139. return res
  140. def spawn_new_seed(self):
  141. """Place aléatoirement une nouvelle graine dans le monde"""
  142. tile = choice(self.tiles_list[1:])
  143. while tile.tiletype == "seed":
  144. tile = choice(self.tiles_list[1:])
  145. tile.tiletype = "seed"
  146. def egg_life(self):
  147. """Gère l'oeuf"""
  148. if self.egg == 0:
  149. self.egg = 1
  150. def border_tiles(self, tiles_list: list) -> list:
  151. """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"""
  152. res = []
  153. for tuile in tiles_list:
  154. if tuile.y == self.top_border or tuile.y == self.bottom_border:
  155. res.append(tuile)
  156. elif tuile.x == self.left_border or tuile.x == self.right_border:
  157. res.append(tuile) #######################A EFFACER ####################################
  158. return res
  159. def random_border_tile(self, border_tiles_list: list) -> list:
  160. """Renvoie une tuile aléatoire du bord de la map"""
  161. res = choice(border_tiles_list)
  162. return res