| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- import random
- import pygame
- # pygame setup
- pygame.init()
- screen = pygame.display.set_mode((1280, 720))
- clock = pygame.time.Clock()
- running = True
- dt = 0
- force_coef = 20
- player_applied_force = pygame.Vector2(0, 0)
- player_mass = 1
- # 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)
- direction = (end - start).normalize()
- arrow_size = 10
- perpendicular = pygame.Vector2(-direction.y, direction.x)
- point1 = end - direction * arrow_size + perpendicular * arrow_size / 2
- point2 = end - direction * arrow_size - perpendicular * arrow_size / 2
- pygame.draw.polygon(surface, color, [end, point1, point2])
- def rescale_rocket(raketa, speed):
- scale_factor = 1 + player_speed.length() * 0.01
- raketa_w, raketa_h = raketa.get_size()
- raketa_w *= scale_factor
- raketa_h /= scale_factor
- scaled_raketa = pygame.transform.scale(raketa, (raketa_h, raketa_w))
- return scaled_raketa
- while running:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- running = False
- screen.fill("purple")
- 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)
- 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)
- acceleration = player_applied_force / player_mass
- 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
- draw_arrow(screen, "yellow", player_pos, arrow_end)
- # Draw speed arrow
- if player_speed.length() > 0:
- 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
- pygame.quit()
|