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


МУНИЦИПАЛЬНОЕ АВТОНОМНОЕ ОБЩЕОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ МУНИЦИПАЛЬНОГО ОБРАЗОВАНИЯ МУНИЦИПАЛЬНЫЙ ОКРУГ ГОРОД ГОРЯЧИЙ КЛЮЧ КРАСНОДАРСКОГО КРАЯ “СРЕДНЯЯ ОБЩЕОБРАЗОВАТЕЛЬНАЯ ШКОЛА 6 ИМЕНИ ЗАКРУТКИНА ВИТАЛИЯ АЛЕКСАНДРОВИЧА”



Создание собственной компьютерной игры на языке программирования Python с нуля

Работу выполнил: Кондранин
                                                                         Лев Евгеньевич, учащийся
                                                9 “Б” класса

                                                                Руководитель: Обруч
                                                              Татьяна Викторовна





2026
г. Горячий Ключ
СОДЕРЖАНИЕ


Введение……………………………………………………………………...........3
Теоретическая часть. Основы разработки компьютерных игр………………...4 
Практическая часть. Создание игры……………………………………………..6
      Создание и логика спрайтов………………………………………………….6
      Написание программного кода игры………………………………………..8
Заключение……………………………………………………………………….10
Приложения……………………………………………………………………...11




















ВВЕДЕНИЕ


Компьютерные игры сегодня являются одним из самых массовых видов цифрового развлечения. По данным аналитических агентств, игровая индустрия ежегодно приносит доходы, сопоставимые с киноиндустрией и музыкальной индустрией вместе взятыми. Однако за яркой графикой и увлекательным геймплеем стоит сложная техническая работа программистов, дизайнеров и художников.
Целью данного проекта стала разработка собственной двумерной компьютерной игры в жанре платформер - классического жанра, в котором игрок управляет персонажем, преодолевающим препятствия с помощью прыжков и перемещений по платформам. Выбор жанра обусловлен его доступностью для самостоятельной разработки: платформеры не требуют сложной трёхмерной графики, но при этом позволяют реализовать полноценную игровую механику, включающую физику движения, систему столкновений, анимацию персонажа и загрузку уровней.
В качестве инструмента разработки был выбран язык программирования Python и библиотека Pygame. Python отличается простым и понятным синтаксисом, что делает его идеальным для обучения программированию, а Pygame предоставляет готовые инструменты для работы с графикой, звуком и пользовательским вводом, позволяя сосредоточиться на логике игры, а не на низкоуровневых деталях.
Цель проекта - разработать полноценную двумерную компьютерную игру в жанре платформер с системой физики, анимацией персонажа, загружаемыми уровнями и игровыми препятствиями.
Задачи проекта:
1.	Изучить теоретические основы разработки компьютерных игр: жанры, базовые принципы геймдизайна, технологии создания.
2.	Разработать визуальную составляющую игры: создать спрайты персонажа, текстуры стен и элементы окружения.
3.	Реализовать многокадровую анимацию персонажа.
4.	Написать программный код игры, включающий физику движения, систему столкновений, обработку пользовательского ввода и загрузку уровней.
5.	Протестировать игру и устранить выявленные ошибки (программисты называют этот процесс дебаг).


ТЕОРЕТИЧЕСКАЯ ЧАСТЬ. ОСНОВЫ РАЗРАБОТКИ КОМПЬЮТЕРНЫХ ИГР


Что такое компьютерная игра?
Компьютерная игра - это интерактивная программа, которая преобразует пользовательский ввод (нажатия клавиш, движения мыши, иногда поступающие в микрофон звуки) в изменения на экране по определённым правилам. Игра предполагает активное участие человека, который принимает решения и влияет на развитие событий.
Игра обычно строятся на трёх ключевых компонентах:
•	Геймплей - правила и механики, определяющие, что делает игрок и какие действия доступны.
•	Графика - визуальное оформление: персонажи, окружение, эффекты.
•	Звук - музыкальное сопровождение и звуковые эффекты, создающие атмосферу.

Какие бывают жанры компьютерных игр?
Компьютерные игры делятся на жанры по типу своего геймплея. Самые основные жанры игр:
1.	Шутеры - игры, в которых основной механикой является стрельба.
2.	RPG (ролевые игры) — игры с развитием персонажа, прокачкой навыков и сюжетом.
3.	Стратегии - игры, требующие планирования и управления ресурсами.
4.	Платформеры - игры, в которых игрок управляет персонажем, перемещающимся по платформам и преодолевающим препятствия с помощью прыжков. Именно этого жанра я создам игру.
Платформеры появились в 1980-х годах (игры Super Mario Bros., Sonic the Hedgehog) и остаются популярными до сих пор благодаря простым правилам и высокой реиграбельности (реиграбельность - характеристика игры, означающая, что в игру можно играть много раз, и она не надоест).

