main.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import random
  2. import pygame
  3. # pygame setup
  4. pygame.init()
  5. screen = pygame.display.set_mode((1280, 720))
  6. clock = pygame.time.Clock()
  7. running = True
  8. dt = 0
  9. force_coef = 20
  10. player_applied_force = pygame.Vector2(0, 0)
  11. player_mass = 1
  12. # Helper to find all empty cells in the maze
  13. def get_empty_cells(grid):
  14. empty = []
  15. for y, row in enumerate(grid):
  16. for x, cell in enumerate(row):
  17. if cell == 0:
  18. empty.append((x, y))
  19. return empty
  20. # Set player_pos to a random empty cell
  21. def get_cell_center(x, y, cell_size=80):
  22. return pygame.Vector2(x * cell_size + cell_size / 2, y * cell_size + cell_size / 2)
  23. from mazelib import Maze
  24. from mazelib.generate.Prims import Prims
  25. maze_width = 7
  26. maze_height = 4
  27. m = Maze()
  28. m.generator = Prims(maze_height, maze_width)
  29. m.generate()
  30. maze_grid = m.grid
  31. empty_cells = get_empty_cells(maze_grid)
  32. spawn_x, spawn_y = random.choice(empty_cells)
  33. player_pos = get_cell_center(spawn_x, spawn_y)
  34. player_speed = pygame.Vector2(0, 0)
  35. raketa_original = pygame.image.load("raketa.png").convert_alpha()
  36. raketa = pygame.transform.scale(raketa_original, (raketa_original.get_width() // 3, raketa_original.get_height() // 3))
  37. # Function to get all meteor rectangles for collision detection
  38. def get_meteor_rects(grid, cell_size=80):
  39. meteor_rects = []
  40. for y, row in enumerate(grid):
  41. for x, cell in enumerate(row):
  42. if cell == 1:
  43. rect = pygame.Rect(x * cell_size, y * cell_size, cell_size, cell_size)
  44. meteor_rects.append(rect)
  45. return meteor_rects
  46. from mazelib import Maze
  47. from mazelib.generate.Prims import Prims
  48. maze_width = 7
  49. maze_height = 4
  50. m = Maze()
  51. m.generator = Prims(maze_height, maze_width)
  52. m.generate()
  53. maze_grid = m.grid
  54. def draw_maze(
  55. surface,
  56. grid,
  57. meteor_img=pygame.image.load("meteor.png").convert_alpha(),
  58. cell_size=80,
  59. ):
  60. for y, row in enumerate(grid):
  61. for x, cell in enumerate(row):
  62. if cell == 1:
  63. meteor_img = pygame.transform.scale(meteor_img, (cell_size, cell_size))
  64. rect = pygame.Rect(x * cell_size, y * cell_size, cell_size, cell_size)
  65. surface.blit(meteor_img, rect)
  66. def draw_arrow(surface, color, start, end, width=3):
  67. pygame.draw.line(surface, color, start, end, width)
  68. direction = (end - start).normalize()
  69. arrow_size = 10
  70. perpendicular = pygame.Vector2(-direction.y, direction.x)
  71. point1 = end - direction * arrow_size + perpendicular * arrow_size / 2
  72. point2 = end - direction * arrow_size - perpendicular * arrow_size / 2
  73. pygame.draw.polygon(surface, color, [end, point1, point2])
  74. def rescale_rocket(raketa, speed):
  75. scale_factor = 1 + player_speed.length() * 0.01
  76. raketa_w, raketa_h = raketa.get_size()
  77. raketa_w *= scale_factor
  78. raketa_h /= scale_factor
  79. scaled_raketa = pygame.transform.scale(raketa, (raketa_h, raketa_w))
  80. return scaled_raketa
  81. while running:
  82. for event in pygame.event.get():
  83. if event.type == pygame.QUIT:
  84. running = False
  85. screen.fill("purple")
  86. angle = player_speed.angle_to(pygame.Vector2(0, -1))
  87. scaled_raketa = rescale_rocket(raketa, player_speed)
  88. rotated_raketa = pygame.transform.rotate(scaled_raketa, angle)
  89. raketa_rect = rotated_raketa.get_rect(center=player_pos)
  90. player_applied_force = pygame.Vector2(0, 0)
  91. keys = pygame.key.get_pressed()
  92. if keys[pygame.K_w]:
  93. player_applied_force.y -= force_coef
  94. if keys[pygame.K_s]:
  95. player_applied_force.y += force_coef
  96. if keys[pygame.K_a]:
  97. player_applied_force.x -= force_coef
  98. if keys[pygame.K_d]:
  99. player_applied_force.x += force_coef
  100. if player_applied_force.length() > 0:
  101. player_applied_force.scale_to_length(force_coef)
  102. acceleration = player_applied_force / player_mass
  103. player_speed += acceleration * dt
  104. player_pos += player_speed * dt
  105. # Collision detection
  106. meteor_rects = get_meteor_rects(maze_grid)
  107. raketa_rect = rotated_raketa.get_rect(center=player_pos)
  108. for meteor_rect in meteor_rects:
  109. if raketa_rect.colliderect(meteor_rect):
  110. # Collision detected: reset position and speed
  111. player_speed = pygame.Vector2(0, 0)
  112. break
  113. # Draw rocket
  114. raketa_rect = rotated_raketa.get_rect(center=player_pos)
  115. screen.blit(rotated_raketa, raketa_rect)
  116. # Draw force arrow
  117. if player_applied_force.length() > 0:
  118. arrow_end = player_pos + player_applied_force * 2
  119. draw_arrow(screen, "yellow", player_pos, arrow_end)
  120. # Draw speed arrow
  121. if player_speed.length() > 0:
  122. arrow_end = player_pos + player_speed * 2
  123. draw_arrow(screen, "cyan", player_pos, arrow_end)
  124. draw_maze(screen, maze_grid)
  125. pygame.display.flip()
  126. dt = clock.tick(60) / 1000
  127. pygame.quit()