Загрузка данных


import pygame
import random
import math

# --- НАСТРОЙКИ ---
WIDTH, HEIGHT = 1000, 600
FPS = 60

pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("SPACE SURVIVOR")
clock = pygame.time.Clock()

# --- ЦВЕТА ---
WHITE = (255, 255, 255)
BLACK = (10, 10, 20)
RED = (255, 70, 70)
BLUE = (70, 170, 255)
GREEN = (70, 255, 120)
YELLOW = (255, 255, 100)

font = pygame.font.SysFont("Arial", 30)
big_font = pygame.font.SysFont("Arial", 70)

# --- ИГРОК ---
player_x = WIDTH // 2
player_y = HEIGHT // 2
player_speed = 6
player_radius = 20

# --- ПУЛИ ---
bullets = []

# --- ВРАГИ ---
enemies = []

# --- ЭФФЕКТЫ ---
particles = []

score = 0
game_over = False

def spawn_enemy():
    side = random.choice(["top", "bottom", "left", "right"])

    if side == "top":
        x = random.randint(0, WIDTH)
        y = -50
    elif side == "bottom":
        x = random.randint(0, WIDTH)
        y = HEIGHT + 50
    elif side == "left":
        x = -50
        y = random.randint(0, HEIGHT)
    else:
        x = WIDTH + 50
        y = random.randint(0, HEIGHT)

    speed = random.uniform(1.5, 3.5)

    enemies.append({
        "x": x,
        "y": y,
        "speed": speed,
        "size": random.randint(20, 35)
    })

def create_explosion(x, y):
    for _ in range(20):
        particles.append({
            "x": x,
            "y": y,
            "dx": random.uniform(-5, 5),
            "dy": random.uniform(-5, 5),
            "life": random.randint(20, 40),
            "size": random.randint(2, 5)
        })

# --- ЗВЕЗДЫ ---
stars = []
for _ in range(120):
    stars.append([
        random.randint(0, WIDTH),
        random.randint(0, HEIGHT),
        random.randint(1, 3)
    ])

enemy_timer = 0

running = True
while running:
    clock.tick(FPS)

    # --- СОБЫТИЯ ---
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.MOUSEBUTTONDOWN and not game_over:
            mx, my = pygame.mouse.get_pos()

            angle = math.atan2(my - player_y, mx - player_x)

            bullets.append({
                "x": player_x,
                "y": player_y,
                "dx": math.cos(angle) * 12,
                "dy": math.sin(angle) * 12
            })

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_r and game_over:
                bullets.clear()
                enemies.clear()
                particles.clear()
                score = 0
                game_over = False
                player_x = WIDTH // 2
                player_y = HEIGHT // 2

    # --- ДВИЖЕНИЕ ---
    keys = pygame.key.get_pressed()

    if not game_over:
        if keys[pygame.K_w]:
            player_y -= player_speed
        if keys[pygame.K_s]:
            player_y += player_speed
        if keys[pygame.K_a]:
            player_x -= player_speed
        if keys[pygame.K_d]:
            player_x += player_speed

    player_x = max(0, min(WIDTH, player_x))
    player_y = max(0, min(HEIGHT, player_y))

    # --- СПАВН ВРАГОВ ---
    if not game_over:
        enemy_timer += 1

        if enemy_timer >= 35:
            spawn_enemy()
            enemy_timer = 0

    # --- ОБНОВЛЕНИЕ ПУЛЬ ---
    for bullet in bullets[:]:
        bullet["x"] += bullet["dx"]
        bullet["y"] += bullet["dy"]

        if (
            bullet["x"] < 0 or bullet["x"] > WIDTH or
            bullet["y"] < 0 or bullet["y"] > HEIGHT
        ):
            bullets.remove(bullet)

    # --- ОБНОВЛЕНИЕ ВРАГОВ ---
    for enemy in enemies[:]:
        dx = player_x - enemy["x"]
        dy = player_y - enemy["y"]

        dist = math.hypot(dx, dy)

        if dist != 0:
            enemy["x"] += dx / dist * enemy["speed"]
            enemy["y"] += dy / dist * enemy["speed"]

        # Столкновение с игроком
        if dist < enemy["size"] + player_radius:
            game_over = True

        # Попадание пули
        for bullet in bullets[:]:
            bdx = bullet["x"] - enemy["x"]
            bdy = bullet["y"] - enemy["y"]

            if math.hypot(bdx, bdy) < enemy["size"]:
                create_explosion(enemy["x"], enemy["y"])

                if enemy in enemies:
                    enemies.remove(enemy)

                if bullet in bullets:
                    bullets.remove(bullet)

                score += 1
                break

    # --- ЧАСТИЦЫ ---
    for p in particles[:]:
        p["x"] += p["dx"]
        p["y"] += p["dy"]
        p["life"] -= 1

        if p["life"] <= 0:
            particles.remove(p)

    # --- РЕНДЕР ---
    screen.fill(BLACK)

    # Звезды
    for star in stars:
        pygame.draw.circle(screen, WHITE, (star[0], star[1]), star[2])

    # Игрок
    pygame.draw.circle(screen, BLUE, (int(player_x), int(player_y)), player_radius)

    # Пули
    for bullet in bullets:
        pygame.draw.circle(
            screen,
            YELLOW,
            (int(bullet["x"]), int(bullet["y"])),
            5
        )

    # Враги
    for enemy in enemies:
        pygame.draw.circle(
            screen,
            RED,
            (int(enemy["x"]), int(enemy["y"])),
            enemy["size"]
        )

    # Частицы
    for p in particles:
        pygame.draw.circle(
            screen,
            GREEN,
            (int(p["x"]), int(p["y"])),
            p["size"]
        )

    # Счет
    score_text = font.render(f"Score: {score}", True, WHITE)
    screen.blit(score_text, (20, 20))

    # GAME OVER
    if game_over:
        over = big_font.render("GAME OVER", True, RED)
        retry = font.render("Нажми R для рестарта", True, WHITE)

        screen.blit(over, (WIDTH // 2 - 190, HEIGHT // 2 - 80))
        screen.blit(retry, (WIDTH // 2 - 150, HEIGHT // 2 + 10))

    pygame.display.flip()

pygame.quit()