Технологии и инструменты для разработки игр
Современные игры создаются с помощью игровых движков — специализированных программных сред, которые берут на себя рутинные задачи: отрисовку графики, обработку физики, воспроизведение звука, управление сценами. Примеры движков: Unity, Unreal Engine, Godot. Движки нужны для того, чтобы каждый раз не “изобретать велосипед” – не повторять из раза в раз то, что люди давно уже создали.
Начинающий разработчики чаще используют более простые инструменты. Библиотека (библиотека в контексте программирования означает хранилище методов и функций, обычно направленных на определенную задачу).
Pygame для языка программирования Python предоставляет базовые возможности для создания 2D-игр: работу с изображениями и спрайтами, обработку событий клавиатуры и мыши, управление временем и кадрами. Библиотеку Pygame нельзя назвать полноценным движком, но она позволяет реализовать все необходимые механики, что делает его отличным выбором для обучения.

Основные понятия в сфере игр
Спрайт - двумерное изображение, используемое в игре для представления персонажа, объекта или элемента интерфейса. В отличие от статичной картинки, спрайт может перемещаться по экрану, изменяться и взаимодействовать с другими объектами.
Хитбокс (от английского hit box – “ударная рамка”) – Невидимый для игрока прямоугольник, который используется для проверки столкновений разных объектов друг с другом. Хитбокс обычно равен или чуть меньше спрайта.
Игровой цикл - бесконечный цикл (он закончится только тогда, когда пользователь выйдет из игры), внутри которого происходит вся работа игры: обработка ввода (нажатия клавиш, движение и клики мышки), обновление состояния объектов, проверка столкновений, отрисовка кадра. Один проход цикла - один кадр. Языки программирования, основанные на строгом порядке выполнения строк кода (строка не сможет начать работу, пока не закончит свою работу предыдущая строка), обычно всегда нуждаются в игровом цикле. Python – один из таких языков.
FPS (frames per second) - количество кадров в секунду. Для плавной картинки достаточно 60 FPS.







ПРАКТИЧЕСКАЯ ЧАСТЬ. СОЗДАНИЕ ИГРЫ


СОЗДАНИЕ И ЛОГИКА СПРАЙТОВ

Создание спрайтов
Для создания спрайтов я использовал программу Pixel Studio на телефоне. В ней я нарисовал спрайты для игрока и стен в разрешении 16*16 (позже в самой программе они будут увеличены до размера 32*32). Для создания ощущения “живого” персонажа недостаточно одного статичного изображения – для этого необходима анимация. Анимация в 2D-играх строится на принципе смены кадров: за определённый промежуток времени на экране последовательно отображаются разные изображения, создавая иллюзию движения.
В разработанной игре персонаж имеет четыре состояния:
1.	idle (покой) - два кадра, персонаж слегка дышит, когда стоит на месте
2.	walk (ходьба) - два кадра, чередующиеся при движении, чтобы создать видимость движения ног;
3.	jump (прыжок) - один кадр, персонаж движется вверх после прыжка;
4.	fall (падение) - один кадр, персонаж падает.

