world.py 6.0 KB

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