import random import pygame from utils import get_empty_cells, get_cell_center, draw_arrow from maze import generate_maze, get_meteor_rects, draw_maze from rocket import load_rocket, rescale_rocket # --- pygame setup --- pygame.init() screen = pygame.display.set_mode((1280, 720)) clock = pygame.time.Clock() running = True dt = 0 # --- physics constants --- force_coef = 20 player_mass = 1 # --- maze setup --- maze_grid = generate_maze(width=7, height=4) # --- player spawn --- 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) player_applied_force = pygame.Vector2(0, 0) # --- assets --- raketa = load_rocket() meteor_img = pygame.image.load("meteor.png").convert_alpha() meteor_scaled = pygame.transform.scale(meteor_img, (80, 80)) meteor_mask = pygame.mask.from_surface(meteor_scaled) # --- game loop --- while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False screen.fill("purple") # Input player_applied_force = pygame.Vector2(0, 0) keys = pygame.key.get_pressed() if keys[pygame.K_w]: player_applied_force.y -= force_coef if keys[pygame.K_s]: player_applied_force.y += force_coef if keys[pygame.K_a]: player_applied_force.x -= force_coef if keys[pygame.K_d]: player_applied_force.x += force_coef if player_applied_force.length() > 0: player_applied_force.scale_to_length(force_coef) # Physics acceleration = player_applied_force / player_mass player_speed += acceleration * dt player_pos += player_speed * dt # Collision detection scaled_raketa = rescale_rocket(raketa, player_speed) angle = player_speed.angle_to(pygame.Vector2(0, -1)) rotated_raketa = pygame.transform.rotate(scaled_raketa, angle) raketa_rect = rotated_raketa.get_rect(center=player_pos) raketa_mask = pygame.mask.from_surface(rotated_raketa) for meteor_rect in get_meteor_rects(maze_grid): if raketa_rect.colliderect(meteor_rect): offset = (meteor_rect.x - raketa_rect.x, meteor_rect.y - raketa_rect.y) if raketa_mask.overlap(meteor_mask, offset): player_speed = pygame.Vector2(0, 0) break # Draw screen.blit(rotated_raketa, raketa_rect) if player_applied_force.length() > 0: draw_arrow(screen, "yellow", player_pos, player_pos + player_applied_force * 2) if player_speed.length() > 0: draw_arrow(screen, "cyan", player_pos, player_pos + player_speed * 2) draw_maze(screen, maze_grid, meteor_img) pygame.display.flip() dt = clock.tick(60) / 1000 pygame.quit()