Программная составляющая логики спрайтов
Каждое состояние представлено спрайтами для двух направлений: вправо (0) и влево (1). Спрайт для левого направления получается отражением спрайта для правого по горизонтали с помощью функции pg.transform.flip(). Такой подход экономит время и дисковое пространство: вместо рисования отдельных спрайтов для каждого направления достаточно иметь один набор и с помощью кода его отражать.
Все спрайты хранятся в словаре player_dict (словарь - объект, хранящий в себе ключ и значение. Если дать ему ключ, он отдаст значение), организованном по принципу: состояние - направление - список кадров. Это позволяет легко получить нужный кадр, зная текущее состояние персонажа и направление его движения.
Смена кадров происходит в методе update_animation() класса Player. Там используется таймер anim_timer, который увеличивается каждый кадр игры. Когда таймер достигает значения anim_speed (15 кадров), происходит переключение на следующий кадр. Это обеспечивает циклическую анимацию: после последнего кадра снова показывается первый.
Спрайты для стен и шипов
Игровой мир состоит из блоков размером 32×32 пикселя. Для создания эстетичного и цельного уровня недостаточно одной текстуры стены — нужны различные варианты для разных ситуаций: прямые участки, углы, внутренние углы, заполнение внутренних областей. И в процессе рисования спрайта может возникнуть проблема: если рядом друг с другом поставить два спрайта: например, спрайт для прямой стены и спрайт для угла стены, переход между ними может показаться очень резким и бросаться в глаза. Для решения этой проблемы нужно учесть одну важную вещь: если спрайты одного предмета будут касаться, нужно рисовать их таким образом, чтобы граница между ними была плавной и незаметной.
В проекте используются несколько текстур для стен:
•	Прямая стена (“wall.png”) - базовая текстура, которая поворачивается на 0°, 90°, 180° и 270° для создания горизонтальных и вертикальных участков.
•	Наружный угол (“corner_wall.png”) - используется на внешних углах конструкций, поворачивается четырьмя способами.
•	Внутренний угол (“inner_corner_wall.png”) - заполняет внутренние углы, где две стены соединяются под прямым углом изнутри.
•	Пустая стена (“empty_wall.png”) - сплошная текстура для заполнения внутренних областей стен.
Все текстуры при размещении рядом образуют бесшовную картинку. Например, горизонтальная стена плавно переходит в наружный угол, а тот, в свою очередь, соединяется с вертикальной стеной. Внутренние углы корректно заполняют пространство между перпендикулярными стенами, не оставляя пустот и выделяющихся участков.
Также в игре присутствуют шипы - опасные объекты, которые возвращают персонажа на старт при касании. Шипы имеют высоту 16 пикселей (половину клетки) и могут быть направлены вверх или вниз.
Чтение программой карты
Для удобного создания уровней была разработана система, в которой каждый игровой объект кодируется символом. Уровень записывается в обычный текстовый файл (“level_map.txt”), где каждая строка - это ряд клеток, а каждый символ — тип объекта.:
1.	• - пустое пространство:
2.	S - стартовая позиция персонажа;
3.	F — финишная зона;
4.	▀, ▌, ▄, ▐ - прямые стены (вверх, вправо, вниз, влево);
5.	█ - заполнение внутренней области;
6.	▜, ▛, ▙, ▟ - наружные углы
7.	▝, ▘, ▖, ▗ - внутренние углы
8.	▲, ▼ - шипы (вверх, вниз).
Использование псевдографических символов, отражающих суть предмета, за который они отвечают, из кодировки Unicode позволяет визуально представить уровень прямо в текстовом файле, что значительно упрощает процесс редактирования и тестирования, делает его быстрее и приятнее

НАПИСАНИЕ ПРОГРАММНОГО КОДА ИГРЫ

Инициализация библиотеки и спрайтов
Программа начинается с импорта библиотеки Pygame (import pygame as pg) и инициализации игрового окна размером 1280×640 пикселей. Для удобства работы с изображениями создана функция get_img(), содержащая в себе много встроенных методов Pygame для работы с изображениями. Она нужна для того, чтобы значительно сократить код и сделать его более приятным для чтения. Она загружает в код спрайты Sprites, масштабирует его до 32×32 пикселей и при необходимости отражает по горизонтали или вертикали.
Все спрайты загружаются в начале программы и сохраняются в глобальных переменных, а позже помещается в словарь player_dict. Карта уровня читается из текстового файла построчно, каждая строка превращается в список символов. Затем программа проходит по каждому символу и создаёт соответствующий игровой объект: стену определённого вида, шип, стартовую точку или финишную зону. Все объекты позиционируются по сетке с шагом 32 пикселя.
Класс Player, игровой персонаж
Класс Player является центральным элементом игры. Именно в нём прописаны все функции, отвечающие за движение, столкновения и физические параметры. Он содержит:
•	Физические параметры: вертикальная и горизонтальная скорость (vel_y, vel_x), сила гравитации (gravity = 0.5), хитбокс размером 24*32 пикселей. Размер хитбокса меньше 32*32 обусловлен тем, что несмотря на разрешение спрайта, фактически он немного уже. Такойе исключение есть только для самого игрока.
•	Состояния: направление движения (direction), флаг стояния на земле (standing), количество оставшихся прыжков (jumps_left).
•	Анимационные переменные: таймер, текущий кадр, скорость анимации.
Метод jump(power) реализует двойной прыжок: первый прыжок выполняется с земли с силой −8, второй (в воздухе) - с силой -7. Приземление сбрасывает счётчик прыжков до двух.
Метод collision_move_update(solids) — самый сложный метод этого класса. Он обновляет позицию персонажа и разрешает столкновения с твёрдыми объектами. Движение по вертикали и горизонтали обрабатывается отдельно, что предотвращает застревание персонажа в углах, обычно являющееся частой ошибкой начинающих программистов. Простыми словами, алгоритм получает некоторую информацию об игроке (его направление движения и координаты), а также все данные о стенах, и на основе полученной информации проверяет то, касается ли игрок каких-либо стен. Если игрок двигался вниз и врезался в пол, то теперь он на нем стоит. Если двигался вверх и ударился о потолок, начинает падать. Двигался влево или вправо и врезался в стену – останавливается (остановка реализована путем приравнивания координаты границы хитбокса игрока к границе стены).
Классы Spike и Solid. Игровые объекты
Класс Spike представляет опасные объекты. При создании экземпляра (срабатывания функции __init__) он добавляется в глобальный список all_spikes. Хитбокс шипа имеет высоту 16 пикселей, что соответствует визуальному размеру спрайта.
Класс Solid представляет твёрдые статические объекты (стены и платформы). Все экземпляры добавляются в список all_solids и используются для проверки столкновений с персонажем.

