|
|
@@ -1,3 +1,5 @@
|
|
|
+
|
|
|
+import random
|
|
|
import pygame
|
|
|
|
|
|
# pygame setup
|
|
|
@@ -10,12 +12,75 @@ dt = 0
|
|
|
force_coef = 20
|
|
|
player_applied_force = pygame.Vector2(0, 0)
|
|
|
player_mass = 1
|
|
|
-player_pos = pygame.Vector2(screen.get_width() / 2, screen.get_height() / 2)
|
|
|
+
|
|
|
+
|
|
|
+# Helper to find all empty cells in the maze
|
|
|
+def get_empty_cells(grid):
|
|
|
+ empty = []
|
|
|
+ for y, row in enumerate(grid):
|
|
|
+ for x, cell in enumerate(row):
|
|
|
+ if cell == 0:
|
|
|
+ empty.append((x, y))
|
|
|
+ return empty
|
|
|
+
|
|
|
+# Set player_pos to a random empty cell
|
|
|
+def get_cell_center(x, y, cell_size=80):
|
|
|
+ return pygame.Vector2(x * cell_size + cell_size / 2, y * cell_size + cell_size / 2)
|
|
|
+
|
|
|
+from mazelib import Maze
|
|
|
+from mazelib.generate.Prims import Prims
|
|
|
+
|
|
|
+maze_width = 7
|
|
|
+maze_height = 4
|
|
|
+
|
|
|
+m = Maze()
|
|
|
+m.generator = Prims(maze_height, maze_width)
|
|
|
+m.generate()
|
|
|
+maze_grid = m.grid
|
|
|
+
|
|
|
+empty_cells = get_empty_cells(maze_grid)
|
|
|
+spawn_x, spawn_y = random.choice(empty_cells)
|
|
|
+player_pos = get_cell_center(spawn_x, spawn_y)
|
|
|
player_speed = pygame.Vector2(0, 0)
|
|
|
|
|
|
raketa_original = pygame.image.load("raketa.png").convert_alpha()
|
|
|
raketa = pygame.transform.scale(raketa_original, (raketa_original.get_width() // 3, raketa_original.get_height() // 3))
|
|
|
|
|
|
+# Function to get all meteor rectangles for collision detection
|
|
|
+def get_meteor_rects(grid, cell_size=80):
|
|
|
+ meteor_rects = []
|
|
|
+ for y, row in enumerate(grid):
|
|
|
+ for x, cell in enumerate(row):
|
|
|
+ if cell == 1:
|
|
|
+ rect = pygame.Rect(x * cell_size, y * cell_size, cell_size, cell_size)
|
|
|
+ meteor_rects.append(rect)
|
|
|
+ return meteor_rects
|
|
|
+
|
|
|
+from mazelib import Maze
|
|
|
+from mazelib.generate.Prims import Prims
|
|
|
+
|
|
|
+maze_width = 7
|
|
|
+maze_height = 4
|
|
|
+
|
|
|
+m = Maze()
|
|
|
+m.generator = Prims(maze_height, maze_width)
|
|
|
+m.generate()
|
|
|
+maze_grid = m.grid
|
|
|
+
|
|
|
+
|
|
|
+def draw_maze(
|
|
|
+ surface,
|
|
|
+ grid,
|
|
|
+ meteor_img=pygame.image.load("meteor.png").convert_alpha(),
|
|
|
+ cell_size=80,
|
|
|
+):
|
|
|
+ for y, row in enumerate(grid):
|
|
|
+ for x, cell in enumerate(row):
|
|
|
+ if cell == 1:
|
|
|
+ meteor_img = pygame.transform.scale(meteor_img, (cell_size, cell_size))
|
|
|
+ rect = pygame.Rect(x * cell_size, y * cell_size, cell_size, cell_size)
|
|
|
+ surface.blit(meteor_img, rect)
|
|
|
+
|
|
|
|
|
|
def draw_arrow(surface, color, start, end, width=3):
|
|
|
pygame.draw.line(surface, color, start, end, width)
|
|
|
@@ -44,11 +109,8 @@ while running:
|
|
|
angle = player_speed.angle_to(pygame.Vector2(0, -1))
|
|
|
|
|
|
scaled_raketa = rescale_rocket(raketa, player_speed)
|
|
|
-
|
|
|
rotated_raketa = pygame.transform.rotate(scaled_raketa, angle)
|
|
|
-
|
|
|
raketa_rect = rotated_raketa.get_rect(center=player_pos)
|
|
|
- screen.blit(rotated_raketa, raketa_rect)
|
|
|
|
|
|
player_applied_force = pygame.Vector2(0, 0)
|
|
|
|
|
|
@@ -69,6 +131,19 @@ while running:
|
|
|
player_speed += acceleration * dt
|
|
|
player_pos += player_speed * dt
|
|
|
|
|
|
+ # Collision detection
|
|
|
+ meteor_rects = get_meteor_rects(maze_grid)
|
|
|
+ raketa_rect = rotated_raketa.get_rect(center=player_pos)
|
|
|
+ for meteor_rect in meteor_rects:
|
|
|
+ if raketa_rect.colliderect(meteor_rect):
|
|
|
+ # Collision detected: reset position and speed
|
|
|
+ player_speed = pygame.Vector2(0, 0)
|
|
|
+ break
|
|
|
+
|
|
|
+ # Draw rocket
|
|
|
+ raketa_rect = rotated_raketa.get_rect(center=player_pos)
|
|
|
+ screen.blit(rotated_raketa, raketa_rect)
|
|
|
+
|
|
|
# Draw force arrow
|
|
|
if player_applied_force.length() > 0:
|
|
|
arrow_end = player_pos + player_applied_force * 2
|
|
|
@@ -79,6 +154,8 @@ while running:
|
|
|
arrow_end = player_pos + player_speed * 2
|
|
|
draw_arrow(screen, "cyan", player_pos, arrow_end)
|
|
|
|
|
|
+ draw_maze(screen, maze_grid)
|
|
|
+
|
|
|
pygame.display.flip()
|
|
|
dt = clock.tick(60) / 1000
|
|
|
|