fork download
  1. # PyGame test de excepciones
  2.  
  3.  
  4. import pygame
  5. import math
  6.  
  7.  
  8. class Motor:
  9. def __init__(self, tam_ventana, jugador, pnjs):
  10. self.__j = jugador
  11. self.__screen = pygame.display.set_mode(tam_ventana)
  12. self.__clock = pygame.time.Clock()
  13. self.__pnjs = pnjs
  14.  
  15. if pygame.font:
  16. self.__font = pygame.font.SysFont(None, 40)
  17. ...
  18. ...
  19.  
  20.  
  21. def start(self):
  22. self.__dt = 0.0
  23. running = True
  24.  
  25. while running:
  26. for event in pygame.event.get():
  27. if event.type == pygame.QUIT:
  28. running = False
  29. ...
  30. ...
  31.  
  32. self.__screen.fill("beige")
  33.  
  34. if self.__j.vidas <= 0:
  35. self.__escribe("Has muerto.")
  36. else:
  37. self.__mostrar_frame_juego()
  38. ...
  39.  
  40. pygame.display.flip()
  41. self.__dt = self.__clock.tick(60) / 1000
  42. ...
  43. ...
  44.  
  45. def __escribe(self, msg):
  46. if pygame.font:
  47. text_surface = self.__font.render(msg, False, (0, 0, 0))
  48. self.__screen.blit(text_surface, (0,0))
  49. ...
  50. ...
  51.  
  52. def __mostrar_frame_juego(self):
  53. scr = self.__screen
  54.  
  55. # Mostrar personajes
  56. pygame.draw.circle(scr, "blue", self.__j.pos, self.__j.tam, self.__j.tam)
  57. for pnj in self.__pnjs:
  58. pygame.draw.rect(scr, "red",
  59. pygame.Rect(pnj.pos.x, pnj.pos.y, pnj.tam, pnj.tam),
  60. pnj.tam)
  61. ...
  62.  
  63. # Info del juego
  64. self.__escribe(f"Vidas: {self.__j.vidas}")
  65.  
  66. # Movimiento
  67. self.__j.mueve(self.__dt, self.__pnjs, pygame.key.get_pressed())
  68. for pnj in self.__pnjs:
  69. pnj.mueve(self.__dt, self.__j)
  70. ...
  71. ...
  72. ...
  73.  
  74.  
  75. class Personaje:
  76. def __init__(self, maxX, maxY, posX, posY, tam):
  77. self.__tam_ventana = (maxX, maxY)
  78. self.__pos = pygame.Vector2(posX, posY)
  79. self.__tam = tam
  80.  
  81. @property
  82. def pos(self):
  83. return self.__pos
  84. ...
  85.  
  86. @property
  87. def tam(self):
  88. return self.__tam
  89. ...
  90.  
  91. @property
  92. def tam_ventana(self):
  93. return self.__tam_ventana
  94. ...
  95.  
  96. def distancia_a(self, otro):
  97. toret = self.__tam_ventana[0] * 2
  98.  
  99. if isinstance(otro, Personaje):
  100. mix = self.pos.x + (self.tam / 2)
  101. miy = self.pos.y + (self.tam / 2)
  102. sux = otro.pos.x + (otro.tam / 2)
  103. suy = otro.pos.y + (otro.tam / 2)
  104. xs = (mix - sux) ** 2
  105. ys = (miy - suy) ** 2
  106. toret = math.sqrt(xs + ys)
  107. ...
  108.  
  109. return toret
  110. ...
  111.  
  112. def hay_colision_con(self, otro):
  113. return self.distancia_a(otro) < (self.tam * 2)
  114. ...
  115. ...
  116.  
  117. class PersonajeJugador(Personaje):
  118. def __init__(self, maxX, maxY, posX, posY, tam):
  119. super().__init__(maxX, maxY, posX, posY, tam)
  120. self.__vidas = 3
  121. ...
  122.  
  123. @property
  124. def vidas(self):
  125. return self.__vidas
  126. ...
  127.  
  128. def pierde_vida(self):
  129. self.__vidas -= 1
  130. print(f"\aVidas jugador: {self.vidas}")
  131. ...
  132.  
  133. def mueve(self, dt, pnjs, keys):
  134. ancho = self.tam_ventana[0]
  135. alto = self.tam_ventana[1]
  136.  
  137. try:
  138. if keys[pygame.K_w]:
  139. self.pos.y -= 300 * dt
  140. if self.pos.y < 0:
  141. raise ValueError(('y', self.pos.y))
  142. if keys[pygame.K_s]:
  143. self.pos.y += 300 * dt
  144. if self.pos.y >= alto:
  145. raise ValueError(('y', self.pos.y))
  146. if keys[pygame.K_a]:
  147. self.pos.x -= 300 * dt
  148. if self.pos.x < 0:
  149. raise ValueError(('x', self.pos.x))
  150. if keys[pygame.K_d]:
  151. self.pos.x += 300 * dt
  152. if self.pos.x >= ancho:
  153. raise ValueError(('x', self.pos.x))
  154.  
  155. for pnj in pnjs:
  156. if self.hay_colision_con(pnj):
  157. raise ValueError((pnj,))
  158. ...
  159. ...
  160. except ValueError as exc:
  161. self.__corrige_pos(exc.args[0])
  162. ...
  163. ...
  164.  
  165. def __corrige_pos(self, datos):
  166. ancho = self.tam_ventana[0]
  167. alto = self.tam_ventana[1]
  168.  
  169. if datos[0] == 'x':
  170. if datos[1] < 0:
  171. self.pos.x = ancho
  172. elif datos[1] >= ancho:
  173. self.pos.x = 0
  174. ...
  175. elif datos[0] == 'y':
  176. if datos[1] < 0:
  177. self.pos.y = alto
  178. elif datos[1] >= alto:
  179. self.pos.y = 0
  180. ...
  181. else:
  182. # Colision
  183. self.pierde_vida()
  184. self.pos.y = datos[0].pos.y + 40
  185. self.pos.x = datos[0].pos.x + 40
  186. ...
  187. ...
  188. ...
  189.  
  190.  
  191. class PersonajeNoJugador(Personaje):
  192. def __init__(self, maxX, maxY, posX, posY, tam):
  193. super().__init__(maxX, maxY, posX, posY, tam)
  194. ...
  195.  
  196. def mueve(self, dt, jugador):
  197. paso = 50
  198. nuevo_x = paso * dt
  199. nuevo_y = paso * dt
  200.  
  201. if self.pos.x > jugador.pos.x:
  202. nuevo_x *= -1
  203. ...
  204.  
  205. if self.pos.y > jugador.pos.y:
  206. nuevo_y *= -1
  207. ...
  208.  
  209. self.pos.x += nuevo_x
  210. self.pos.y += nuevo_y
  211. ...
  212. ...
  213.  
  214.  
  215. if __name__ == "__main__":
  216. tam_ventana = (800, 600)
  217. pygame.init()
  218.  
  219. try:
  220. pygame.font.init()
  221. except (ImportError, NotImplementedError) as exc:
  222. # En ocasiones, no se inicializa font correctamente
  223. print(f"Font module not found: {exc}")
  224. pygame.font = None
  225.  
  226. j = PersonajeJugador(tam_ventana[0], tam_ventana[1],
  227. tam_ventana[0] / 2, tam_ventana[1] / 2, 20)
  228. pnjs = [
  229. PersonajeNoJugador(tam_ventana[0], tam_ventana[1], 100, 100, 20),
  230. PersonajeNoJugador(tam_ventana[0], tam_ventana[1], 512, 512, 20),
  231. PersonajeNoJugador(tam_ventana[0], tam_ventana[1], 256, 300, 20),
  232. PersonajeNoJugador(tam_ventana[0], tam_ventana[1], 45, 45, 20)
  233. ]
  234.  
  235. m = Motor(tam_ventana, j, pnjs)
  236. m.start()
  237. pygame.quit()
  238. ...
  239.  
  240.  
Runtime error #stdin #stdout #stderr 1.26s 37076KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Traceback (most recent call last):
  File "./prog.py", line 4, in <module>
ModuleNotFoundError: No module named 'pygame'