Python – распространенный язык программирования, который в основном используется для небольших проектов. Он применяется в них в качестве вспомогательного инструмента. На Python пишутся бизнес-приложения и разнообразные программы. Трудно поверить, но игры с его помощью тоже создаются.
В основном Python ориентирован на программирование 2D-игр элементарного типа. Более сложные и трехмерные проекты на «чистом» Питоне написать не получится – лишь использовать его в качестве дополнительного инструмента разработчика.
Сегодня предстоит познакомиться с разработкой 2D-игры на Python поближе. Предстоит рассмотреть способы реализации поставленной задачи, изучить наиболее популярные движки для нее, а также ознакомиться с библиотеками и фреймворками, помогающими создавать игровой контент. Вниманию также будет представлен первый 2D-проект на Python – игра под названием «Змейка».
Предложенная информация ориентирована на широкий круг лиц. Она подойдет как обычным ПК-пользователям, так и IT-специалистам. Соответствующие данные помогут разобраться с планом действий при разработке 2D-игр, а также познакомит с наиболее распространенными инструментами для реализации поставленной задачи.
План по разработке игры
Разработка программного обеспечения и игр отличаются друг от друга. Каждый игровой контент начинается с составления дальнейшего плана действий. Он поможет не «тормозить» на том или ином этапе создания игры. Готовый проект с грамотной реализацией практически сразу начнет приносить прибыль.
Чтобы создавать 2D (и даже 3D) игры на Python, рекомендуется придерживаться примерно такого алгоритма действий:
- Определиться с языком программирования, на котором будет написан игровой проект. В рассматриваемом случае это Python. Для сложных и крупных игр нередко используют Java и C++.
- Изучить основы выбранного языка программирования.
- Ознакомиться с фреймворками и библиотеками языка, ориентированными на создание игрового контента.
- Выбрать способ разработки. Существуют две концепции, от определения которых немного будет меняться скорость программирования игры и ее функциональные возможности.
- Придумать сюжетную линию и жанр игры. На соответствующем этапе рекомендуется провести тщательный анализ целевой аудитории. Можно начать именно с этого шага – может быть, Python окажется неподходящим для запланированного проекта.
- Заняться разработкой механики, физики и анимации.
- Написать исходный код запланированного проекта.
- Соединить все игровые компоненты в общий проект.
- Организовать тестирование игры. Этот этап поможет выявить и устранить разнообразные ошибки. По мере необходимости нужно провести повторную отладку и тестирование.
- Выложить готовый проект в общий доступ для пользователей.
Некоторые разработчики нередко выкладывают «альфа» и «бета» версии игр в общий доступ для скачивания и эксплуатации. Такой подход особо актуален для сложного программного обеспечения. Он поможет не только выявить разнообразные ошибки в работе проекта, но и даст возможность получить обратную связь от потенциальной целевой аудитории. Конечные пользователи нередко предлагают разнообразные идеи по совершенствованию игр, которые повысили бы их интерес. Такая информация – на вес золота.
Изначально может показаться, что создание игр (даже двумерных) – это простая задача. На самом деле – это неверное утверждение. Чтобы создать развлекательное программное обеспечение, предстоит изучить много информации и освоить огромное количество навыков/инструментов. Особенно это касается разработки с нуля. Формирования физики, анимации, дизайна и программирование исходного кода нередко отнимает очень много времени.
Способы разработки
Разрабатывать игровые проекты можно несколькими способами:
- Через игровые движки. Этот вариант хорошо подходит новичкам.
- С нуля. Отличный вариант для простейших проектов и опытных разработчиков.
В случае разработки через движки необходимо скачать специальное программное обеспечение – игровой движок. В нем обычно есть все, что может пригодиться разработчику для выпуска собственного развлекательного проекта: от графики и анимации до физики и звуковых сигналов. Движок представляет собой готовый пакет решений для программирования игр. Нередко в нем есть специальные «магазины» – там доступны дополнительные инструменты. Некоторые из них распространяются бесплатно, а за какие-то придется заплатить.
Разработка через игровые движки помогает быстро создавать 2D и 3D игры, но их функциональные возможности нередко сильно ограничены. 100 % уникальный проект сделать с их помощью не представится возможным. Зато нередко именно такой подход подразумевает отсутствие у разработчика знаний языков программирования.
Чтобы на выходе получить полностью уникальный игровой проект, необходимо воспользоваться разработкой с нуля. В этом случае физика, анимация, механика и программный код игры будут записаны программистом самостоятельно. Обычно средние и крупные проекты требуют привлечения целой команды разработчиков – иначе процесс может затянуться. Это достаточно сложный в плане реализации подход к программированию игр, но именно он нередко приносит наибольшую отдачу.
В Python под движками обычно подразумеваются готовые библиотеки, ориентированные на создание игр. Поэтому фактическая разработка с нуля рассмотрена не будет. Далее предстоит ознакомиться с «классическими» движками для программирования игр и с наиболее распространенными библиотеками для реализации поставленной задачи.
Unreal Engine
Unreal Engine – игровой движок, который можно считать универсальным. Он подходит для создания не только 2D, но и 3D игр. Его ориентированность – трехмерная графика.
Данный продукт поддерживает C++ в качестве основного языка программирования. Python здесь может использоваться в виде дополнительного инструмента. Также в Unreal Engine есть специальный язык – Blueprints. Он ориентирован на новичков и является визуальным языком разработки.
Unreal Engine рекомендуется использовать тогда, когда в планах создание 3D-игры. Он предлагает хорошую производительность и множество полезных инструментов. Для 2D-игр этот движок почти не используется.
Unity
Unity – это кроссплатформенный игровой движок, который появился в 2005 году. Он ориентирован не только на трехмерную графику, но и на двухмерную. Позволяет писать игры для приставок, компьютеров, а также смартфонов и планшетов.
Unity – движок, позволяющий создавать браузерные игры и контент, работающий на операционных системах iOS и Android. Нередко он используется для написания проектов с использованием технологий AR и VR.
Unity имеет следующие особенности:
- наличие визуальной среды разработки;
- кроссплатформенность;
- поддержка нескольких языков программирования;
- встроенная модульная система компонентов;
- проблемы при подключении внешних библиотек (что необходимо для 2D-разработки на Python).
Это неплохой инструмент разработчика игр. По нему создано множество уроков и имеется огромное количество документации, в том числе и на русском языке.
Разработки через библиотеки Python – лучшие библиотеки
Далее будет сделан акцент на разработке игрового программного обеспечения через библиотеки (они будут в тексте называться движками). Это оптимальное решение как для новичков, так и для опытных разработчиков. Ниже – лучшие библиотеки, которые помогут создавать 2D-игры.
Adventure lib
Adventure lib – библиотека Python, позволяющая писать текстовые игры и интерактивные истории. Данный модуль хорошо подходит для консольного программного обеспечения за счет широкого выбора встроенных инструментов. С его помощью удастся детально проработать все элементы проекта: от персонажа до игровой логики.
Adventure lib предусматривает открытый исходный код. Для него не нужно писать парсеры языка. Все это гарантирует более простое взаимодействие с движком.
Ren’Py
Ren’Py – библиотека, которая подойдет для написания 2D-новелл. Это еще один распространенный жанр 2D-игр. В таком программном обеспечении огромное значение имеет сюжет, а визуальные составляющие и звуки лишь дополняют его.
Ren’Py выделяется:
- кроссплатформенностью – данная среда ориентирована на написание игрового контента для разных устройств;
- множеством инструментов;
- наличием огромного количества уроков и туториалов по ее использованию.
Ren’Py – это не классическая Python-библиотека. Она представляет собой преимущественно готовую среду игровой разработки. Установка данного продукта будет производиться не через pip install. Для ее работы необходимо инициализировать SDK Ren’Py.
Panda 3D
А вот движок, который подойдет для реализации 3D-игр. Речь идет о Panda 3D. Он предусматривает множество полезных инструментов программирования, а также идеально сочетается с различными операционными системами.
Panda 3D – это не просто библиотека, а полноценная платформа для игрового контента и всевозможных приложений. Она поддерживает интеграцию с различными библиотеками, благодаря чему работать с ней очень легко. Правда, для 2D-игр этот вариант подходит не лучшим образом.
PyCharm
PyCharm – полноценная среда разработки на Python. Она поддерживает все необходимое для разработки, отладки и тестирования программного обеспечения. Стандартные возможности PyCharm расширяются за счет плагинов.
PyCharm работает на Windows, macOS и Linux. Она имеет платную и бесплатную версии – остается выбрать подходящий вариант. Для большинства простейших 2D-игр хватит бесплатной.
PyGame
PyGame – основная библиотека, используемая для игровой разработки на Python. Данный движок будет рассмотрен отдельно. Именно на нем предстоит написать первую игру – «Змейку».
Некоторые называют PyGame фреймворком. С точки зрения разработки игрового контента — это не совсем так. PyGame просто имеет характерные черты как библиотеки, так и фреймворка. Он также называется игровым движком – готовым комплексом программного обеспечения для создания 2D- и 3D-игр.
Области использования
PyGame – это фреймворк, ориентированный на создание 2D-игр. В основном – пиксельных и платформеров. Трехмерная графика PyGame поддерживается, но не очень хорошо. Из-за этого сложный AAA-шутер с его помощью запрограммировать не представится возможным.
PyGame подойдет для создания мультимедийных приложений со сложными графическими интерфейсами. Чаще всего фреймворк встречается в игровой разработке:
- при создании небольших инди-проектов;
- для прототипирования более масштабных игр.
Освоить PyGame не составляет никакого труда, поэтому этот движок обычно используется новичками. Он активно применяется в обучении основам игровой разработки. Более опытные программисты тоже могут успешно использовать в своей работе PyGame.
К его преимуществам относят:
- простое освоение;
- быстрый процесс разработки;
- удобное прототипирование;
- возможность работы на любых платформах.
Недостатками PyGame можно считать:
- относительно небольшую функциональность – для крупного игрового проекта эта библиотека не подойдет;
- небольшое сообщество;
- ресурсоемкость – игры на Python отнимают немало компьютерных ресурсов.
Далее предстоит создать первую игру при помощи PyGame. Речь идет о классической «Змейке». Это всего лишь один пример того, как можно использовать рассматриваемый движок на практике с 2D-проектами.
Разработка «Змейки» – пошаговая инструкция
«Змейка» – проект, который часто используется для изучения основ разработки игрового программного обеспечения. Сегодня предстоит познакомиться с ее классической формой представления на основе PyGame.
Правила
Перед программированием проекта необходимо определить игровые правила. В случае с классической интерпретацией «Змейки» они будут следующими:
- змейка будет собирать объекты на игровом поле – ей управляет игрок;
- повороты возможны только на 90 градусов;
- каждый собранный объект будет увеличивать длину змейки на +1 блок;
- при каждом запуске змейка появляется в случайной области имеющегося игрового поля;
- если змейка сталкивается со своим телом или границей поля, игра заканчивается – пользователю засчитывается проигрыш;
- цель – как можно дольше продержаться в раунде и собрать максимально возможное количество объектов.
Управление будет осуществляться при помощи «стандартных» клавиш – WASD. Это связано с тем, что данные кнопки часто используются в игровых проектах. Пользователям не придется привыкать к ним с нуля.
Создание проекта и импорт библиотеки
Весь процесс разработки «Змейки» на PyGame будет разбит на несколько шагов. Этот прием позволяет быстрее освоить упомянутую библиотеку, а также отследить появление новых функций.
Начать предстоит с создания нового проекта в редакторе кода. Для этого рекомендуется использовать PyCharm. VS Code тоже подойдет для реализации поставленной задачи.
Сначала программист должен:
- Запустить среду разработки.
- Выбрать File – New Project.
- Указать имя проекта и задать место хранения исходных файлов (директорию). В рассматриваемом случае проект будет называться snake, а хранится он в стандартной папке. Остальные пункты рекомендуется для начала оставить в состоянии «по умолчанию».
- Перейти в файл main.py. Если он отсутствует – нужно создать его.
- В самом начале соответствующего документа необходимо осуществить импорт библиотек для дальнейшей работы. Предстоит использовать Pygame для доступа к основным модулям Pygame и Randrange – для выбора случайного числа из заданного диапазона.
Вот код, который поможет добиться желаемого результата:
# Импортируем библиотеки
import pygame as pg
from random import randrange
Соответствующий фрагмент кода должен быть вставлен в качестве первых строк main.py. Запись с решеткой не является обязательной. Это комментарий, который сделает исходный код более объемным, но пояснит, за что отвечает тот или иной блок кода.
Константы и переменные
Теперь можно начать активную работу с PyGame. Необходимо создать переменные. Некоторые из них будут константами – они являются постоянными во всем проекте. Сюда относятся размеры окна в пикселях, а также частота кадров (FPS).
Задавать константы рекомендуется сразу после импорта PyGame и других библиотек. Пишутся они в Python заглавными буквами. Если в названии более одного слова, нужно отделять слова друг от друга символом нижнего подчеркивания.
В «Змейке» будут такие константы:
- WINDOW – отвечает за размер окна (равен 1000 пикселей);
- FPS – кадровая частота (60 кадров в секунду).
Вот наглядный пример того, как это будет выглядеть в программном коде на PyGame:
После этого в процессе разработки игрового контента при помощи PyGame необходимо проинициализировать игровые объекты. Для этого сначала создается экранный объект через функции set_mode модуля display.
Set_mode принимает три аргумента:
- размер окна;
- глубину цвета;
- флаги дополнительных параметров.
Последние два параметра могут быть заданы позже. В проекте «Змейка» на PyGame будет задано окно размером 1000 на 1000 пикселей. Константа уже есть. Ее просто необходимо умножить на 2. После этого предстоит сразу инициализировать объект, который поможет задать в проекте на PyGame частоту обновления экрана.
Можно переходить к следующему этапу – формирования игрового окна.
Создание окна проекта
Проекты на PyGame будут работать в рамках бесконечного цикла. Он существует до тех пор, пока пользователь не закроет игровое окно. В соответствующем цикле поддерживаются другие условия и циклы, используемые для управления, обновления экрана и отрисовки объектов.
Необходимо создать цикл while True, а в нем установить ограничение частоты кадров, задействовав FPS:
Теперь необходимо получать события и обрабатывать их. Для этого нужно создать for-цикл и с его помощью отслеживать пользовательские действия, а затем реагировать на них. Сразу же предстоит прописать обнаружение закрытия окна. В этом случае, если объект PyGame закрывается, окно игры тоже закрывается.
Далее необходимо воспользоваться функцией fill() для закрашивания ранее созданного экрана PyGame самым светлым цветом палитры. Этот прием даст возможность размещения в программном продукте более темную змейку и элементы, которые она будет собирать. Цвет будет указан в RGB-формате.
В самом конце предстоит добавить в разработку на PyGame функцию обновления экрана – flip().
Создание змейки
Следующий этап программирования на PyGame – это создание змейки. Чтобы она могла передвигаться, необходимо воспользоваться координатами. В коде поддерживается константа WINDOWS – она обозначает размер одной стороны окна. Теперь можно задать контакты FILE_SIZE – для размера стороны одной плитки сетки. После – задать сразу всю сетку.
Далее – через кортеж предстоит внести в константу RANGE разметку всего поля. Это позволит задавать змейке координаты для передвижения и спауна «корма».
Далее предстоит:
- Создать функцию PyGame, которая будет определять координаты случайной плитки на поле.
- Обозначить лямбда-функцию get_random_position(). С ее помощью и через константу RANGE удастся получить координаты X и Y.
- Поставить префиксную запись – «звездочку». Она укажет на то, что в функцию randrange() нужно передать все кортежные элементы.
Выглядит это так:
Остается нарисовать змейку и задать ей параметры. Сначала создается переменная snake. В ней определяется голова змеи – через экземпляр класса Rect(). Он в PyGame отвечает за обозначение прямоугольной области. В виде параметров в классовый конструктор будут переданы координаты X и Y, высота и ширина. Сразу после этого задается случайная позиция головы змеи в проекте на PyGame на сетке игрового поля. Для этого используется функция get_random_position().
Далее нужно создать переменные для хранения длины змеи и ее сегментов – length со значением 1 и список segments (в нем размещается первый сегмент).
А вот код, с помощью которого можно отобразить змейку на экране. Пусть она будет зеленой, но более темной.
При каждом запуске программного продукта на PyGame теперь будет появляться голова змейки в случайном месте поля.
Управление
В качестве управления в «Змейке» на PyGame будут использоваться клавиши:
- W – вперед;
- A – поворот влево;
- S – назад;
- D – поворот вправо.
Сначала нужно:
- Вернуться к коду, где задавались параметры змейки.
- Создать переменную snake_dir для сохранения координат головы.
- Задать значение (0, 0).
- Задать в коде на PyGame обработку нажатий клавиш. Делается это в разделе цикла обработки событий. Нужно указать значения переменной snake_dir при нажатии.
Выглядит это так:
На каждом шаге змейка перемещается на один сегмент. Из списка сегментов каждый раз убирается лишний:
Вот код, который поможет контролировать скорость движения:
А теперь остается модифицировать часть кода с управлением:
Проект на PyGame почти готов. Осталось несколько простых шагов.
Добавление еды
Еда для змейки по своим размерам идентична голове змеи сразу после запуска раунда. Можно создать переменную food с копией головы змеи. Food будет назначена случайная точка для появления. Для этого используется функция get_random_position():
Еда отобразится на экране более темным цветом зеленого:
Теперь можно научить змейку кушать. Нужно создать условие, в котором проверяется положение головы. Если оно совпадает с едой, задается новое положение для еды, а длина змеи увеличивается на +1.
Выше – пример соответствующего кода на PyGame.
Столкновение
Последний шаг – определение столкновений. Программисту предстоит проверять положение координат головы змеи и размеров окна. Если она соприкасается с границами:
- устанавливаются новые случайные позиции для головы и еды;
- размер змеи уменьшается до исходного;
- координаты передвижения обнуляются.
Выглядит это так:
Змейка в PyGame может столкнуться со своим телом. Это тоже должно привести к концу игры. Для реализации соответствующей задачи создается переменная snake_collision. Она определяет факт пересечения хоть одного прямоугольника тела змеи с ее головой. Лучше всего воспользоваться для ее реализации готовой функцией collidelist() класса Rect из PyGame. После этого предстоит добавить переменную в условие проверки столкновения с границами.
Вот и все. Классическая «Змейка» на PyGame готова. Ее исходный код включает в себя всего 78 строк. Лучше изучить PyGame, Python и игровую разработку помогут дистанционные компьютерные курсы.
Интересует Python? Добро пожаловать на курс в Otus!
<!DOCTYPE html>
<html dir="ltr" lang="ru-RU">
<head>
<meta charset="UTF-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="profile" href="http://gmpg.org/xfn/11" />
<title>Python и создание 2D-игры: что нужно знать разработчику OTUS</title>
<!-- All in One SEO 4.5.2.1 - aioseo.com -->
<meta name="description" content="Python – распространенный язык программирования, который в основном используется для небольших проектов. Он применяется в них в качестве вспомогательного инструмента. На Python пишутся бизнес-приложения и разнообразные программы. Трудно поверить, но игры с его помощью тоже создаются. В основном Python ориентирован на программирование 2D-игр элементарного типа. Более сложные и трехмерные проекты на «чистом» Питоне написать не" />
<meta name="robots" content="max-image-preview:large" />
<link rel="canonical" href="https://otus.ru/journal/python-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku/" />
<meta name="generator" content="All in One SEO (AIOSEO) 4.5.2.1" />
<script type="application/ld+json" class="aioseo-schema">
{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/otus.ru\/journal\/python-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku\/#article","name":"Python \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 2D-\u0438\u0433\u0440\u044b: \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 OTUS","headline":"Python \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 2D-\u0438\u0433\u0440\u044b: \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443","author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2024\/07\/oj-1080x720-2024-07-14T215416.914.jpg","width":2245,"height":1587},"datePublished":"2024-07-14T18:54:48+00:00","dateModified":"2024-07-14T18:54:51+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/otus.ru\/journal\/python-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku\/#webpage"},"isPartOf":{"@id":"https:\/\/otus.ru\/journal\/python-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku\/#webpage"},"articleSection":"\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, Python"},{"@type":"BreadcrumbList","@id":"https:\/\/otus.ru\/journal\/python-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/#listItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/otus.ru\/journal\/","nextItem":"https:\/\/otus.ru\/journal\/python-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku\/#listItem"},{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/python-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku\/#listItem","position":2,"name":"Python \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 2D-\u0438\u0433\u0440\u044b: \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443","previousItem":"https:\/\/otus.ru\/journal\/#listItem"}]},{"@type":"Organization","@id":"https:\/\/otus.ru\/journal\/#organization","name":"\u041e\u0442\u0443\u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","url":"https:\/\/otus.ru\/journal\/","sameAs":["https:\/\/www.youtube.com\/channel\/UCetgtvy93o3i3CvyGXKFU3g"],"contactPoint":{"@type":"ContactPoint","telephone":"+74999389202","contactType":"Customer Support"}},{"@type":"Person","@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author","url":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/","name":"A. Pavlenko","image":{"@type":"ImageObject","@id":"https:\/\/otus.ru\/journal\/python-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d4c499a104d7c2522fa41f89e6819499?s=96&d=mm&r=g","width":96,"height":96,"caption":"A. Pavlenko"}},{"@type":"WebPage","@id":"https:\/\/otus.ru\/journal\/python-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku\/#webpage","url":"https:\/\/otus.ru\/journal\/python-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku\/","name":"Python \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 2D-\u0438\u0433\u0440\u044b: \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 OTUS","description":"Python \u2013 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u041e\u043d \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043d\u0438\u0445 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430. \u041d\u0430 Python \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0422\u0440\u0443\u0434\u043d\u043e \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043d\u043e \u0438\u0433\u0440\u044b \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u043e\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c Python \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 2D-\u0438\u0433\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430. \u0411\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0438 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043d\u0430 \u00ab\u0447\u0438\u0441\u0442\u043e\u043c\u00bb \u041f\u0438\u0442\u043e\u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/otus.ru\/journal\/#website"},"breadcrumb":{"@id":"https:\/\/otus.ru\/journal\/python-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku\/#breadcrumblist"},"author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"creator":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2024\/07\/oj-1080x720-2024-07-14T215416.914.jpg","@id":"https:\/\/otus.ru\/journal\/python-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku\/#mainImage","width":2245,"height":1587},"primaryImageOfPage":{"@id":"https:\/\/otus.ru\/journal\/python-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku\/#mainImage"},"datePublished":"2024-07-14T18:54:48+00:00","dateModified":"2024-07-14T18:54:51+00:00"},{"@type":"WebSite","@id":"https:\/\/otus.ru\/journal\/#website","url":"https:\/\/otus.ru\/journal\/","name":"OTUS JOURNAL","description":"Blog about IT","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"}}]}
</script>
<!-- All in One SEO -->
<link rel='dns-prefetch' href='//otus.ru' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel='stylesheet' id='wp-block-library-css' href='https://otus.ru/journal/wp-includes/css/dist/block-library/style.min.css?ver=6.4.7' type='text/css' media='all' />
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id='global-styles-inline-css' type='text/css'>
body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='wbcr-comments-plus-url-span-css' href='https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/css/url-span.css?ver=2.2.0' type='text/css' media='all' />
<link rel='stylesheet' id='wpel-style-css' href='https://otus.ru/journal/wp-content/plugins/wp-external-links/public/css/wpel.css?ver=2.59' type='text/css' media='all' />
<link rel='stylesheet' id='ez-toc-css' href='https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/css/screen.min.css?ver=2.0.61' type='text/css' media='all' />
<style id='ez-toc-inline-css' type='text/css'>
div#ez-toc-container .ez-toc-title {font-size: 120%;}div#ez-toc-container .ez-toc-title {font-weight: 500;}div#ez-toc-container ul li {font-size: 95%;}div#ez-toc-container nav ul ul li {font-size: 90%;}
.ez-toc-container-direction {direction: ltr;}.ez-toc-counter ul{counter-reset: item ;}.ez-toc-counter nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }.ez-toc-widget-direction {direction: ltr;}.ez-toc-widget-container ul{counter-reset: item ;}.ez-toc-widget-container nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }
</style>
<link rel='stylesheet' id='contentberg-fonts-css' href='https://fonts.googleapis.com/css?family=Roboto%3A400%2C500%2C700%7CPT+Serif%3A400%2C400i%2C600%7CIBM+Plex+Serif%3A500' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-core-css' href='https://otus.ru/journal/wp-content/themes/contentberg/style.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-lightbox-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/lightbox.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/fontawesome/css/font-awesome.min.css?ver=1.8.3' type='text/css' media='all' />
<script type="text/javascript" id="breeze-prefetch-js-extra">
/* <![CDATA[ */
var breeze_prefetch = {"local_url":"https:\/\/otus.ru\/journal","ignore_remote_prefetch":"1","ignore_list":["\/wp-admin\/"]};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js" id="breeze-prefetch-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/lazysizes.js" id="lazysizes-js"></script>
<link rel="https://api.w.org/" href="https://otus.ru/journal/wp-json/" /><link rel="alternate" type="application/json" href="https://otus.ru/journal/wp-json/wp/v2/posts/10356" /><link rel='shortlink' href='https://otus.ru/journal/?p=10356' />
<link rel="alternate" type="application/json+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fpython-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fpython-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku%2F&format=xml" />
<script>var Sphere_Plugin = {"ajaxurl":"https:\/\/otus.ru\/journal\/wp-admin\/admin-ajax.php"};</script><link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-32x32.png" sizes="32x32" />
<link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-192x192.png" sizes="192x192" />
<link rel="apple-touch-icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-180x180.png" />
<meta name="msapplication-TileImage" content="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-270x270.png" />
<style type="text/css" id="wp-custom-css">
#menu-item-10406 .wpel-icon {
display: none;
}
#menu-item-10407 .wpel-icon {
display: none;
}
.otus-login-site a .wpel-icon {
display: none;
}
.menu-menju-navykov-container a .wpel-icon {
display: none;
}
.otus-login-site a
{
background: #ffd709;
border-radius: 12px;
color: #0f0f10;
font-size: 14px;
font-weight: 700;
line-height: 20px;
display: block;
text-align: center;
padding: 8px 25px;
}
.main-footer.dark {
background: linear-gradient(90deg, #a64fc5, #4f54e6);
border-color: transparent;
}
.main-footer.bold .copyright {
color: #fff;
}
.main-footer.bold .to-top i {
color: #fff;
}
.main-footer.bold .back-to-top {
color: #fff;
}
.nav__scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.scrollable-menu .menu {
display: flex;
}
.nav__scroll
{
background: linear-gradient(90deg, #a64fc5, #4f54e6);
}
.scrollable-menu .menu .menu-item {
flex: 0 0 auto;
padding: 15px 15px;
}
.scrollable-menu .menu .menu-item a {
color: #fff;
}
.nav__scroll::-webkit-scrollbar{background-color:#fff;height:5px;}
.nav__scroll::-webkit-scrollbar-thumb{background-color:#dcdcdc;}
.nav__scroll::-webkit-scrollbar-track{-webkit-border-radius:0;border-radius:0;background-color:#fff;}/
body {
min-width: 320px;
}
.banner-click img {
margin: 0 auto;
display: block;
}
.banner-click {
cursor: pointer;
}
.banner-footer-area {
margin-bottom: 20px;
}
.banner-left-area {
margin-top: 40px;
} </style>
<!--Start VDZ Yandex Metrika Plugin-->
<!-- Yandex.Metrika counter --><script type="text/javascript" >(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");ym(34531570, "init", {clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true, ecommerce:"dataLayer"});</script>
<noscript><div><img src="https://mc.yandex.ru/watch/34531570" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter --><!--START ADD EVENTS FROM CF7--><script type='text/javascript'>document.addEventListener( 'wpcf7submit', function( event ) {
//event.detail.contactFormId;
if(ym){
//console.log(event.detail);
ym(34531570, 'reachGoal', 'VDZ_SEND_CONTACT_FORM_7');
ym(34531570, 'params', {
page_url: window.location.href,
status: event.detail.status,
locale: event.detail.contactFormLocale,
form_id: event.detail.contactFormId,
});
}
}, false );
</script><!--END ADD EVENTS FROM CF7-->
<!--End VDZ Yandex Metrika Plugin-->
</head>
<body class="post-template-default single single-post postid-10356 single-format-standard right-sidebar lazy-normal has-lb">
<div class="main-wrap">
<header id="main-head" class="main-head head-nav-below has-search-modal simple simple-boxed">
<div class="inner inner-head" data-sticky-bar="0">
<div class="wrap cf wrap-head">
<div class="left-contain">
<span class="mobile-nav"><i class="fa fa-bars"></i></span>
<div class="title">
<a href="https://otus.ru/journal/" title="OTUS JOURNAL" rel="home" data-wpel-link="internal">
<span class="text-logo"><img src="/journal/wp-content/themes/contentberg/img/logo_site.svg" alt="OTUS JOURNAL"></span>
</a>
</div>
</div>
<div class="navigation-wrap inline">
<nav class="navigation inline simple light" data-sticky-bar="0">
<div class="menu-rubriki-container"><ul id="menu-rubriki" class="menu"><li id="menu-item-109" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-1 menu-item-109"><a href="https://otus.ru/journal/category/pro-it/" data-wpel-link="internal"><span>Про IT</span></a></li>
<li id="menu-item-113" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-cat-4 menu-item-113"><a href="https://otus.ru/journal/category/polza/" data-wpel-link="internal"><span>Полезное</span></a></li>
<li id="menu-item-114" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-3 menu-item-114"><a href="https://otus.ru/journal/category/lifestyle/" data-wpel-link="internal"><span>Лайфстайл</span></a></li>
<li id="menu-item-10406" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10406"><a href="https://otus.ru/catalog/courses" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Обучение</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10407" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10407"><a href="https://otus.ru/about" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Информация</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </nav>
</div>
<div class="actions">
<div class="otus-login-site">
<a href="https://otus.ru/login/" target="_blank" data-wpel-link="external" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Войти<span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
<a href="#" title="Search" class="search-link"><i class="fa fa-search"></i></a>
</div>
</div>
</div>
</header> <!-- .main-head -->
<div class="nav nav_disable nav_colored nav_transparent course-categories__nav nav__scroll ">
<div class="container wrap">
<div class="links inline simple light scrollable-menu">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov" class="menu"><li id="menu-item-10413" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10414" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10415" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10416" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10417" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10418" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10419" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10420" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10421" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
</div>
</div>
<div class="main wrap">
<div class="ts-row cf">
<div class="col-8 main-content cf">
<article id="post-10356" class="the-post post-10356 post type-post status-publish format-standard has-post-thumbnail category-polza tag-python">
<header class="post-header the-post-header cf">
<div class="post-meta the-post-meta">
<span class="post-cat">
<a href="https://otus.ru/journal/category/polza/" class="category" data-wpel-link="internal">Полезное</a>
</span>
<h1 class="post-title">
Python и создание 2D-игры: что нужно знать разработчику
</h1>
<a href="https://otus.ru/journal/python-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku/" class="date-link" data-wpel-link="internal"><time class="post-date">14 июля, 2024</time></a>
</div>
<div class="featured">
<a href="https://otus.ru/journal/wp-content/uploads/2024/07/oj-1080x720-2024-07-14T215416.914.jpg" class="image-link" data-wpel-link="internal"><img width="770" height="515" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20770%20515%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-contentberg-main size-contentberg-main lazyload wp-post-image" alt="Python и создание 2D-игры: что нужно знать разработчику" title="Python и создание 2D-игры: что нужно знать разработчику" decoding="async" fetchpriority="high" data-srcset="https://otus.ru/journal/wp-content/uploads/2024/07/oj-1080x720-2024-07-14T215416.914-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2024/07/oj-1080x720-2024-07-14T215416.914-270x180.jpg 270w" data-src="https://otus.ru/journal/wp-content/uploads/2024/07/oj-1080x720-2024-07-14T215416.914-770x515.jpg" data-sizes="(max-width: 770px) 100vw, 770px" /> </a>
</div>
</header><!-- .post-header -->
<div class="post-content description cf entry-content content-normal">
<div id="ez-toc-container" class="ez-toc-v2_0_61 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<p class="ez-toc-title " >Содержание</p>
<span class="ez-toc-title-toggle"><a href="#" class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" aria-label="Toggle Table of Content"><span class="ez-toc-js-icon-con"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="http://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="http://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></span></a></span></div>
<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-1" href="#%D0%9F%D0%BB%D0%B0%D0%BD_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B" title="План по разработке игры">План по разработке игры</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-2" href="#%D0%A1%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D1%8B_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8" title="Способы разработки">Способы разработки</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-3" href="#Unreal_Engine" title="Unreal Engine">Unreal Engine</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-4" href="#Unity" title="Unity">Unity</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-5" href="#%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8_Python_%E2%80%93_%D0%BB%D1%83%D1%87%D1%88%D0%B8%D0%B5_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8" title="Разработки через библиотеки Python – лучшие библиотеки">Разработки через библиотеки Python – лучшие библиотеки</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-6" href="#Adventure_lib" title="Adventure lib">Adventure lib</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-7" href="#RenPy" title="Ren’Py">Ren’Py</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-8" href="#Panda_3D" title="Panda 3D">Panda 3D</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-9" href="#PyCharm" title="PyCharm">PyCharm</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-10" href="#PyGame" title="PyGame">PyGame</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-11" href="#%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D0%B8_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F" title="Области использования">Области использования</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-12" href="#%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%C2%AB%D0%97%D0%BC%D0%B5%D0%B9%D0%BA%D0%B8%C2%BB_%E2%80%93_%D0%BF%D0%BE%D1%88%D0%B0%D0%B3%D0%BE%D0%B2%D0%B0%D1%8F_%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F" title="Разработка «Змейки» – пошаговая инструкция">Разработка «Змейки» – пошаговая инструкция</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-13" href="#%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0" title="Правила">Правила</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-14" href="#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0_%D0%B8_%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8" title="Создание проекта и импорт библиотеки">Создание проекта и импорт библиотеки</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-15" href="#%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82%D1%8B_%D0%B8_%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5" title="Константы и переменные">Константы и переменные</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-16" href="#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BA%D0%BD%D0%B0_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0" title="Создание окна проекта">Создание окна проекта</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-17" href="#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B7%D0%BC%D0%B5%D0%B9%D0%BA%D0%B8" title="Создание змейки">Создание змейки</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-18" href="#%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5" title="Управление">Управление</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-19" href="#%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B5%D0%B4%D1%8B" title="Добавление еды">Добавление еды</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-20" href="#%D0%A1%D1%82%D0%BE%D0%BB%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5" title="Столкновение">Столкновение</a></li></ul></li></ul></nav></div>
<p>Python – распространенный язык программирования, который в основном используется для небольших проектов. Он применяется в них в качестве вспомогательного инструмента. На Python пишутся бизнес-приложения и разнообразные программы. Трудно поверить, но игры с его помощью тоже создаются.</p>
<p>В основном Python ориентирован на программирование 2D-игр элементарного типа. Более сложные и трехмерные проекты на «чистом» Питоне написать не получится – лишь использовать его в качестве дополнительного инструмента разработчика.</p>
<p>Сегодня предстоит познакомиться с разработкой 2D-игры на Python поближе. Предстоит рассмотреть способы реализации поставленной задачи, изучить наиболее популярные движки для нее, а также ознакомиться с библиотеками и фреймворками, помогающими создавать игровой контент. Вниманию также будет представлен первый 2D-проект на Python – игра под названием «Змейка».</p>
<p>Предложенная информация ориентирована на широкий круг лиц. Она подойдет как обычным ПК-пользователям, так и IT-специалистам. Соответствующие данные помогут разобраться с планом действий при разработке 2D-игр, а также познакомит с наиболее распространенными инструментами для реализации поставленной задачи.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BB%D0%B0%D0%BD_%D0%BF%D0%BE_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B"></span>План по разработке игры<span class="ez-toc-section-end"></span></h2>
<p>Разработка программного обеспечения и игр отличаются друг от друга. Каждый игровой контент начинается с составления дальнейшего плана действий. Он поможет не «тормозить» на том или ином этапе создания игры. Готовый проект с грамотной реализацией практически сразу начнет приносить прибыль.</p>
<p>Чтобы создавать 2D (и даже 3D) игры на Python, рекомендуется придерживаться примерно такого алгоритма действий:</p>
<ol>
<li>Определиться с языком программирования, на котором будет написан игровой проект. В рассматриваемом случае это Python. Для сложных и крупных игр нередко используют Java и C++.</li>
<li>Изучить основы выбранного языка программирования.</li>
<li>Ознакомиться с фреймворками и библиотеками языка, ориентированными на создание игрового контента.</li>
<li>Выбрать способ разработки. Существуют две концепции, от определения которых немного будет меняться скорость программирования игры и ее функциональные возможности.</li>
<li>Придумать сюжетную линию и жанр игры. На соответствующем этапе рекомендуется провести тщательный анализ целевой аудитории. Можно начать именно с этого шага – может быть, Python окажется неподходящим для запланированного проекта.</li>
<li>Заняться разработкой механики, физики и анимации.</li>
<li>Написать исходный код запланированного проекта.</li>
<li>Соединить все игровые компоненты в общий проект.</li>
<li>Организовать тестирование игры. Этот этап поможет выявить и устранить разнообразные ошибки. По мере необходимости нужно провести повторную отладку и тестирование.</li>
<li>Выложить готовый проект в общий доступ для пользователей.</li>
</ol>
<p>Некоторые разработчики нередко выкладывают «альфа» и «бета» версии игр в общий доступ для скачивания и эксплуатации. Такой подход особо актуален для сложного программного обеспечения. Он поможет не только выявить разнообразные ошибки в работе проекта, но и даст возможность получить обратную связь от потенциальной целевой аудитории. Конечные пользователи нередко предлагают разнообразные идеи по совершенствованию игр, которые повысили бы их интерес. Такая информация – на вес золота.</p>
<p>Изначально может показаться, что создание игр (даже двумерных) – это простая задача. На самом деле – это неверное утверждение. Чтобы создать развлекательное программное обеспечение, предстоит изучить много информации и освоить огромное количество навыков/инструментов. Особенно это касается разработки с нуля. Формирования физики, анимации, дизайна и программирование исходного кода нередко отнимает очень много времени.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D1%8B_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8"></span>Способы разработки<span class="ez-toc-section-end"></span></h2>
<p>Разрабатывать игровые проекты можно несколькими способами:</p>
<ol>
<li>Через игровые движки. Этот вариант хорошо подходит новичкам.</li>
<li>С нуля. Отличный вариант для простейших проектов и опытных разработчиков.</li>
</ol>
<p>В случае разработки через движки необходимо скачать специальное программное обеспечение – игровой движок. В нем обычно есть все, что может пригодиться разработчику для выпуска собственного развлекательного проекта: от графики и анимации до физики и звуковых сигналов. Движок представляет собой готовый пакет решений для программирования игр. Нередко в нем есть специальные «магазины» – там доступны дополнительные инструменты. Некоторые из них распространяются бесплатно, а за какие-то придется заплатить.</p>
<p>Разработка через игровые движки помогает быстро создавать 2D и 3D игры, но их функциональные возможности нередко сильно ограничены. 100 % уникальный проект сделать с их помощью не представится возможным. Зато нередко именно такой подход подразумевает отсутствие у разработчика знаний языков программирования.</p>
<p>Чтобы на выходе получить полностью уникальный игровой проект, необходимо воспользоваться разработкой с нуля. В этом случае физика, анимация, механика и программный код игры будут записаны программистом самостоятельно. Обычно средние и крупные проекты требуют привлечения целой команды разработчиков – иначе процесс может затянуться. Это достаточно сложный в плане реализации подход к программированию игр, но именно он нередко приносит наибольшую отдачу.</p>
<p>В Python под движками обычно подразумеваются готовые библиотеки, ориентированные на создание игр. Поэтому фактическая разработка с нуля рассмотрена не будет. Далее предстоит ознакомиться с «классическими» движками для программирования игр и с наиболее распространенными библиотеками для реализации поставленной задачи.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="Unreal_Engine"></span>Unreal Engine<span class="ez-toc-section-end"></span></h3>
<p>Unreal Engine – игровой движок, который можно считать универсальным. Он подходит для создания не только 2D, но и 3D игр. Его ориентированность – трехмерная графика.</p>
<p>Данный продукт поддерживает C++ в качестве основного языка программирования. Python здесь может использоваться в виде дополнительного инструмента. Также в Unreal Engine есть специальный язык – Blueprints. Он ориентирован на новичков и является визуальным языком разработки.</p>
<p>Unreal Engine рекомендуется использовать тогда, когда в планах создание 3D-игры. Он предлагает хорошую производительность и множество полезных инструментов. Для 2D-игр этот движок почти не используется.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="Unity"></span>Unity<span class="ez-toc-section-end"></span></h3>
<p>Unity – это кроссплатформенный игровой движок, который появился в 2005 году. Он ориентирован не только на трехмерную графику, но и на двухмерную. Позволяет писать игры для приставок, компьютеров, а также смартфонов и планшетов.</p>
<p>Unity – движок, позволяющий создавать браузерные игры и контент, работающий на операционных системах iOS и Android. Нередко он используется для написания проектов с использованием технологий AR и VR.</p>
<p>Unity имеет следующие особенности:</p>
<ul>
<li>наличие визуальной среды разработки;</li>
<li>кроссплатформенность;</li>
<li>поддержка нескольких языков программирования;</li>
<li>встроенная модульная система компонентов;</li>
<li>проблемы при подключении внешних библиотек (что необходимо для 2D-разработки на Python).</li>
</ul>
<p>Это неплохой инструмент разработчика игр. По нему создано множество уроков и имеется огромное количество документации, в том числе и на русском языке.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8_Python_%E2%80%93_%D0%BB%D1%83%D1%87%D1%88%D0%B8%D0%B5_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8"></span>Разработки через библиотеки Python – лучшие библиотеки<span class="ez-toc-section-end"></span></h2>
<p>Далее будет сделан акцент на разработке игрового программного обеспечения через библиотеки (они будут в тексте называться движками). Это оптимальное решение как для новичков, так и для опытных разработчиков. Ниже – лучшие библиотеки, которые помогут создавать 2D-игры.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="Adventure_lib"></span>Adventure lib<span class="ez-toc-section-end"></span></h3>
<p>Adventure lib – библиотека Python, позволяющая писать текстовые игры и интерактивные истории. Данный модуль хорошо подходит для консольного программного обеспечения за счет широкого выбора встроенных инструментов. С его помощью удастся детально проработать все элементы проекта: от персонажа до игровой логики.</p>
<p>Adventure lib предусматривает открытый исходный код. Для него не нужно писать парсеры языка. Все это гарантирует более простое взаимодействие с движком.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="RenPy"></span>Ren’Py<span class="ez-toc-section-end"></span></h3>
<p>Ren’Py – библиотека, которая подойдет для написания 2D-новелл. Это еще один распространенный жанр 2D-игр. В таком программном обеспечении огромное значение имеет сюжет, а визуальные составляющие и звуки лишь дополняют его.</p>
<p>Ren’Py выделяется:</p>
<ul>
<li>кроссплатформенностью – данная среда ориентирована на написание игрового контента для разных устройств;</li>
<li>множеством инструментов;</li>
<li>наличием огромного количества уроков и туториалов по ее использованию.</li>
</ul>
<p>Ren’Py – это не классическая Python-библиотека. Она представляет собой преимущественно готовую среду игровой разработки. Установка данного продукта будет производиться не через pip install. Для ее работы необходимо инициализировать SDK Ren’Py.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="Panda_3D"></span>Panda 3D<span class="ez-toc-section-end"></span></h3>
<p>А вот движок, который подойдет для реализации 3D-игр. Речь идет о Panda 3D. Он предусматривает множество полезных инструментов программирования, а также идеально сочетается с различными операционными системами.</p>
<p>Panda 3D – это не просто библиотека, а полноценная платформа для игрового контента и всевозможных приложений. Она поддерживает интеграцию с различными библиотеками, благодаря чему работать с ней очень легко. Правда, для 2D-игр этот вариант подходит не лучшим образом.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="PyCharm"></span>PyCharm<span class="ez-toc-section-end"></span></h3>
<p>PyCharm – полноценная среда разработки на Python. Она поддерживает все необходимое для разработки, отладки и тестирования программного обеспечения. Стандартные возможности PyCharm расширяются за счет плагинов.</p>
<p>PyCharm работает на Windows, macOS и Linux. Она имеет платную и бесплатную версии – остается выбрать подходящий вариант. Для большинства простейших 2D-игр хватит бесплатной.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="PyGame"></span>PyGame<span class="ez-toc-section-end"></span></h2>
<p>PyGame – основная библиотека, используемая для игровой разработки на Python. Данный движок будет рассмотрен отдельно. Именно на нем предстоит написать первую игру – «Змейку».</p>
<p>Некоторые называют PyGame фреймворком. С точки зрения разработки игрового контента — это не совсем так. PyGame просто имеет характерные черты как библиотеки, так и фреймворка. Он также называется игровым движком – готовым комплексом программного обеспечения для создания 2D- и 3D-игр.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D0%B8_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F"></span>Области использования<span class="ez-toc-section-end"></span></h3>
<p>PyGame – это фреймворк, ориентированный на создание 2D-игр. В основном – пиксельных и платформеров. Трехмерная графика PyGame поддерживается, но не очень хорошо. Из-за этого сложный AAA-шутер с его помощью запрограммировать не представится возможным.</p>
<p>PyGame подойдет для создания мультимедийных приложений со сложными графическими интерфейсами. Чаще всего фреймворк встречается в игровой разработке:</p>
<ul>
<li>при создании небольших инди-проектов;</li>
<li>для прототипирования более масштабных игр.</li>
</ul>
<p>Освоить PyGame не составляет никакого труда, поэтому этот движок обычно используется новичками. Он активно применяется в обучении основам игровой разработки. Более опытные программисты тоже могут успешно использовать в своей работе PyGame.</p>
<p>К его преимуществам относят:</p>
<ul>
<li>простое освоение;</li>
<li>быстрый процесс разработки;</li>
<li>удобное прототипирование;</li>
<li>возможность работы на любых платформах.</li>
</ul>
<p>Недостатками PyGame можно считать:</p>
<ul>
<li>относительно небольшую функциональность – для крупного игрового проекта эта библиотека не подойдет;</li>
<li>небольшое сообщество;</li>
<li>ресурсоемкость – игры на Python отнимают немало компьютерных ресурсов.</li>
</ul>
<p>Далее предстоит создать первую игру при помощи PyGame. Речь идет о классической «Змейке». Это всего лишь один пример того, как можно использовать рассматриваемый движок на практике с 2D-проектами.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%C2%AB%D0%97%D0%BC%D0%B5%D0%B9%D0%BA%D0%B8%C2%BB_%E2%80%93_%D0%BF%D0%BE%D1%88%D0%B0%D0%B3%D0%BE%D0%B2%D0%B0%D1%8F_%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F"></span>Разработка «Змейки» – пошаговая инструкция<span class="ez-toc-section-end"></span></h2>
<p>«Змейка» – проект, который часто используется для изучения основ разработки игрового программного обеспечения. Сегодня предстоит познакомиться с ее классической формой представления на основе PyGame.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0"></span>Правила<span class="ez-toc-section-end"></span></h3>
<p>Перед программированием проекта необходимо определить игровые правила. В случае с классической интерпретацией «Змейки» они будут следующими:</p>
<ul>
<li>змейка будет собирать объекты на игровом поле – ей управляет игрок;</li>
<li>повороты возможны только на 90 градусов;</li>
<li>каждый собранный объект будет увеличивать длину змейки на +1 блок;</li>
<li>при каждом запуске змейка появляется в случайной области имеющегося игрового поля;</li>
<li>если змейка сталкивается со своим телом или границей поля, игра заканчивается – пользователю засчитывается проигрыш;</li>
<li>цель – как можно дольше продержаться в раунде и собрать максимально возможное количество объектов.</li>
</ul>
<p>Управление будет осуществляться при помощи «стандартных» клавиш – WASD. Это связано с тем, что данные кнопки часто используются в игровых проектах. Пользователям не придется привыкать к ним с нуля.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0_%D0%B8_%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8"></span>Создание проекта и импорт библиотеки<span class="ez-toc-section-end"></span></h3>
<p>Весь процесс разработки «Змейки» на PyGame будет разбит на несколько шагов. Этот прием позволяет быстрее освоить упомянутую библиотеку, а также отследить появление новых функций.</p>
<p>Начать предстоит с создания нового проекта в редакторе кода. Для этого рекомендуется использовать PyCharm. VS Code тоже подойдет для реализации поставленной задачи.</p>
<p>Сначала программист должен:</p>
<ol>
<li>Запустить среду разработки.</li>
<li>Выбрать File – New Project.</li>
<li>Указать имя проекта и задать место хранения исходных файлов (директорию). В рассматриваемом случае проект будет называться snake, а хранится он в стандартной папке. Остальные пункты рекомендуется для начала оставить в состоянии «по умолчанию».</li>
<li>Перейти в файл main.py. Если он отсутствует – нужно создать его.</li>
<li>В самом начале соответствующего документа необходимо осуществить импорт библиотек для дальнейшей работы. Предстоит использовать Pygame для доступа к основным модулям Pygame и Randrange – для выбора случайного числа из заданного диапазона.</li>
</ol>
<p>Вот код, который поможет добиться желаемого результата:</p>
<p># Импортируем библиотеки</p>
<p><strong>import</strong> pygame <strong>as</strong> pg</p>
<p><strong>from </strong>random<strong> import</strong> randrange</p>
<p>Соответствующий фрагмент кода должен быть вставлен в качестве первых строк main.py. Запись с решеткой не является обязательной. Это комментарий, который сделает исходный код более объемным, но пояснит, за что отвечает тот или иной блок кода.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82%D1%8B_%D0%B8_%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5"></span>Константы и переменные<span class="ez-toc-section-end"></span></h3>
<p>Теперь можно начать активную работу с PyGame. Необходимо создать переменные. Некоторые из них будут константами – они являются постоянными во всем проекте. Сюда относятся размеры окна в пикселях, а также частота кадров (FPS).</p>
<p>Задавать константы рекомендуется сразу после импорта PyGame и других библиотек. Пишутся они в Python заглавными буквами. Если в названии более одного слова, нужно отделять слова друг от друга символом нижнего подчеркивания.</p>
<p>В «Змейке» будут такие константы:</p>
<ul>
<li>WINDOW – отвечает за размер окна (равен 1000 пикселей);</li>
<li>FPS – кадровая частота (60 кадров в секунду).</li>
</ul>
<p>Вот наглядный пример того, как это будет выглядеть в программном коде на PyGame:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXfqMOn1-VQSdfD2tnKPQjqdigUHc8NfZvmLXkFRuBE0-o3hek56d5NeBCuV2sFWey-ZX-YXIjt0U61GVN-JK5Q1hvLeEgVjlC2qOLw2Nh0lioegxgJQ9z_AXWfzcwF28PQA-PXVqRgYIMc_GqGvCEzD4-0JXkBOjWQzTyrSNiip_uBmr8sDSco?key=FVXEU_3Cgq3J1x73sQtr6Q" alt="Python и создание 2D-игры: что нужно знать разработчику"/></figure>
<p>После этого в процессе разработки игрового контента при помощи PyGame необходимо проинициализировать игровые объекты. Для этого сначала создается экранный объект через функции set_mode модуля display.</p>
<p>Set_mode принимает три аргумента:</p>
<ul>
<li>размер окна;</li>
<li>глубину цвета;</li>
<li>флаги дополнительных параметров.</li>
</ul>
<p>Последние два параметра могут быть заданы позже. В проекте «Змейка» на PyGame будет задано окно размером 1000 на 1000 пикселей. Константа уже есть. Ее просто необходимо умножить на 2. После этого предстоит сразу инициализировать объект, который поможет задать в проекте на PyGame частоту обновления экрана.</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXfaUousJ0u8Z6uAPJyLESX0AzSLG7_8AwgY--hR6dJGh6PMcoQ2qXsQ-5ZGa3Wsak7a5AcvnUoRxcUamrUtVkH0CF8iRqeN77UslFGxZngNDXvpkzKgjCrWI6FO80GbEHPnbiEw4kozyQudfdZ9dWzRKLI09k5dlepne_qBpuD2EwhKVwQB9C4?key=FVXEU_3Cgq3J1x73sQtr6Q" alt="Python и создание 2D-игры: что нужно знать разработчику"/></figure>
<p>Можно переходить к следующему этапу – формирования игрового окна.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BA%D0%BD%D0%B0_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0"></span>Создание окна проекта<span class="ez-toc-section-end"></span></h3>
<p>Проекты на PyGame будут работать в рамках бесконечного цикла. Он существует до тех пор, пока пользователь не закроет игровое окно. В соответствующем цикле поддерживаются другие условия и циклы, используемые для управления, обновления экрана и отрисовки объектов.</p>
<p>Необходимо создать цикл while True, а в нем установить ограничение частоты кадров, задействовав FPS:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXfcDTBP7vK_HrpgthR5DnWZ-NlbVb64yBa1f2ySds9EfZdZXTxl2tFI5Yh_mQ1AsLEmghd5HSD_cknM_B0oAlNuB-_gXV9o9l4sCP3agZbXjw9BSl4A4KHq0ZZzyIjTxGZcKZIOAHlDgacFqXDaNTrd5XstmM2fKFDfH9FqwufQ9YsOzJUim3s?key=FVXEU_3Cgq3J1x73sQtr6Q" alt="Python и создание 2D-игры: что нужно знать разработчику"/></figure>
<p>Теперь необходимо получать события и обрабатывать их. Для этого нужно создать for-цикл и с его помощью отслеживать пользовательские действия, а затем реагировать на них. Сразу же предстоит прописать обнаружение закрытия окна. В этом случае, если объект PyGame закрывается, окно игры тоже закрывается.</p>
<p>Далее необходимо воспользоваться функцией fill() для закрашивания ранее созданного экрана PyGame самым светлым цветом палитры. Этот прием даст возможность размещения в программном продукте более темную змейку и элементы, которые она будет собирать. Цвет будет указан в RGB-формате.</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcBJuJpHQQ3oEldAGCnaugwnmFDkhOsPvU7BYa_72bUkf3irISHkzuI1kA_XwjehnwRTmBI0A9KNNTF0Jc6ZPRwsY9Mj37BBtk-okKDKs6w1zYQyyWM_JvsYZXBMs27WkGUadxPSgJ03jR_Z-DyqyKVql3c3fAE75gQrVsj5b2b0l8QP4Lxjg?key=FVXEU_3Cgq3J1x73sQtr6Q" alt="Python и создание 2D-игры: что нужно знать разработчику"/></figure>
<p>В самом конце предстоит добавить в разработку на PyGame функцию обновления экрана – flip().</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B7%D0%BC%D0%B5%D0%B9%D0%BA%D0%B8"></span>Создание змейки<span class="ez-toc-section-end"></span></h3>
<p>Следующий этап программирования на PyGame – это создание змейки. Чтобы она могла передвигаться, необходимо воспользоваться координатами. В коде поддерживается константа WINDOWS – она обозначает размер одной стороны окна. Теперь можно задать контакты FILE_SIZE – для размера стороны одной плитки сетки. После – задать сразу всю сетку.</p>
<p>Далее – через кортеж предстоит внести в константу RANGE разметку всего поля. Это позволит задавать змейке координаты для передвижения и спауна «корма».</p>
<p><img alt="Python и создание 2D-игры: что нужно знать разработчику" decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXfqXcWWHXb0gdQUCLV2RmGofxXb7iR22ar3ExcSWfxFTJXz2Ed0b062lBl6qqpclfzuaV2AoslK2nZFjgLaUNQ4AwbF0IVscd6kgl_g4Pi50B8OG-uOd9TxyKpddiTBx0zsfxFwYdhYFt5_qz8BFDiTUMOFyjbvJKTqRWTpxQoR3yad4Vm5SA?key=FVXEU_3Cgq3J1x73sQtr6Q" width="623" height="70">Далее предстоит:</p>
<ol>
<li>Создать функцию PyGame, которая будет определять координаты случайной плитки на поле.</li>
<li>Обозначить лямбда-функцию get_random_position(). С ее помощью и через константу RANGE удастся получить координаты X и Y.</li>
<li>Поставить префиксную запись – «звездочку». Она укажет на то, что в функцию randrange() нужно передать все кортежные элементы.</li>
</ol>
<p>Выглядит это так:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXd5j5IUU7dVHCl1YAs8FmQXw8bVcOo1tDzINZvBNihZj79ben4gsp6n0WJq0Bqy75CKEA-odeXZVZ4yNoH5ZTmZEG1gLfGtgAlWcca6xl55JRQV9ff07lEygvoNq0QBAJIzqmub8NAwIFpQJEr7B32JKgYfKvJeamorN73K78Ww_QdP_-9IXOQ?key=FVXEU_3Cgq3J1x73sQtr6Q" alt="Python и создание 2D-игры: что нужно знать разработчику"/></figure>
<p>Остается нарисовать змейку и задать ей параметры. Сначала создается переменная snake. В ней определяется голова змеи – через экземпляр класса Rect(). Он в PyGame отвечает за обозначение прямоугольной области. В виде параметров в классовый конструктор будут переданы координаты X и Y, высота и ширина. Сразу после этого задается случайная позиция головы змеи в проекте на PyGame на сетке игрового поля. Для этого используется функция get_random_position().</p>
<p>Далее нужно создать переменные для хранения длины змеи и ее сегментов – length со значением 1 и список segments (в нем размещается первый сегмент).</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXfMW3iwaaYxZbn9duTtMAAXOi9VDLsG3AJV2igmFb_PKOv3-JUHwmv4lUyhU6qwAl0d44dBM9Tjrv-ykpLIuG59PA_9lk8zHUd85SG7I9PP-hQa6NwZ2NUOAkb9IOTjU5KX4qat-YYcXpF75Y6WpPhBBERtG02NHP6ALZ69YF4bj2zMM08NxFE?key=FVXEU_3Cgq3J1x73sQtr6Q" alt="Python и создание 2D-игры: что нужно знать разработчику"/></figure>
<p>А вот код, с помощью которого можно отобразить змейку на экране. Пусть она будет зеленой, но более темной.</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcqFWh1WqLwqw1-bp7gUGQ5Dgad3Ze5KdfT1AeUbZGC1rAmuXefRMNhrB-h-1VMlaBXQ_4Rlg2e-EEInpOV1a_Hn7ourfGkyjE4rhMcYbDY7JQDNvDN2drNf_ti_fDERheOTJps2zCujOgesUPvdvUaZBKoDQ7J0RLicNPY4FjFuklBLNsVXoM?key=FVXEU_3Cgq3J1x73sQtr6Q" alt="Python и создание 2D-игры: что нужно знать разработчику"/></figure>
<p>При каждом запуске программного продукта на PyGame теперь будет появляться голова змейки в случайном месте поля.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5"></span>Управление<span class="ez-toc-section-end"></span></h3>
<p>В качестве управления в «Змейке» на PyGame будут использоваться клавиши:</p>
<ul>
<li>W – вперед;</li>
<li>A – поворот влево;</li>
<li>S – назад;</li>
<li>D – поворот вправо.</li>
</ul>
<p>Сначала нужно:</p>
<ol>
<li>Вернуться к коду, где задавались параметры змейки.</li>
<li>Создать переменную snake_dir для сохранения координат головы.</li>
<li>Задать значение (0, 0).</li>
<li>Задать в коде на PyGame обработку нажатий клавиш. Делается это в разделе цикла обработки событий. Нужно указать значения переменной snake_dir при нажатии.</li>
</ol>
<p>Выглядит это так:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXctjMwtjOQo38r_ce9q49w4xuqO6mzP8941riQZesEQ0x9B2FAiyir4AMJDtXLtvDINwfVcwF67077U1wS35RJMceE02Qs680f5iMUDHYrN3VFV5IyNZBTqXqFMOsjbNIYEZfEI0McvVloeFFf2BUImPFaE_f8ng8WzWPq06UYlG1KctJ_SdQ?key=FVXEU_3Cgq3J1x73sQtr6Q" alt="Python и создание 2D-игры: что нужно знать разработчику"/></figure>
<p>На каждом шаге змейка перемещается на один сегмент. Из списка сегментов каждый раз убирается лишний:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcPADj3ro-DYMCr6EXEdSkpfhZ3bz571t2LOLZApoAlblwSPx_dUBHEPzqxWAe2kiGg2Tdw5u7x7dvVhCmDGNZszFKjPwg_M08eESl9Zgo2SS4Cqczsd3QUcM-gZEg2ozFV6USWr0-RQUU8LYGYCOuiZPdWOOLil593eXarxgww7RXTX9rc6w?key=FVXEU_3Cgq3J1x73sQtr6Q" alt="Python и создание 2D-игры: что нужно знать разработчику"/></figure>
<p>Вот код, который поможет контролировать скорость движения:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXf5piR-h-RwJgvv4rR7KD6Rq1kRkOksmvruQoZ4oqVgtgL22-zF8Xcu9_PgWEXmjdloDKrVYYJ7Li0kmlB55u4RvJWagfIDNcm_9RqxoxopUUtGRcz2xZHMnYzYqDvcMdeazLd-yvR43ieNLr7v9aUl2NZSCuFQhZ6LtjZNZpXg-7b933PKnOQ?key=FVXEU_3Cgq3J1x73sQtr6Q" alt="Python и создание 2D-игры: что нужно знать разработчику"/></figure>
<p>А теперь остается модифицировать часть кода с управлением:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcc63JFaiLejRKF758aGSRVmal2NqP2cA5YxzkSKURYAQeeoMERT9KI87p90crF9LTAj1kl7Jixbv18TAY8gUELWDFYIcCeJ0orCHhhBFFWuxRRL4mz8wlrQ8gNP4BT0VNulJhVPnFiVSjwVCKqshS52ACxwEMp7Sfk1oFKWjER4HGsgcdIbvM?key=FVXEU_3Cgq3J1x73sQtr6Q" alt="Python и создание 2D-игры: что нужно знать разработчику"/></figure>
<p>Проект на PyGame почти готов. Осталось несколько простых шагов.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B5%D0%B4%D1%8B"></span>Добавление еды<span class="ez-toc-section-end"></span></h3>
<p>Еда для змейки по своим размерам идентична голове змеи сразу после запуска раунда. Можно создать переменную food с копией головы змеи. Food будет назначена случайная точка для появления. Для этого используется функция get_random_position():</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXe17eYoRpcft3n3QdZD_xK1Qgej1S9Ckm9nB5Bm3691c_LMxjxrGQ5-Weu2Oo8qjCDWXlZ3QhDxkRNAlITfdgGaplBGYySaIT-iHd1XcGnycij34_cosIiLkOmWKRnPEBJn15yr7K_9PjQh4FWcqUzrx2FnjkT3obOrsGaIj6ZVxy7KohhKm2E?key=FVXEU_3Cgq3J1x73sQtr6Q" alt="Python и создание 2D-игры: что нужно знать разработчику"/></figure>
<p>Еда отобразится на экране более темным цветом зеленого:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXco6PDp8hX3UNsyoWK9C33YFjSXTJG8pRhCHQziziU_HtASXqR5Uq9Mr1xsveDG8gFWJ-G936qH9g8QEalVEMiR2LKN5MtE5igtpRzMoToDy1mJqGC7yAB-aPhZbPiM6BpvDZLL2Nbe0HHBYfuQYOHTn_FQAjgHJTkkEA-bYakZ3BVkTI-jvY8?key=FVXEU_3Cgq3J1x73sQtr6Q" alt="Python и создание 2D-игры: что нужно знать разработчику"/></figure>
<p>Теперь можно научить змейку кушать. Нужно создать условие, в котором проверяется положение головы. Если оно совпадает с едой, задается новое положение для еды, а длина змеи увеличивается на +1.</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXdJwwFoMrMKxEn-D6XafN9lFLWOsk_OXbmBiVrWPG52wBAfozrr9RfpKyjEvtGbl64Y9EAS9kFdIDGuabILdQqrK9Ix_I7oiyUS5ZbVM0YxC-Bu2VbUVU3RaOiJA6L2LcH0wghKzfim8jp5WlOkN01zqYiHgU7p7PC82uu7YIHbTJCO4-6ipQ?key=FVXEU_3Cgq3J1x73sQtr6Q" alt="Python и создание 2D-игры: что нужно знать разработчику"/></figure>
<p>Выше – пример соответствующего кода на PyGame.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D1%82%D0%BE%D0%BB%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5"></span>Столкновение<span class="ez-toc-section-end"></span></h3>
<p>Последний шаг – определение столкновений. Программисту предстоит проверять положение координат головы змеи и размеров окна. Если она соприкасается с границами:</p>
<ul>
<li>устанавливаются новые случайные позиции для головы и еды;</li>
<li>размер змеи уменьшается до исходного;</li>
<li>координаты передвижения обнуляются.</li>
</ul>
<p>Выглядит это так:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXfcHiZnlC3orfVOgQKKuTOWSjPXxr2dPISvSg0uNu-yH9pCc7T8kl-TyUGvJvsZ6psZsfwn9uUMblbcrdXw9AygVywMLFIiKLnTaf_20WcI7R37KdgNfMk0I-DaB9iE7KPlYTqwDZHXRyOcwjgI0uxYSLqP9_CiAlnt7o78drJ_2XdT3E4vzfU?key=FVXEU_3Cgq3J1x73sQtr6Q" alt="Python и создание 2D-игры: что нужно знать разработчику"/></figure>
<p>Змейка в PyGame может столкнуться со своим телом. Это тоже должно привести к концу игры. Для реализации соответствующей задачи создается переменная snake_collision. Она определяет факт пересечения хоть одного прямоугольника тела змеи с ее головой. Лучше всего воспользоваться для ее реализации готовой функцией collidelist() класса Rect из PyGame. После этого предстоит добавить переменную в условие проверки столкновения с границами.</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/docsz/AD_4nXcwYDg_bjmMoCTu5KpKnbpL2tT0AMw1W9MwtYEzo5k0oLqEBpqFabJXKT8cAAfLmVqElIs7XpRVdayZKaL_OZMbC_-K-XNC4Xvg2VLOqVUGFA60MgTUE0qGF8N0oToW_kTg-7LsAfJkyTDcDL5C2XRuv2QyKTlZuea_Ph7MAGGdfRgOutsqhtY?key=FVXEU_3Cgq3J1x73sQtr6Q" alt="Python и создание 2D-игры: что нужно знать разработчику"/></figure>
<p>Вот и все. Классическая «Змейка» на PyGame готова. Ее исходный код включает в себя всего 78 строк. Лучше изучить PyGame, Python и игровую разработку помогут дистанционные компьютерные курсы.</p>
<p>Интересует <a href="https://otus.ru/lessons/python-professional/?utm_source=oj&utm_medium=affilate&utm_campaign=python" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">Python<span class="wpel-icon wpel-image wpel-icon-6"></span></a>? Добро пожаловать на курс в Otus!</p>
</div><!-- .post-content -->
<div class="the-post-foot cf">
<div class="tag-share cf">
<div class="post-tags"><a href="https://otus.ru/journal/tag/python/" rel="tag" data-wpel-link="internal">Python</a></div>
<div class="post-share">
<div class="post-share-icons cf">
<span class="counters">
</span>
<a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fotus.ru%2Fjournal%2Fpython-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku%2F" class="link facebook wpel-icon-right" target="_blank" title="Share on Facebook" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-facebook"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fpython-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku%2F&text=Python%20%D0%B8%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%202D-%D0%B8%D0%B3%D1%80%D1%8B%3A%20%D1%87%D1%82%D0%BE%20%D0%BD%D1%83%D0%B6%D0%BD%D0%BE%20%D0%B7%D0%BD%D0%B0%D1%82%D1%8C%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D1%83" class="link twitter wpel-icon-right" target="_blank" title="Share on Twitter" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-twitter"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fotus.ru%2Fjournal%2Fpython-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku%2F" class="link linkedin wpel-icon-right" target="_blank" title="LinkedIn" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-linkedin"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fpython-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku%2F&media=https%3A%2F%2Fotus.ru%2Fjournal%2Fwp-content%2Fuploads%2F2024%2F07%2Foj-1080x720-2024-07-14T215416.914.jpg&description=Python%20%D0%B8%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%202D-%D0%B8%D0%B3%D1%80%D1%8B%3A%20%D1%87%D1%82%D0%BE%20%D0%BD%D1%83%D0%B6%D0%BD%D0%BE%20%D0%B7%D0%BD%D0%B0%D1%82%D1%8C%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D1%83" class="link pinterest wpel-icon-right" target="_blank" title="Pinterest" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-pinterest-p"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
</div>
</div>
</div>
<div class="post-nav">
<div class="post previous cf">
<a href="https://otus.ru/journal/protokol-ssh-opisanie-preimushhestva-i-nedostatki/" title="Prev Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-left"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/protokol-ssh-opisanie-preimushhestva-i-nedostatki/" class="image-link" rel="previous" data-wpel-link="internal">
<img width="150" height="106" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20106%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Протокол SSH: описание, преимущества и недостатки" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2024/07/oj-1080x720-2024-07-14T213012.194-150x106.jpg 150w, https://otus.ru/journal/wp-content/uploads/2024/07/oj-1080x720-2024-07-14T213012.194-300x212.jpg 300w, https://otus.ru/journal/wp-content/uploads/2024/07/oj-1080x720-2024-07-14T213012.194-1024x724.jpg 1024w, https://otus.ru/journal/wp-content/uploads/2024/07/oj-1080x720-2024-07-14T213012.194-768x543.jpg 768w, https://otus.ru/journal/wp-content/uploads/2024/07/oj-1080x720-2024-07-14T213012.194-1536x1086.jpg 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2024/07/oj-1080x720-2024-07-14T213012.194-150x106.jpg" data-sizes="(max-width: 150px) 100vw, 150px" title="Протокол SSH: описание, преимущества и недостатки" /> </a>
<div class="post-meta">
<span class="label">Prev Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/protokol-ssh-opisanie-preimushhestva-i-nedostatki/" data-wpel-link="internal">Протокол SSH: описание, преимущества и недостатки</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/protokol-ssh-opisanie-preimushhestva-i-nedostatki/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2024-07-14T18:30:35+00:00">14 июля, 2024</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">7 Mins Read</span>
</div>
</div> </div>
</span>
</div>
<div class="post next cf">
<a href="https://otus.ru/journal/proekt-po-archimate/" title="Next Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-right"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/proekt-po-archimate/" class="image-link" rel="next" data-wpel-link="internal">
<img width="150" height="106" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20106%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Проект по Archimate" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2024/07/oj-1080x720-2024-07-14T233921.697-150x106.jpg 150w, https://otus.ru/journal/wp-content/uploads/2024/07/oj-1080x720-2024-07-14T233921.697-300x212.jpg 300w, https://otus.ru/journal/wp-content/uploads/2024/07/oj-1080x720-2024-07-14T233921.697-1024x724.jpg 1024w, https://otus.ru/journal/wp-content/uploads/2024/07/oj-1080x720-2024-07-14T233921.697-768x543.jpg 768w, https://otus.ru/journal/wp-content/uploads/2024/07/oj-1080x720-2024-07-14T233921.697-1536x1086.jpg 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2024/07/oj-1080x720-2024-07-14T233921.697-150x106.jpg" data-sizes="(max-width: 150px) 100vw, 150px" title="Проект по Archimate" /> </a>
<div class="post-meta">
<span class="label">Next Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/proekt-po-archimate/" data-wpel-link="internal">Проект по Archimate</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/proekt-po-archimate/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2024-07-14T20:40:03+00:00">14 июля, 2024</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">3 Mins Read</span>
</div>
</div> </div>
</span>
</div>
</div>
<section class="related-posts grid-3">
<h4 class="section-head"><span class="title">Читать ещё</span></h4>
<div class="ts-row posts cf">
<article class="post col-4">
<a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" title="Уровень готовности CTO к 2026" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Уровень готовности CTO к 2026" title="Уровень готовности CTO к 2026" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" class="post-link" data-wpel-link="internal">Уровень готовности CTO к 2026</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-16T19:50:59+00:00">16 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" title="Новые уроки ноября: только топ-темы по программированию" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Новые уроки ноября: только топ-темы по программированию" title="Новые уроки ноября: только топ-темы по программированию" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" class="post-link" data-wpel-link="internal">Новые уроки ноября: только топ-темы по программированию</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-09T23:24:11+00:00">9 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/schjot-idjot-na-chasy/" title="Счёт идёт на часы" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Счёт идёт на часы" title="Счёт идёт на часы" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-370x245.png 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/schjot-idjot-na-chasy/" class="post-link" data-wpel-link="internal">Счёт идёт на часы</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-10-30T15:04:59+00:00">30 октября, 2025</time>
</div>
</div>
</article >
</div>
</section>
</article> <!-- .the-post -->
</div>
<aside class="col-4 sidebar">
<div class="inner">
<ul>
<li id="search-2" class="widget widget_search"><h5 class="widget-title"><span>Поиск по блогу</span></h5>
<form method="get" class="search-form" action="https://otus.ru/journal/">
<label>
<span class="screen-reader-text">Search for:</span>
<input type="search" class="search-field" placeholder="Введите запрос и нажмите Enter" value="" name="s" title="Search for:" />
</label>
<button type="submit" class="search-submit"><i class="fa fa-search"></i></button>
</form>
</li>
<li id="tag_cloud-5" class="widget widget_tag_cloud"><h5 class="widget-title"><span>Метки</span></h5><div class="tagcloud"><a href="https://otus.ru/journal/tag/android-2/" class="tag-cloud-link tag-link-74 tag-link-position-1" style="font-size: 12.472222222222pt;" aria-label="Android (34 элемента)" data-wpel-link="internal">Android</a>
<a href="https://otus.ru/journal/tag/c-3/" class="tag-cloud-link tag-link-91 tag-link-position-2" style="font-size: 10.916666666667pt;" aria-label="C (23 элемента)" data-wpel-link="internal">C</a>
<a href="https://otus.ru/journal/tag/c-2/" class="tag-cloud-link tag-link-81 tag-link-position-3" style="font-size: 12.666666666667pt;" aria-label="C# (35 элементов)" data-wpel-link="internal">C#</a>
<a href="https://otus.ru/journal/tag/c/" class="tag-cloud-link tag-link-20 tag-link-position-4" style="font-size: 12.472222222222pt;" aria-label="c++ (34 элемента)" data-wpel-link="internal">c++</a>
<a href="https://otus.ru/journal/tag/computer-science/" class="tag-cloud-link tag-link-209 tag-link-position-5" style="font-size: 15.972222222222pt;" aria-label="computer science (78 элементов)" data-wpel-link="internal">computer science</a>
<a href="https://otus.ru/journal/tag/css/" class="tag-cloud-link tag-link-288 tag-link-position-6" style="font-size: 8.6805555555556pt;" aria-label="CSS (13 элементов)" data-wpel-link="internal">CSS</a>
<a href="https://otus.ru/journal/tag/data-science/" class="tag-cloud-link tag-link-151 tag-link-position-7" style="font-size: 8pt;" aria-label="Data Science (11 элементов)" data-wpel-link="internal">Data Science</a>
<a href="https://otus.ru/journal/tag/devops/" class="tag-cloud-link tag-link-98 tag-link-position-8" style="font-size: 10.138888888889pt;" aria-label="devops (19 элементов)" data-wpel-link="internal">devops</a>
<a href="https://otus.ru/journal/tag/docker/" class="tag-cloud-link tag-link-143 tag-link-position-9" style="font-size: 8.2916666666667pt;" aria-label="Docker (12 элементов)" data-wpel-link="internal">Docker</a>
<a href="https://otus.ru/journal/tag/gamedev/" class="tag-cloud-link tag-link-25 tag-link-position-10" style="font-size: 11.694444444444pt;" aria-label="gamedev (28 элементов)" data-wpel-link="internal">gamedev</a>
<a href="https://otus.ru/journal/tag/hr/" class="tag-cloud-link tag-link-103 tag-link-position-11" style="font-size: 8pt;" aria-label="hr (11 элементов)" data-wpel-link="internal">hr</a>
<a href="https://otus.ru/journal/tag/html/" class="tag-cloud-link tag-link-217 tag-link-position-12" style="font-size: 11.208333333333pt;" aria-label="HTML (25 элементов)" data-wpel-link="internal">HTML</a>
<a href="https://otus.ru/journal/tag/ios/" class="tag-cloud-link tag-link-101 tag-link-position-13" style="font-size: 8.9722222222222pt;" aria-label="iOS (14 элементов)" data-wpel-link="internal">iOS</a>
<a href="https://otus.ru/journal/tag/it/" class="tag-cloud-link tag-link-50 tag-link-position-14" style="font-size: 10.527777777778pt;" aria-label="IT (21 элемент)" data-wpel-link="internal">IT</a>
<a href="https://otus.ru/journal/tag/java/" class="tag-cloud-link tag-link-75 tag-link-position-15" style="font-size: 15.680555555556pt;" aria-label="Java (73 элемента)" data-wpel-link="internal">Java</a>
<a href="https://otus.ru/journal/tag/javascript/" class="tag-cloud-link tag-link-83 tag-link-position-16" style="font-size: 14.319444444444pt;" aria-label="JavaScript (53 элемента)" data-wpel-link="internal">JavaScript</a>
<a href="https://otus.ru/journal/tag/linux/" class="tag-cloud-link tag-link-141 tag-link-position-17" style="font-size: 11.888888888889pt;" aria-label="Linux (29 элементов)" data-wpel-link="internal">Linux</a>
<a href="https://otus.ru/journal/tag/machine-learning/" class="tag-cloud-link tag-link-167 tag-link-position-18" style="font-size: 8.6805555555556pt;" aria-label="Machine Learning (13 элементов)" data-wpel-link="internal">Machine Learning</a>
<a href="https://otus.ru/journal/tag/otus-book/" class="tag-cloud-link tag-link-261 tag-link-position-19" style="font-size: 9.9444444444444pt;" aria-label="otus book (18 элементов)" data-wpel-link="internal">otus book</a>
<a href="https://otus.ru/journal/tag/php/" class="tag-cloud-link tag-link-45 tag-link-position-20" style="font-size: 10.527777777778pt;" aria-label="PHP (21 элемент)" data-wpel-link="internal">PHP</a>
<a href="https://otus.ru/journal/tag/python/" class="tag-cloud-link tag-link-27 tag-link-position-21" style="font-size: 16.944444444444pt;" aria-label="Python (99 элементов)" data-wpel-link="internal">Python</a>
<a href="https://otus.ru/journal/tag/qa/" class="tag-cloud-link tag-link-155 tag-link-position-22" style="font-size: 11.402777777778pt;" aria-label="qa (26 элементов)" data-wpel-link="internal">qa</a>
<a href="https://otus.ru/journal/tag/sql/" class="tag-cloud-link tag-link-38 tag-link-position-23" style="font-size: 12.861111111111pt;" aria-label="SQL (37 элементов)" data-wpel-link="internal">SQL</a>
<a href="https://otus.ru/journal/tag/team-lead/" class="tag-cloud-link tag-link-364 tag-link-position-24" style="font-size: 9.9444444444444pt;" aria-label="team lead (18 элементов)" data-wpel-link="internal">team lead</a>
<a href="https://otus.ru/journal/tag/unity/" class="tag-cloud-link tag-link-24 tag-link-position-25" style="font-size: 8pt;" aria-label="unity (11 элементов)" data-wpel-link="internal">unity</a>
<a href="https://otus.ru/journal/tag/algoritmy/" class="tag-cloud-link tag-link-30 tag-link-position-26" style="font-size: 9.9444444444444pt;" aria-label="Алгоритмы (18 элементов)" data-wpel-link="internal">Алгоритмы</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh/" class="tag-cloud-link tag-link-40 tag-link-position-27" style="font-size: 10.138888888889pt;" aria-label="Базы данных (19 элементов)" data-wpel-link="internal">Базы данных</a>
<a href="https://otus.ru/journal/tag/matematika/" class="tag-cloud-link tag-link-44 tag-link-position-28" style="font-size: 10.916666666667pt;" aria-label="Математика (23 элемента)" data-wpel-link="internal">Математика</a>
<a href="https://otus.ru/journal/tag/arhitektura-po/" class="tag-cloud-link tag-link-10 tag-link-position-29" style="font-size: 9.4583333333333pt;" aria-label="архитектура ПО (16 элементов)" data-wpel-link="internal">архитектура ПО</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh-2/" class="tag-cloud-link tag-link-251 tag-link-position-30" style="font-size: 10.138888888889pt;" aria-label="базы данных (19 элементов)" data-wpel-link="internal">базы данных</a>
<a href="https://otus.ru/journal/tag/vebinar/" class="tag-cloud-link tag-link-201 tag-link-position-31" style="font-size: 13.930555555556pt;" aria-label="вебинар (48 элементов)" data-wpel-link="internal">вебинар</a>
<a href="https://otus.ru/journal/tag/dajdzhest/" class="tag-cloud-link tag-link-308 tag-link-position-32" style="font-size: 10.722222222222pt;" aria-label="дайджест (22 элемента)" data-wpel-link="internal">дайджест</a>
<a href="https://otus.ru/journal/tag/zapis-vebinara/" class="tag-cloud-link tag-link-226 tag-link-position-33" style="font-size: 14.902777777778pt;" aria-label="запись вебинара (61 элемент)" data-wpel-link="internal">запись вебинара</a>
<a href="https://otus.ru/journal/tag/zapis-uroka/" class="tag-cloud-link tag-link-272 tag-link-position-34" style="font-size: 16.069444444444pt;" aria-label="запись урока (80 элементов)" data-wpel-link="internal">запись урока</a>
<a href="https://otus.ru/journal/tag/informacionnaya-bezopasnost/" class="tag-cloud-link tag-link-232 tag-link-position-35" style="font-size: 10.138888888889pt;" aria-label="информационная безопасность (19 элементов)" data-wpel-link="internal">информационная безопасность</a>
<a href="https://otus.ru/journal/tag/karera-v-it/" class="tag-cloud-link tag-link-292 tag-link-position-36" style="font-size: 9.9444444444444pt;" aria-label="карьера в IT (18 элементов)" data-wpel-link="internal">карьера в IT</a>
<a href="https://otus.ru/journal/tag/podborka/" class="tag-cloud-link tag-link-7 tag-link-position-37" style="font-size: 12.666666666667pt;" aria-label="подборка (35 элементов)" data-wpel-link="internal">подборка</a>
<a href="https://otus.ru/journal/tag/podborka-statej/" class="tag-cloud-link tag-link-219 tag-link-position-38" style="font-size: 15.777777777778pt;" aria-label="подборка статей (75 элементов)" data-wpel-link="internal">подборка статей</a>
<a href="https://otus.ru/journal/tag/programmirovanie/" class="tag-cloud-link tag-link-65 tag-link-position-39" style="font-size: 22pt;" aria-label="программирование (332 элемента)" data-wpel-link="internal">программирование</a>
<a href="https://otus.ru/journal/tag/proekt/" class="tag-cloud-link tag-link-321 tag-link-position-40" style="font-size: 11.888888888889pt;" aria-label="проект (29 элементов)" data-wpel-link="internal">проект</a>
<a href="https://otus.ru/journal/tag/proektnaya-rabota/" class="tag-cloud-link tag-link-310 tag-link-position-41" style="font-size: 11.597222222222pt;" aria-label="проектная работа (27 элементов)" data-wpel-link="internal">проектная работа</a>
<a href="https://otus.ru/journal/tag/seti/" class="tag-cloud-link tag-link-181 tag-link-position-42" style="font-size: 12.958333333333pt;" aria-label="сети (38 элементов)" data-wpel-link="internal">сети</a>
<a href="https://otus.ru/journal/tag/testirovanie/" class="tag-cloud-link tag-link-69 tag-link-position-43" style="font-size: 13.930555555556pt;" aria-label="тестирование (48 элементов)" data-wpel-link="internal">тестирование</a>
<a href="https://otus.ru/journal/tag/upravlenie-komandoj/" class="tag-cloud-link tag-link-63 tag-link-position-44" style="font-size: 11.694444444444pt;" aria-label="управление командой (28 элементов)" data-wpel-link="internal">управление командой</a>
<a href="https://otus.ru/journal/tag/habr-2/" class="tag-cloud-link tag-link-203 tag-link-position-45" style="font-size: 13.930555555556pt;" aria-label="хабр (48 элементов)" data-wpel-link="internal">хабр</a></div>
</li>
</ul>
</div>
</aside>
</div> <!-- .ts-row -->
</div> <!-- .main -->
<footer class="main-footer dark bold">
<section class="lower-footer cf">
<div class="wrap">
<div class="links">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov-1" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
<p class="copyright"> © 2015-2026 OTUS </p>
<div class="to-top">
<a href="#" class="back-to-top"><i class="fa fa-angle-up"></i> Top</a>
</div>
</div>
</section>
</footer>
</div> <!-- .main-wrap -->
<div class="mobile-menu-container off-canvas" id="mobile-menu">
<a href="#" class="close"><i class="fa fa-times"></i></a>
<div class="logo">
</div>
<ul class="mobile-menu"></ul>
</div>
<div class="search-modal-wrap">
<div class="search-modal-box" role="dialog" aria-modal="true">
<form method="get" class="search-form" action="https://otus.ru/journal/">
<input type="search" class="search-field" name="s" placeholder="Search..." value="" required />
<button type="submit" class="search-submit visuallyhidden">Submit</button>
<p class="message">
Type above and press <em>Enter</em> to search. Press <em>Esc</em> to cancel. </p>
</form>
</div>
</div>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/js/url-span.js" id="wbcr-comments-plus-url-span-js"></script>
<script type="text/javascript" id="ez-toc-scroll-scriptjs-js-extra">
/* <![CDATA[ */
var eztoc_smooth_local = {"scroll_offset":"30"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js" id="ez-toc-scroll-scriptjs-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js" id="ez-toc-js-cookie-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js" id="ez-toc-jquery-sticky-kit-js"></script>
<script type="text/javascript" id="ez-toc-js-js-extra">
/* <![CDATA[ */
var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"<span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span>"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js" id="ez-toc-js-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/custom-script.js" id="custom-script-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/magnific-popup.js" id="magnific-popup-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.fitvids.js" id="jquery-fitvids-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/imagesloaded.min.js" id="imagesloaded-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/object-fit-images.js" id="object-fit-images-js"></script>
<script type="text/javascript" id="contentberg-theme-js-extra">
/* <![CDATA[ */
var Bunyad = {"custom_ajax_url":"\/journal\/python-i-sozdanie-2d-igry-chto-nuzhno-znat-razrabotchiku\/"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theme.js" id="contentberg-theme-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theia-sticky-sidebar.js" id="theia-sticky-sidebar-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.slick.js" id="jquery-slick-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jarallax.js" id="jarallax-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/masonry.min.js" id="masonry-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.masonry.min.js" id="jquery-masonry-js"></script>
</body>
</html>
<!-- Cache served by breeze CACHE - Last modified: Tue, 10 Mar 2026 18:41:56 GMT -->