1
0

world.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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. def draw(self):
  19. """Dessine les tuiles du monde"""
  20. for tile in self.tiles_list:
  21. tile.draw()
  22. def random_tile_type(self) -> str:
  23. """Renvoie une chaine de caractère contenant 'green' ou 'seed' avec une probabilité respective de 80% et 20%"""
  24. t_type = ["green"] * 4 + ["seed"]
  25. return choice(t_type)
  26. def create_tiles(self):
  27. """Renvoie une liste avec toutes les tuiles du monde, générées en partie aléatoirement"""
  28. res = []
  29. # Tuile centrale
  30. res.append(Tile(self.pos_list[0]["x"], self.pos_list[0]["y"], self.tile_width, self.tile_height, "green", self.display))
  31. # Toutes les autres
  32. for pos in self.pos_list[1:]:
  33. res.append(Tile(pos["x"], pos["y"], self.tile_width, self.tile_height, self.random_tile_type(), self.display))
  34. return res
  35. def tile_size(self) -> tuple:
  36. """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"""
  37. width = (WINDOW_WIDTH - self.nb_col * self.gap) // self.nb_col
  38. height = (WINDOW_HEIGHT - self.nb_row * self.gap) // self.nb_row
  39. # On cale le plus grand sur le plus petit pour conserver la forme des tuiles et ne pas dépasser d'un côté
  40. if height < 0.86 * width:
  41. width = height // 0.86
  42. else:
  43. height = round(width * 0.86)
  44. return (width, height)
  45. def position_of_tiles(self, center: tuple) -> list:
  46. """Renvoie la position du centre de toutes les tuiles du monde en fonction des paramètres donnés"""
  47. # Le nombre de colonnes doit être impair
  48. if self.nb_col % 2 != 0:
  49. self.nb_col += 1
  50. res = []
  51. x = center[0]
  52. # Si le nombre de lignes est pair
  53. if self.nb_row % 2 == 0:
  54. # Colonne centrale
  55. res += self.position_of_odd_columns(self.nb_row - 1, x)
  56. # Colonnes paires de droite
  57. x += (self.tile_width * 3) // 4 + self.gap
  58. res += self.position_of_even_columns(self.nb_row, x)
  59. for i in range(self.nb_col // 4 - 1):
  60. x += (self.tile_width * 3) // 2 + 2 * self.gap
  61. res += self.position_of_even_columns(self.nb_row, x)
  62. # Colonnes paires de gauche
  63. x = center[0] - (self.tile_width * 3) // 4 - self.gap
  64. res += self.position_of_even_columns(self.nb_row, x)
  65. for i in range(self.nb_col // 4 - 1):
  66. x -= (self.tile_width * 3) // 2 + 2 * self.gap
  67. res += self.position_of_even_columns(self.nb_row, x)
  68. # Colonnes impaires de droite
  69. x = center[0]
  70. for i in range(self.nb_col // 4):
  71. x += (self.tile_width * 3) // 2 + 2 * self.gap
  72. res += self.position_of_odd_columns(self.nb_row - 1, x)
  73. # Colonnes impaires de gauche
  74. x = center[0]
  75. for i in range(self.nb_col // 4):
  76. x -= (self.tile_width * 3) // 2 + 2 * self.gap
  77. res += self.position_of_odd_columns(self.nb_row - 1, x)
  78. # Si le nombre de lignes est impair
  79. else:
  80. # Colonne centrale
  81. res += self.position_of_odd_columns(self.nb_row, x)
  82. # Colonnes paires de droite
  83. x += (self.tile_width * 3) // 4 + self.gap
  84. res += self.position_of_even_columns(self.nb_row - 1, x)
  85. for i in range(self.nb_col // 4 - 1):
  86. x += (self.tile_width * 3) // 2 + 2 * self.gap
  87. res += self.position_of_even_columns(self.nb_row - 1, x)
  88. # Colonnes paires de gauche
  89. x = center[0] - (self.tile_width * 3) // 4 - self.gap
  90. res += self.position_of_even_columns(self.nb_row - 1, x)
  91. for i in range(self.nb_col // 4 - 1):
  92. x -= (self.tile_width * 3) // 2 + 2 * self.gap
  93. res += self.position_of_even_columns(self.nb_row - 1, x)
  94. # Colonnes impaires de droite
  95. x = center[0]
  96. for i in range(self.nb_col // 4 - 1):
  97. x += (self.tile_width * 3) // 2 + 2 * self.gap
  98. res += self.position_of_odd_columns(self.nb_row, x)
  99. # Colonnes impaires de gauche
  100. x = center[0]
  101. for i in range(self.nb_col // 4 - 1):
  102. x -= (self.tile_width * 3) // 2 + 2 * self.gap
  103. res += self.position_of_odd_columns(self.nb_row, x)
  104. return res
  105. def position_of_odd_columns(self, nb_row: int, x: int) -> list:
  106. """Renvoie la position des tuiles dans une colonne au nombre de tuiles impair"""
  107. y = WINDOW_HEIGHT // 2
  108. # Tuile du milieu
  109. res = [{"x": x, "y": y}]
  110. # Tuiles en dessous du milieu
  111. for i in range(nb_row // 2):
  112. y += self.tile_height + self.gap
  113. res.append({"x": x, "y": y})
  114. y = WINDOW_HEIGHT // 2
  115. # Tuiles en dessous du milieu
  116. for i in range(nb_row // 2):
  117. y -= self.tile_height + self.gap
  118. res.append({"x": x, "y": y})
  119. return res
  120. def position_of_even_columns(self, nb_row: int, x: int) -> list:
  121. """Renvoie la position des tuiles dans une colonne au nombre de tuiles pair"""
  122. res = []
  123. # Tuiles du bas
  124. y = WINDOW_HEIGHT // 2 + self.gap // 2 + self.tile_height // 2
  125. res.append({"x": x, "y": y})
  126. for i in range(nb_row // 2 - 1):
  127. y += self.tile_height + self.gap
  128. res.append({"x": x, "y": y})
  129. # Tuiles du haut
  130. y = WINDOW_HEIGHT // 2 - self.gap // 2 - self.tile_height // 2
  131. res.append({"x": x, "y": y})
  132. for i in range(nb_row // 2 - 1):
  133. y -= self.tile_height + self.gap
  134. res.append({"x": x, "y": y})
  135. return res