Игровой цикл 
Основной игровой цикл (while running) выполняется 60 раз в секунду (ограничение в 60 FPS установлено через clock.tick(60)). Каждая итерация (итерация – то же самое, что и одно срабатывание цикла) включает:
•	Обработку событий: библиотека Pygame позволяет получать список клавиш, которые нажимает игрок. Нажатие клавиш А и D – движение влево и вправо соответственно; пробел – прыжок; R – перезапуск уровня (возвращение на стартовую позицию).
•	Обновление физики: в каждой итерации вызывается функция player.collision_move_update(all_solids), которая проверяет столкновения и обновляет позицию игрока.
•	Проверку опасностей: вызывается функция player.check_spikes_collision(all_spikes), которая возвращает игрока на стартовую позицию при контакте с шипами.
•	Проверку падения игрока за пределы карты: если игрок каким-то образом опустится ниже координаты y1000, он сразу вернется на стартовую позицию.
•	Отрисовку: очистка экрана от предыдущего кадра и отрисовка нового. Объекты должны отрисовываться в правильном порядке – сначала фон, потом стены, и в конце игрок



ЗАКЛЮЧЕНИЕ
В ходе выполнения проекта была разработана полноценная двумерная компьютерная игра в жанре платформер на языке Python с использованием библиотеки Pygame.
Что было сделано:
1. Изучены теоретические основы разработки компьютерных игр: жанры, технологии, базовые принципы геймдизайна.
2. Создана визуальная составляющая игры: спрайты персонажа с многокадровой анимацией для четырёх состояний (покой, ходьба, прыжок, падение) и двух направлений движения; текстуры стен четырёх типов (прямые, наружные углы, внутренние углы, заполнение), совместимые между собой для формирования цельного игрового мира; спрайты шипов как опасных объектов.
3. Реализована система загрузки уровней из текстовых файлов с использованием псевдографических символов, что позволяет легко создавать и редактировать игровые пространства без изменения программного кода.
4. Написан программный код, включающий:
•	Физику движения с гравитацией и двойным прыжком; 
•	систему столкновений с раздельной обработкой вертикального и горизонтального движения; 
•	многокадровую анимацию персонажа с таймером смены кадров; обработку пользовательского ввода (клавиатура); 
•	механику шипов и финишных зон; систему перезапуска уровня.
5. Проведено тестирование: проверена корректность столкновений, работа анимации, загрузка уровней, реакция на пользовательский ввод.
Зачем это нужно:
Разработка собственной игры - это не только создание развлекательного продукта, но и глубокое изучение программирования. В процессе работы пришлось разобраться с объектно-ориентированным программированием (классы, объекты, методы), работой с файлами, обработкой событий, математикой движения и столкновений. Полученные навыки применимы не только в геймдеве, но и в других областях программирования.
В дальнейшем проект можно развивать: добавить новые уровни, врагов, сбор предметов, систему очков, звуковое сопровождение, анимированные фоны и меню. Также возможен переход на более мощные инструменты, такие как движок Godot или Unity (который я сейчас изучаю), для создания масштабных проектов, приносящих настоящую прибыль.

ПРИЛОЖЕНИЯ
•	Ссылка на написанный код с комментариями в формате .txt для ознакомления https://docs.google.com/document/d/1gHI0g78jUelYyeDIoPKRnsxxJGT56g4QttMSNss7qLQ/edit?usp=drivesdk
•	Папка с использованными спрайтами https://drive.google.com/drive/folders/17saJ2aIgNExTPLw0UV1d4YFbaG9PL-fI (установить и перенести спрайты в  IDE проект необходимо для корректной работы кода)
•	Файл с игровой картой для переноса в проект https://docs.google.com/document/d/1mz-XJbR2uW3kzAywZN_QFIi-A1vvEthPGGvUxNy53SQ/edit?usp=drivesdk (можно изменять с доступными символами)