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


import random
import pygame,pgzrun
from pgzero.builtins import Actor, animate
from pgzero import game

# ИСПОЛЬЗУЕМ PYGAME ТОЛЬКО ДЛЯ ИЗОБРАЖЕНИЙ
pygame.init()
screen = pygame.display.set_mode((800, 600))
# Загружаем изображения через pygame и конвертируем для pgzero
player_img = pygame.image.load('player.webp')  # создайте этот файл или используйте заглушку
platform_img = pygame.image.load('platform.png')
# Конвертируем в формат, понятный pgzero (через Surface)
player_surface = pygame.surfarray.array3d(player_img)  # если нужно доп. преобразование

# НАСТРОЙКИ ИГРЫ
WIDTH = 800
HEIGHT = 600
GRAVITY = 0.8
JUMP_STRENGTH = -12
PLAYER_SPEED = 5

# ПЕРЕМЕННЫЕ ИГРЫ
player = Actor('player', (100, HEIGHT-100))
player.vy = 0
player.on_ground = False

platforms = []
score = 0
level = 1
camera_x = 0

# ФУНКЦИИ ГЕНЕРАЦИИ УРОВНЕЙ
def generate_level(level_num):
    """Рандомная генерация платформ"""
    new_platforms = []
    # Стартовая платформа
    new_platforms.append(Actor('platform', (WIDTH//2, HEIGHT-50)))
    
    platform_count = 8 + level_num  # больше уровней - больше платформ
    last_x = WIDTH//2
    
    for i in range(platform_count):
        # Случайное расстояние между платформами
        gap_x = random.randint(150, 300)
        new_x = last_x + gap_x
        
        # Случайная высота (разброс от -120 до +80 пикселей)
        y_offset = random.randint(-120, 80)
        new_y = HEIGHT - 100 + y_offset
        new_y = max(50, min(HEIGHT-50, new_y))  # ограничение по экрану
        
        platform = Actor('platform', (new_x, new_y))
        new_platforms.append(platform)
        last_x = new_x
    
    return new_platforms

# ИНИЦИАЛИЗАЦИЯ
platforms = generate_level(level)

def update():
    """Обновление игры (60 раз в секунду)"""
    global score, level, camera_x,platforms
    
    # Управление персонажем
    if keyboard.left:
        player.x -= PLAYER_SPEED
    if keyboard.right:
        player.x += PLAYER_SPEED
    
    # Прыжок
    if keyboard.space and player.on_ground:
        player.vy = JUMP_STRENGTH
        player.on_ground = False
    
    # Гравитация
    player.vy += GRAVITY
    player.y += player.vy
    
    # Коллизия с платформами
    player.on_ground = False
    for platform in platforms:
        if player.colliderect(platform) and player.vy > 0:
            if player.bottom > platform.top and player.bottom < platform.bottom:
                player.bottom = platform.top
                player.vy = 0
                player.on_ground = True
    
    # Проверка падения
    if player.y > HEIGHT:
        game_over()
    
    # Сдвиг камеры
    if player.x > WIDTH * 0.7:
        camera_x = player.x - WIDTH * 0.7
        player.x = WIDTH * 0.7
    
    # Генерация новых платформ и удаление старых
    # Удаляем платформы, которые остались далеко слева
    platforms = [p for p in platforms if p.x + p.width > camera_x - 200]
    
    # Добавляем новые платформы
    if len(platforms) < 10:
        last_platform = platforms[-1]
        new_x = last_platform.x + random.randint(200, 400)
        new_y = last_platform.y + random.randint(-100, 100)
        new_y = max(50, min(HEIGHT-50, new_y))
        new_platform = Actor('platform', (new_x, new_y))
        platforms.append(new_platform)
    
    # Подсчёт очков (за пройденные платформы)
    for platform in platforms:
        if platform.x + platform.width < player.x - 50 and not hasattr(platform, 'scored'):
            score += 10
            platform.scored = True
    
    # Переход на следующий уровень
    if score > level * 100:
        level += 1
        # Рандомная регенерация уровня
        platforms = generate_level(level)
        player.x = WIDTH//4
        player.y = HEIGHT-100
        player.vy = 0

def draw():
    """Отрисовка игры"""
    screen.clear()
    screen.fill((135, 206, 235))  # голубое небо
    
    # Рисуем платформы с учётом камеры
    for platform in platforms:
        platform.draw()
    
    # Рисуем игрока
    player.draw()
    
    # Интерфейс
    screen.draw.text(f"Score: {score}", (10, 10), fontsize=30, color="white")
    screen.draw.text(f"Level: {level}", (10, 50), fontsize=30, color="white")
    
    # Инструкция
    screen.draw.text("← → to move, SPACE to jump", (WIDTH//2-150, HEIGHT-30), 
                     fontsize=20, color="white")

def game_over():
    """Конец игры"""
    print(f"Game Over! Score: {score}")
    exit()

# ЗАГРУЗКА ИЗОБРАЖЕНИЙ ЧЕРЕЗ PYGAME (ЕСЛИ НЕТ ФАЙЛОВ)
# Создаём простые изображения программно, если нет своих файлов
def create_dummy_images():
    """Создаёт заглушки для изображений, если их нет"""
    try:
        # Проверяем, есть ли файлы
        open('player.png', 'rb')
        open('platform.png', 'rb')
    except FileNotFoundError:
        print("Создаю временные изображения...")
        # Создаём через pygame
        surf_player = pygame.Surface((40, 40))
        surf_player.fill((255, 0, 0))  # красный квадрат
        pygame.draw.circle(surf_player, (255, 255, 0), (20, 20), 18)
        pygame.image.save(surf_player, 'player.png')
        
        surf_platform = pygame.Surface((80, 20))
        surf_platform.fill((139, 69, 19))  # коричневый
        pygame.draw.rect(surf_platform, (101, 67, 33), (0, 0, 80, 20), 2)
        pygame.image.save(surf_platform, 'platform.png')

# Запуск игры
if __name__ == "__main__":
    create_dummy_images()
    
    # Регистрируем изображения для pgzero
    game.images = {}  # небольшой хак для загрузки
    # Нормальный способ: pgzero сам подхватит файлы из папки images/
    
    # Запуск игры (требуется установка pgzero: pip install pgzero)
    pgzrun.go()