Загрузка данных
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()