Python (Питон) – это высокоуровневый язык программирования общего назначения. Он обладает строгой типизацией и автоматическим управлением памятью. Широко используется современными программистами для написания самых разных приложений и утилит – от драйверов и систем до игр.
Этот язык разработки обладает понятным синтаксисом, который напоминает английский. Исходный код приложения получается читабельным. Для этого языка поддерживаются различные библиотеки и фреймворки, а также иные инструменты. Они предназначаются для более быстрого программирования.
Далее предстоит разобраться с тем, как делать игры на Python. Необходимо выяснить, что должен знать разработчик, составить небольшой предварительный план действий, а также изучить инструменты, помогающие писать на Питоне. В качестве наглядного примера будет приведена игра «Змейка». Она является элементарным примером для начинающих программистов. Требует минимум усилий и предварительной подготовки.
Как писать игры – краткий план действий
Программирование игр, согласно Google – перспективное направление разработки. Это касается не только Python, но и других языков. Готовый проект, если он хорошо продуман и грамотно реализован, может принести неплохую прибыль.
Для того, чтобы писать игры, рекомендуется придерживаться следующего плана:
- Выбрать язык для дальнейшего изучения. На данный момент – это Python.
- Выучить основы Питона. Их будет достаточно для того, чтобы написать первую простую игру.
- Придумать сюжет и определить жанр. На этом этапе желательно проанализировать потребности целевой аудитории.
- Разработать дизайн, физику, анимацию.
- Написать программный код.
- Соединить все элементы игры в единый проект.
- Протестировать получившийся продукт. По мере необходимости – организовать его отладку и повторное тестирование.
- Выложить готовый релиз в общий доступ.
Сначала может показаться, что программирование игр – легкая задача. Это не так. В Google полно информации о том, как создавать развлекательный контент. Каждый проект, особенно если он пишется «с нуля», требует детальной проработки и качественного тестирования. На создание дизайна, физики, анимации и исходного кода у команды может уйти немало времени и сил.
Разработка через движки
Код игры, согласно данным из Google, можно создавать различными способами. Предыдущий алгоритм актуален для разработки «с нуля». Такой вариант позволяет получать уникальные проекты на выходе.
Есть еще один вариант программирования развлекательного контента – через специальные программы. Они называются движками. Многие современные движки поддерживают работу с Python.
Разработка через движки – более быстрый вариант создания первого проекта. В них уже имеются некоторые фоны, фигуры, а также иные элементы ��ля будущего приложения. В движках, согласно Google, задана физика, механика и другие параметры. Все, что нужно будет разработчику – подставить свои объекты на экране, добавить изменения в настройки и параметры на экране, а затем сформировать готовый проект.
Для программирования на Python рекомендуется использовать Unreal Engine, Unity, Godot. В Google о них полно информации и видео-уроков.
Библиотека PyGame
Программирование игр на Python может производиться несколькими способами. Один из наиболее эффективных – разработка «с нуля». Далее будет рассмотрен именно такой подход. Он хорошо реализуется при помощи библиотеки Питона. Она называется PyGame.
Py Game – известная Питон-библиотека, которая предназначена для создания игр под самые разные устройства:
- Linux;
- Windows;
- MacOS;
- Android.
С ее помощью получается не просто описать геймплей, а еще и работать с мышью, звуком, видео и другим подключаемым оборудованием.
Первая версия Py Game была создана Питом Шиннерсом еще в октябре 2000-го года. С тех пор библиотека активно разрабатывалась и обновлялась. Сейчас у нее большое сообщество, а по работе с этим инструментом, согласно данным Google, написано несколько десятков книг. В Сети полно видеообзоров и уроков по осваиванию библиотеки. Актуальная версия – 2.1.2.
Инициализация
Google указывает на то, что Pygame – это не самостоятельная библиотека. Она представляет собой обертку для библиотеки SDL (Simple DirectMedia Player). Именно с ее помощью удается использовать любые внешние устройства. Примеры – клавиатура и мышь, геймпад или джойстик. Py Games делает работу с ними удобной непосредственно для разработчика.
Установка инструмента простая – она осуществляется через терминал. Достаточно открыть его (или командную строку) и воспользоваться pip:
Pip install Pygame
Если в процессе установки возникают ошибки и сбои, можно воспользоваться официальной документацией. В ней описаны особенности инициализации на различных операционных системах, а также наиболее распространенные неполадки и способы их решения.
Модули
Google указывает на то, что PyGame включает в себя несколько готовых модулей. Модули дают возможность получить доступ к определенному устройству. Они включают в себя методы для работы с оборудованием. Пример – модуль display. Он предназначается для работы с экраном. Если использовать модуль joystick – происходит считывание движения джойстика.
После импорта библиотеки нужно инициировать ее через команду pygame.int(). Этот прием позволит применять любые методы любых функций, включенных в библиотеку модулей. Без инициализации проект может утратить свою кроссплатформенность.
Игровое поле
Написание игрового контента для начинающих через Питон – не самая сложная задача, если начинать с небольших проектов. PyGame включает в себя несколько Python-классов, которые умеют работать с концепциями, не зависящими от аппаратных устройств. Сюда можно отнести:
Surface отвечает за определение прямоугольной области, на которой допускается дальнейшее рисование. Если перенести соответствующее явление на практику, то этот класс используется для формирования игрового поля. Он широко используется в Pygame. В создаваемом далее проекте Surface будет тоже применен.
Для вывода информации на игровом поле используется класс display. Игровое поле может быть полноэкранным или оконным. Display создается при помощи функции .set_mode(), которая будет возвращать Surface, представленной видимой частью окна. Именно она передается в функции рисования – pygame.draw.circle. Содержимое соответствующего Surface выводится на экран при помощи обращения к команде pygame.display.flip().
Изображения
Для работы с изображениями можно выбрать один из нескольких вариантов: создавать их с нуля прямо на экране или использовать готовые картинки с жесткого диска. Оба варианта поддерживают:
- перезапись;
- загрузку;
- сохранение в различных форматах.
Изображения – это не самостоятельные элементы. Они должны быть загружены в Surface-объекты, которые допускают корректирование и вывод на дисплей различными методами.
Прямоугольники чаще всего используются в Surface. Для них, согласно Google, существует отдельный класс – Rect. Такие объекты применяются для самых разных задач – создания фигур персонажей, управления взаимодействиями и так далее.
Создание «Змейки»
Создание игры на языке Python может отнять много времени и сил. Поэтому далее будет более подробно разобран наглядный пример разработки «Змейки». С соответствующей игрушкой знакомы как ПК-пользователи, так и любители консолей.
Правила игры
Перед непосредственным программированием необходимо продумать общую концепцию итогового продукта. А именно – правила. Для «Змейки» они являются базовыми. Все эти принципы оказывают определенное влияние на геймплей:
- целью игры является набор как можно большего очков за счет увеличения длины змейки на экране;
- если змейка «съедает» специальный объект на экране, ее длина увеличивается на один блок;
- начало игры – в левой стороне поля;
- пользователю разрешено двигаться во все стороны, но не по диагонали;
- нельзя двигаться за пределы экрана;
- при столкновении змейки с границами игрового поля раунд заканчивается;
- раунд прекращается, если змейка врезается сама в себя.
Также раунд прекращается, если пользователь самостоятельно закроет игровое окно. Google называет все эти правила базовыми. Они легко запоминаются и присутствуют почти в каждой вариации «Змейки» для тех или иных устройств. В некоторых сборках можно «проходить сквозь стены», но это уже более сложный случай.
Запуск Python
Теперь предстоит рассмотреть разработку развлекательного программного обеспечения на Питоне более подробно. Писать код рекомендуется в специальном редакторе. Здесь предлагаются следующие варианты:
- Использование специализированных IDE: Visual Studio Code или IntelliJ IDEA. Этот вариант Google называет самым эффективным и удобным. В IDE есть дополнительные инструменты, способствующие более быстрой разработке. Пример – подсветка синтаксиса. Многие программисты предпочитают пользоваться Visual Studio Code.
- Использование терминала на Linux или MacOS. В качестве альтернативного решения подойдет командная строка Windows. Для этого нужно предварительно установить Python в операционную систему.
Как только язык программирования будет загружен в ОС, можно загрузить саму библиотеку Pygame:
Для дальнейшего труда над проектом все готово. Можно создавать пустой Python-файл и приступить к разработке с нуля.
Создание поля
Для создания игрового поля при помощи изучаемой библиотеки необходимо воспользоваться специальной функцией – display.set.mode(). В нее передается желаемый размер окна. Единицы измерения – в пикселях. Также нужно использовать методы init и quit для установки библиотеки в начале кода и ее деинициализации в конце.
При помощи метода update удается обновлять содержимое экрана. Есть метод flip, который работает точно также, как и update. Разница заключается только в том, что update обновляет только что внесенные изменения, а flip будет перерисовывать экран целиком. Если в update не передавать никаких параметров, произойдет полное обновление дисплея.
При запуске указанного кода экран запустится и тут же закроется. Это связано с тем, что управление передается pygame.quit. Она используется для отключения библиотеки и поля. Для устранения соответствующего явления нужно использовать цикл while. Он не позволит игровому окну тут же закрываться:
Здесь добавлены две сущности:
- название игры;
- функция отслеживания игровых событий.
Чтобы у игрового поля появилось название, нужно задействовать .set_caption(«»), где в кавычках указывается «имя» окна. Функция event.get вернет в терминал все события, происходящие на поле.
А вот – код, который появится после создания кнопки «Выход».
Создание змеи
В качестве змейки используется прямоугольник. Он создается при помощи функции draw.rect(). В ней можно задать размер и цвет прямоугольников:
Python использует в своей работе стандартную RGB-схему. Это значит, что любой цвет на экране представляет собой комбинации из красного, зеленого и синего цветов. Интенсивность этих компонентов может меняться для получения того или иного результата.
Описание движений
Для управления перемещениями можно использовать специальный класс Pygame – keydown. Он дает возможность использовать 4 стандартных события с клавиатуры:
- k_up;
- k_down;
- k_left;
- k_right.
Они будут соответствовать движению змейки вверх, вниз, влево и вправо соответственно.
Срабатывание любого события из класса keydown приводит к изменению положения змейки. Пусть шагом движения будут 10 пикселей:
Здесь требуется создать две переменные – x1_change и y1_change. Они используются для хранения значений координат первой клетки змейки по осям x и y.
Препятствия
Если змейка попадает в Python Games на границу экрана, пользователь проигрывает. Раунд заканчивается. Это правило может быть реализовано через if-оператор. Он определит координаты x и y для змейки и проанализирует их – происходит ли выход за границы заданного поля или нет:
Теперь, если змейка попадет на границу поля, раунд завершится, а пользователь увидит сообщение «Вы проиграли».
Еда
Для добавления «еды» на поле нужно использовать библиотеку random. Она отвечает за случайное появление «корма» в пределах игрового окна. Когда змейка проходит через еду, ее длина увеличивается. Эта операция будет добавлена позже. Сначала нужно обеспечить случайное появление «корма» для змейки:
Еда отобразится на экране черным квадратом. Если выполнить условие завершения игры, на экране появится характерное сообщение с предложением выхода или перезапуска партии.
Увеличение длины
Теперь можно дополнить код, чтобы длина змейки после поедания корма увеличивалась. Для этого используется список. В нем будет сохраняться текущая длина змейки. Во внимание должно приниматься еще одно правило – при столкновении головы с телом игра заканчивается:
Здесь также изменены цвета игрового поля и змейки за счет увеличения их контрастности. Так проект будет выглядеть более привлекательно и эффектно.
Счет
Чтобы было интереснее играть, в «Змейке» должен вестись счет. Для этого используется функция Your_score, которая создается разработчиком. Она отображает длину змейки, вычитая из нее 1 (ведь 1 – это первоначальный размер объекта на поле, он не является достижением).
Отдельно необходимо записать правило, помогающее определить длину змейки. Это та самая операция с вычетом единицы:
Теперь на экране появится надпись со счетом. Она обновляется каждый раз, когда пользователь «съедает» очередную порцию еды на экране.
Лучше разобраться с программированием игр на Питоне и других языках с нуля помогут дистанционные компьютерные курсы. Пример – от OTUS. Они позволяют в комфортном режиме освоить любой язык разработки «с нуля». 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 OTUS</title>
<!-- All in One SEO 4.5.2.1 - aioseo.com -->
<meta name="description" content="Python (Питон) – это высокоуровневый язык программирования общего назначения. Он обладает строгой типизацией и автоматическим управлением памятью. Широко используется современными программистами для написания самых разных приложений и утилит – от драйверов и систем до игр. Этот язык разработки обладает понятным синтаксисом, который напоминает английский. Исходный код приложения получается читабельным. Для этого языка поддерживаются различные библиотеки" />
<meta name="robots" content="max-image-preview:large" />
<link rel="canonical" href="https://otus.ru/journal/kak-napisat-igru-na-python/" />
<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\/kak-napisat-igru-na-python\/#article","name":"\u041a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u043d\u0430 Python OTUS","headline":"\u041a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u043d\u0430 Python","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\/2023\/11\/oj-1080x72036-1.jpg","width":2245,"height":1587},"datePublished":"2023-11-14T22:10:32+00:00","dateModified":"2023-12-19T19:01:50+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/otus.ru\/journal\/kak-napisat-igru-na-python\/#webpage"},"isPartOf":{"@id":"https:\/\/otus.ru\/journal\/kak-napisat-igru-na-python\/#webpage"},"articleSection":"\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, gamedev, Python"},{"@type":"BreadcrumbList","@id":"https:\/\/otus.ru\/journal\/kak-napisat-igru-na-python\/#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\/kak-napisat-igru-na-python\/#listItem"},{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/kak-napisat-igru-na-python\/#listItem","position":2,"name":"\u041a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u043d\u0430 Python","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\/kak-napisat-igru-na-python\/#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\/kak-napisat-igru-na-python\/#webpage","url":"https:\/\/otus.ru\/journal\/kak-napisat-igru-na-python\/","name":"\u041a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u043d\u0430 Python OTUS","description":"Python (\u041f\u0438\u0442\u043e\u043d) \u2013 \u044d\u0442\u043e \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041e\u043d \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u0433\u043e\u0439 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c\u044e. \u0428\u0438\u0440\u043e\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c\u0438 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0443\u0442\u0438\u043b\u0438\u0442 \u2013 \u043e\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0438 \u0441\u0438\u0441\u0442\u0435\u043c \u0434\u043e \u0438\u0433\u0440. \u042d\u0442\u043e\u0442 \u044f\u0437\u044b\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/otus.ru\/journal\/#website"},"breadcrumb":{"@id":"https:\/\/otus.ru\/journal\/kak-napisat-igru-na-python\/#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\/2023\/11\/oj-1080x72036-1.jpg","@id":"https:\/\/otus.ru\/journal\/kak-napisat-igru-na-python\/#mainImage","width":2245,"height":1587},"primaryImageOfPage":{"@id":"https:\/\/otus.ru\/journal\/kak-napisat-igru-na-python\/#mainImage"},"datePublished":"2023-11-14T22:10:32+00:00","dateModified":"2023-12-19T19:01:50+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/8017" /><link rel='shortlink' href='https://otus.ru/journal/?p=8017' />
<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%2Fkak-napisat-igru-na-python%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%2Fkak-napisat-igru-na-python%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-8017 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-8017" class="the-post post-8017 post type-post status-publish format-standard has-post-thumbnail category-polza tag-gamedev 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
</h1>
<a href="https://otus.ru/journal/kak-napisat-igru-na-python/" class="date-link" data-wpel-link="internal"><time class="post-date">14 ноября, 2023</time></a>
</div>
<div class="featured">
<a href="https://otus.ru/journal/wp-content/uploads/2023/11/oj-1080x72036-1.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" title="Как написать игру на Python" decoding="async" fetchpriority="high" data-srcset="https://otus.ru/journal/wp-content/uploads/2023/11/oj-1080x72036-1-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2023/11/oj-1080x72036-1-270x180.jpg 270w" data-src="https://otus.ru/journal/wp-content/uploads/2023/11/oj-1080x72036-1-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%9A%D0%B0%D0%BA_%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C_%D0%B8%D0%B3%D1%80%D1%8B_%E2%80%93_%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%B8%D0%B9_%D0%BF%D0%BB%D0%B0%D0%BD_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B9" title="Как писать игры – краткий план действий">Как писать игры – краткий план действий</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-2" href="#%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D0%B4%D0%B2%D0%B8%D0%B6%D0%BA%D0%B8" title="Разработка через движки">Разработка через движки</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-3" href="#%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0_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-4" href="#%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F" title="Инициализация">Инициализация</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-5" href="#%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D0%B8" title="Модули">Модули</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-6" href="#%D0%98%D0%B3%D1%80%D0%BE%D0%B2%D0%BE%D0%B5_%D0%BF%D0%BE%D0%BB%D0%B5" title="Игровое поле">Игровое поле</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-7" href="#%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%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-8" href="#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%C2%AB%D0%97%D0%BC%D0%B5%D0%B9%D0%BA%D0%B8%C2%BB" title="Создание «Змейки»">Создание «Змейки»</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-9" href="#%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%B8%D0%B3%D1%80%D1%8B" title="Правила игры">Правила игры</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-10" href="#%D0%97%D0%B0%D0%BF%D1%83%D1%81%D0%BA_Python" title="Запуск Python">Запуск Python</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-11" href="#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D0%BB%D1%8F" title="Создание поля">Создание поля</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-12" href="#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B7%D0%BC%D0%B5%D0%B8" title="Создание змеи">Создание змеи</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-13" href="#%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B2%D0%B8%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9" 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%9F%D1%80%D0%B5%D0%BF%D1%8F%D1%82%D1%81%D1%82%D0%B2%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-15" href="#%D0%95%D0%B4%D0%B0" title="Еда">Еда</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-16" href="#%D0%A3%D0%B2%D0%B5%D0%BB%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B4%D0%BB%D0%B8%D0%BD%D1%8B" 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%D1%87%D0%B5%D1%82" title="Счет">Счет</a></li></ul></li></ul></nav></div>
<p>Python (Питон) – это высокоуровневый язык программирования общего назначения. Он обладает строгой типизацией и автоматическим управлением памятью. Широко используется современными программистами для написания самых разных приложений и утилит – от драйверов и систем до игр.</p>
<p>Этот язык разработки обладает понятным синтаксисом, который напоминает английский. Исходный код приложения получается читабельным. Для этого языка поддерживаются различные библиотеки и фреймворки, а также иные инструменты. Они предназначаются для более быстрого программирования.</p>
<p>Далее предстоит разобраться с тем, как делать игры на Python. Необходимо выяснить, что должен знать разработчик, составить небольшой предварительный план действий, а также изучить инструменты, помогающие писать на Питоне. В качестве наглядного примера будет приведена игра «Змейка». Она является элементарным примером для начинающих программистов. Требует минимум усилий и предварительной подготовки.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%B0%D0%BA_%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C_%D0%B8%D0%B3%D1%80%D1%8B_%E2%80%93_%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%B8%D0%B9_%D0%BF%D0%BB%D0%B0%D0%BD_%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B9"></span>Как писать игры – краткий план действий<span class="ez-toc-section-end"></span></h2>
<p>Программирование игр, согласно Google – перспективное направление разработки. Это касается не только Python, но и других языков. Готовый проект, если он хорошо продуман и грамотно реализован, может принести неплохую прибыль.</p>
<p>Для того, чтобы писать игры, рекомендуется придерживаться следующего плана:</p>
<ol>
<li>Выбрать язык для дальнейшего изучения. На данный момент – это Python.</li>
<li>Выучить основы Питона. Их будет достаточно для того, чтобы написать первую простую игру.</li>
<li>Придумать сюжет и определить жанр. На этом этапе желательно проанализировать потребности целевой аудитории.</li>
<li>Разработать дизайн, физику, анимацию.</li>
<li>Написать программный код.</li>
<li>Соединить все элементы игры в единый проект.</li>
<li>Протестировать получившийся продукт. По мере необходимости – организовать его отладку и повторное тестирование.</li>
<li>Выложить готовый релиз в общий доступ.</li>
</ol>
<p>Сначала может показаться, что программирование игр – легкая задача. Это не так. В Google полно информации о том, как создавать развлекательный контент. Каждый проект, особенно если он пишется «с нуля», требует детальной проработки и качественного тестирования. На создание дизайна, физики, анимации и исходного кода у команды может уйти немало времени и сил.</p>
<h3 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_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D0%B4%D0%B2%D0%B8%D0%B6%D0%BA%D0%B8"></span>Разработка через движки<span class="ez-toc-section-end"></span></h3>
<p>Код игры, согласно данным из Google, можно создавать различными способами. Предыдущий алгоритм актуален для разработки «с нуля». Такой вариант позволяет получать уникальные проекты на выходе.</p>
<p>Есть еще один вариант программирования развлекательного контента – через специальные программы. Они называются движками. Многие современные движки поддерживают работу с Python.</p>
<p>Разработка через движки – более быстрый вариант создания первого проекта. В них уже имеются некоторые фоны, фигуры, а также иные элементы для будущего приложения. В движках, согласно Google, задана физика, механика и другие параметры. Все, что нужно будет разработчику – подставить свои объекты на экране, добавить изменения в настройки и параметры на экране, а затем сформировать готовый проект.</p>
<p>Для программирования на Python рекомендуется использовать Unreal Engine, Unity, Godot. В Google о них полно информации и видео-уроков.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0_PyGame"></span>Библиотека PyGame<span class="ez-toc-section-end"></span></h2>
<p>Программирование игр на Python может производиться несколькими способами. Один из наиболее эффективных – разработка «с нуля». Далее будет рассмотрен именно такой подход. Он хорошо реализуется при помощи библиотеки Питона. Она называется PyGame.</p>
<p>Py Game – известная Питон-библиотека, которая предназначена для создания игр под самые разные устройства:</p>
<ul>
<li>Linux;</li>
<li>Windows;</li>
<li>MacOS;</li>
<li>Android.</li>
</ul>
<p>С ее помощью получается не просто описать геймплей, а еще и работать с мышью, звуком, видео и другим подключаемым оборудованием.</p>
<p>Первая версия Py Game была создана Питом Шиннерсом еще в октябре 2000-го года. С тех пор библиотека активно разрабатывалась и обновлялась. Сейчас у нее большое сообщество, а по работе с этим инструментом, согласно данным Google, написано несколько десятков книг. В Сети полно видеообзоров и уроков по осваиванию библиотеки. Актуальная версия – 2.1.2.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F"></span>Инициализация<span class="ez-toc-section-end"></span></h3>
<p>Google указывает на то, что Pygame – это не самостоятельная библиотека. Она представляет собой обертку для библиотеки SDL (Simple DirectMedia Player). Именно с ее помощью удается использовать любые внешние устройства. Примеры – клавиатура и мышь, геймпад или джойстик. Py Games делает работу с ними удобной непосредственно для разработчика.</p>
<p>Установка инструмента простая – она осуществляется через терминал. Достаточно открыть его (или командную строку) и воспользоваться pip:</p>
<p><em>Pip install Pygame</em></p>
<p>Если в процессе установки возникают ошибки и сбои, можно <a href="https://www.pygame.org/wiki/GettingStarted" 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>. В ней описаны особенности инициализации на различных операционных системах, а также наиболее распространенные неполадки и способы их решения.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D0%B8"></span>Модули<span class="ez-toc-section-end"></span></h3>
<p>Google указывает на то, что PyGame включает в себя несколько готовых модулей. Модули дают возможность получить доступ к определенному устройству. Они включают в себя методы для работы с оборудованием. Пример – модуль display. Он предназначается для работы с экраном. Если использовать модуль joystick – происходит считывание движения джойстика.</p>
<p>После импорта библиотеки нужно инициировать ее через команду pygame.int(). Этот прием позволит применять любые методы любых функций, включенных в библиотеку модулей. Без инициализации проект может утратить свою кроссплатформенность.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D0%B3%D1%80%D0%BE%D0%B2%D0%BE%D0%B5_%D0%BF%D0%BE%D0%BB%D0%B5"></span>Игровое поле<span class="ez-toc-section-end"></span></h3>
<p>Написание игрового контента для начинающих через Питон – не самая сложная задача, если начинать с небольших проектов. PyGame включает в себя несколько Python-классов, которые умеют работать с концепциями, не зависящими от аппаратных устройств. Сюда можно отнести:</p>
<ul>
<li>surface;</li>
<li>display.</li>
</ul>
<p>Surface отвечает за определение прямоугольной области, на которой допускается дальнейшее рисование. Если перенести соответствующее явление на практику, то этот класс используется для формирования игрового поля. Он широко используется в Pygame. В создаваемом далее проекте Surface будет тоже применен.</p>
<p>Для вывода информации на игровом поле используется класс display. Игровое поле может быть полноэкранным или оконным. Display создается при помощи функции .set_mode(), которая будет возвращать Surface, представленной видимой частью окна. Именно она передается в функции рисования – pygame.draw.circle. Содержимое соответствующего Surface выводится на экран при помощи обращения к команде pygame.display.flip().</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F"></span>Изображения<span class="ez-toc-section-end"></span></h3>
<p>Для работы с изображениями можно выбрать один из нескольких вариантов: создавать их с нуля прямо на экране или использовать готовые картинки с жесткого диска. Оба варианта поддерживают:</p>
<ul>
<li>перезапись;</li>
<li>загрузку;</li>
<li>сохранение в различных форматах.</li>
</ul>
<p>Изображения – это не самостоятельные элементы. Они должны быть загружены в Surface-объекты, которые допускают корректирование и вывод на дисплей различными методами.</p>
<p>Прямоугольники чаще всего используются в Surface. Для них, согласно Google, существует отдельный класс – Rect. Такие объекты применяются для самых разных задач – создания фигур персонажей, управления взаимодействиями и так далее.</p>
<h2 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_%C2%AB%D0%97%D0%BC%D0%B5%D0%B9%D0%BA%D0%B8%C2%BB"></span>Создание «Змейки»<span class="ez-toc-section-end"></span></h2>
<p>Создание игры на языке Python может отнять много времени и сил. Поэтому далее будет более подробно разобран наглядный пример разработки «Змейки». С соответствующей игрушкой знакомы как ПК-пользователи, так и любители консолей.</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_%D0%B8%D0%B3%D1%80%D1%8B"></span>Правила игры<span class="ez-toc-section-end"></span></h3>
<p>Перед непосредственным программированием необходимо продумать общую концепцию итогового продукта. А именно – правила. Для «Змейки» они являются базовыми. Все эти принципы оказывают определенное влияние на геймплей:</p>
<ul>
<li>целью игры является набор как можно большего очков за счет увеличения длины змейки на экране;</li>
<li>если змейка «съедает» специальный объект на экране, ее длина увеличивается на один блок;</li>
<li>начало игры – в левой стороне поля;</li>
<li>пользователю разрешено двигаться во все стороны, но не по диагонали;</li>
<li>нельзя двигаться за пределы экрана;</li>
<li>при столкновении змейки с границами игрового поля раунд заканчивается;</li>
<li>раунд прекращается, если змейка врезается сама в себя.</li>
</ul>
<p>Также раунд прекращается, если пользователь самостоятельно закроет игровое окно. Google называет все эти правила базовыми. Они легко запоминаются и присутствуют почти в каждой вариации «Змейки» для тех или иных устройств. В некоторых сборках можно «проходить сквозь стены», но это уже более сложный случай.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%97%D0%B0%D0%BF%D1%83%D1%81%D0%BA_Python"></span>Запуск Python<span class="ez-toc-section-end"></span></h3>
<p>Теперь предстоит рассмотреть разработку развлекательного программного обеспечения на Питоне более подробно. Писать код рекомендуется в специальном редакторе. Здесь предлагаются следующие варианты:</p>
<ol>
<li>Использование специализированных IDE: Visual Studio Code или IntelliJ IDEA. Этот вариант Google называет самым эффективным и удобным. В IDE есть дополнительные инструменты, способствующие более быстрой разработке. Пример – подсветка синтаксиса. Многие программисты предпочитают пользоваться Visual Studio Code.</li>
<li>Использование терминала на Linux или MacOS. В качестве альтернативного решения подойдет командная строка Windows. Для этого нужно предварительно установить Python в операционную систему.</li>
</ol>
<p>Как только язык программирования будет загружен в ОС, можно загрузить саму библиотеку Pygame:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/4MO1O1A9BKCfou-QsTkBYH30VCAME-vx63_IkwbQZrbsfOyAJxfdpssNnNg8C7gsCPcbIgSoDn23ks8W0LI1HBXDVgM-o1aUdA26jPHcJ0D9ddXlO48J1lrCyy8JjjX5LxbV8wuz-Yct15YS0opseg" alt="Как написать игру на Python"/></figure>
<p>Для дальнейшего труда над проектом все готово. Можно создавать пустой Python-файл и приступить к разработке с нуля.</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%D0%BE%D0%BB%D1%8F"></span>Создание поля<span class="ez-toc-section-end"></span></h3>
<p>Для создания игрового поля при помощи изучаемой библиотеки необходимо воспользоваться специальной функцией – display.set.mode(). В нее передается желаемый размер окна. Единицы измерения – в пикселях. Также нужно использовать методы init и quit для установки библиотеки в начале кода и ее деинициализации в конце.</p>
<p>При помощи метода update удается обновлять содержимое экрана. Есть метод flip, который работает точно также, как и update. Разница заключается только в том, что update обновляет только что внесенные изменения, а flip будет перерисовывать экран целиком. Если в update не передавать никаких параметров, произойдет полное обновление дисплея.</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/BgWXPOeNA7hFlse70BZfq0bv5-uCRG9TUfxzPvqtvIClODBONLGJIqGFMrBhY_4ZLAEZhDTR901tzIVeDAlbuEf_kfuUdEt1Watmq-WRk4Sr_fKasxBhHS6UM9xbXU6MWJFmwboUvFIOg_5FlO4mrA" alt="Как написать игру на Python"/></figure>
<p>При запуске указанного кода экран запустится и тут же закроется. Это связано с тем, что управление передается pygame.quit. Она используется для отключения библиотеки и поля. Для устранения соответствующего явления нужно использовать цикл while. Он не позволит игровому окну тут же закрываться:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/0kQXbIEkLRHoxr2DDQLf9Gn1qNZN4tCVP_0dBqIZup3A968BhXxYAdUYwLH5x3LbsV9DdWhuw3i_AAfWNgpY76V6UPPjIDqfy8edWdECiSBLCFksBzcy8X3_VU8Hom2Iup_lz4gBjyhjV3zD9sWjiA" alt="Как написать игру на Python"/></figure>
<p>Здесь добавлены две сущности:</p>
<ul>
<li>название игры;</li>
<li>функция отслеживания игровых событий.</li>
</ul>
<p>Чтобы у игрового поля появилось название, нужно задействовать .set_caption(«»), где в кавычках указывается «имя» окна. Функция event.get вернет в терминал все события, происходящие на поле.</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/D8lH0DRy7zfUhgQnp5aR7d1LBr2ANhO9Sz8AwEPaQg19Sjm6AdKCJpqmp-B7GXsXNTEPh24r83BQ566n8QD6W9zGJF4qe0CzBdn-l_BwMo8hQDduavVn2lfr2yeVm6nviIy-kR8lzUsPZVEJ_H8-Sg" alt="Как написать игру на Python"/></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%B7%D0%BC%D0%B5%D0%B8"></span>Создание змеи<span class="ez-toc-section-end"></span></h3>
<p>В качестве змейки используется прямоугольник. Он создается при помощи функции draw.rect(). В ней можно задать размер и цвет прямоугольников:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/gmlMKtjiunU7Ns825hDmcoQkGy-qH_vclsJso0LU8rFGLaeT8gV8VJHsw2CMGiFGoRRZeUmoWP5lvmJ0pH9de-Zgp__H8_ftJFtFL-LY_tShodyV7mW0IQ5EQc4fJxJuxYrpYPPk1Qm20phKDObRvQ" alt="Как написать игру на Python"/></figure>
<p>Python использует в своей работе стандартную RGB-схему. Это значит, что любой цвет на экране представляет собой комбинации из красного, зеленого и синего цветов. Интенсивность этих компонентов может меняться для получения того или иного результата.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B2%D0%B8%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9"></span>Описание движений<span class="ez-toc-section-end"></span></h3>
<p>Для управления перемещениями можно использовать специальный класс Pygame – keydown. Он дает возможность использовать 4 стандартных события с клавиатуры:</p>
<ul>
<li>k_up;</li>
<li>k_down;</li>
<li>k_left;</li>
<li>k_right.</li>
</ul>
<p>Они будут соответствовать движению змейки вверх, вниз, влево и вправо соответственно. </p>
<p>Срабатывание любого события из класса keydown приводит к изменению положения змейки. Пусть шагом движения будут 10 пикселей:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/vhN67355zNtKBh_NlWIg76onQNvuuj1dSgM5AgTFVbfM_Z6opW2ridI3FnA43y7FFKlagnSebHmqHkXyd1Ngcw-3lsymaYRTlqux7LY9Mw1cqwAn8NDxoOOgqH3VcgHGNIcx0r3dtDl3_AUv2SuIxQ" alt="Как написать игру на Python"/></figure>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/pFsu0zl-Chs9cFarw1xTEsO2Kx3cgrfp5bv3-1ZJfSwIR6UJb2G_I53Aacm4AdcIW1bj0uY_mcNbGUy0-b_-EdsfmH57XkIlOqykk1bgQjoVGQgsQgkSOF8BpeZ_aVZuhE1-0fW5mMJsPWTD1YgKQw" alt="Как написать игру на Python"/></figure>
<p>Здесь требуется создать две переменные – x1_change и y1_change. Они используются для хранения значений координат первой клетки змейки по осям x и y.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%B5%D0%BF%D1%8F%D1%82%D1%81%D1%82%D0%B2%D0%B8%D1%8F"></span>Препятствия<span class="ez-toc-section-end"></span></h3>
<p>Если змейка попадает в Python Games на границу экрана, пользователь проигрывает. Раунд заканчивается. Это правило может быть реализовано через if-оператор. Он определит координаты x и y для змейки и проанализирует их – происходит ли выход за границы заданного поля или нет:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/2MTDvvg5auyOyUDcX2S6zIjVsAw7E_by27z2UaogLQBd0f56LFlD92kN7yxLB-qYluLlvTOBdmkszSuTBgxqgbayng06UKBsBvP6xKF0wvv0BIc1uRoun39WI2OFghZQ-V2oB2jVYNq_ZhMkl90lJw" alt="Как написать игру на Python"/></figure>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/eGFxKA1fbDM3gE9qxDS781qnrlSErX0Gsscs7w0qZ-coE8j4y4F6VYoZ5Qq_pyBUfgw9LMGYt0S8zZ1Pd7Dvg11GvMt_F4JE3TNID0v5jj3ZGFzuDKoYFxAQ8970EbqC-LmEnhqpFi5BiyzkVXCThw" alt="Как написать игру на Python"/></figure>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/TgJkViiCJLq_o_A4Hz5FVjVCgkZtWZ0GZND3SkwI9HhUJ5cRxnbvVzR3-kREj01-edT3xYEuYBd8XuKF51QqgZPurG01MOEXHFX0KIWRX0b7PmaeYcpaF7b2AcnAn3sNcSU7u7gyIw3o7Y3zkVOXFw" alt="Как написать игру на Python"/></figure>
<p>Теперь, если змейка попадет на границу поля, раунд завершится, а пользователь увидит сообщение «Вы проиграли».</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%95%D0%B4%D0%B0"></span>Еда<span class="ez-toc-section-end"></span></h2>
<p>Для добавления «еды» на поле нужно использовать библиотеку random. Она отвечает за случайное появление «корма» в пределах игрового окна. Когда змейка проходит через еду, ее длина увеличивается. Эта операция будет добавлена позже. Сначала нужно обеспечить случайное появление «корма» для змейки:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/2uFzc3TD9bu4NEYb6KGitqsRjjQCDuDLgLVbrHJZvxzD10cMYAxT27OFfqtO8iB9DfWYwM5NYAaAw3hpunCVtsjMPr05kyGRFNCkcZth_cUAJf5-0nslVUg3X5uHd1ZYO9MwXZZJd5z3jkYeVPyY0A" alt="Как написать игру на Python"/></figure>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/udZ_zTbYWzQR6JcyK-93O7rEowEqm5b5k4suGdKPpZc8zKVaBeUn6rKYijK0q6Ry3I4IOG0pxpsLCuQpf5epw3PPr1LyoW9KTHFIfoFjGTG_5lQV-2eNKa5IDZzEsibUJWaSB8t7AwJIrFU-7hEA2A" alt="Как написать игру на Python"/></figure>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/SrNUtUJEGr2aOInLpZh4WIqf1xv7o3mHZ4H6nL6Ufgh1OYjKJ_dc7B1XJ9F5pyt5TugCNFH1bFlbKf9nyZURfD8J145tTy7REOXU2cr129X62Un9CeFdSMR54cExYa0gQEJ7qTAlvX-fr17PYDvMLw" alt="Как написать игру на Python"/></figure>
<p>Еда отобразится на экране черным квадратом. Если выполнить условие завершения игры, на экране появится характерное сообщение с предложением выхода или перезапуска партии.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A3%D0%B2%D0%B5%D0%BB%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B4%D0%BB%D0%B8%D0%BD%D1%8B"></span>Увеличение длины<span class="ez-toc-section-end"></span></h3>
<p>Теперь можно дополнить код, чтобы длина змейки после поедания корма увеличивалась. Для этого используется список. В нем будет сохраняться текущая длина змейки. Во внимание должно приниматься еще одно правило – при столкновении головы с телом игра заканчивается:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/R_H9I22pNQF5Eyn1nJyhp75Ve485rmBy_GFBudpMFkWl3ro2XHw94VYSZa8KJsQvcQUEbieQh2fSoavnLeyqiwtO6rDfPBuXiZ0i-J96a47i5AV1bBGAl019JNowIvqTANWXCADQvJ_7tUN9Chw10g" alt="Как написать игру на Python"/></figure>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/hE8FzPtk6PWUxb2EofeQIoq8M8xl3LkAqx_YtNZ0F21hzdVLtFTm5431zjIaA9Q0RkTxVnaZY8iMmaRgSfqWx24od76OH6idA9NlTm9aOHg5yO7T7SpRDOyb1EeQJD61WzQN2HGpu_pTIsE-eUDhQA" alt="Как написать игру на Python"/></figure>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/Gq9YokN8CsS7mAfmyEdqxTvQ9EHdDKy6S5iEi0QpIZV8a5pA8M9K5sdulMk0MOu10273aDfV75goayAolmnQkDS579nsBhzJepsWVE4CXdHd9k1QWFxt57MfRRihLjSA4p6UzTCJG1dNByxtYCmKmg" alt="Как написать игру на Python"/></figure>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/Jqwn71tiQzlJyydPXzdYrg7SueQGrKe405VpiXKBMH8lxa79IyEUN8j7BFPsWxbCMuMKAzTUjdjh9-1eZHz0eX5rZ1QOsZCPVi15YRDE0jVpHYCFv8zMjvSSczw_BV-o2W197YBR1i5CTgCYIIFflQ" alt="Как написать игру на Python"/></figure>
<p>Здесь также изменены цвета игрового поля и змейки за счет увеличения их контрастности. Так проект будет выглядеть более привлекательно и эффектно.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D1%87%D0%B5%D1%82"></span>Счет<span class="ez-toc-section-end"></span></h3>
<p>Чтобы было интереснее играть, в «Змейке» должен вестись счет. Для этого используется функция Your_score, которая создается разработчиком. Она отображает длину змейки, вычитая из нее 1 (ведь 1 – это первоначальный размер объекта на поле, он не является достижением).</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/2PUpY94oSUzz7H0IhEIjaq4SB_hCU7aDhO_8BCoxhBP0UWHkUKAsaUFxY6RaeTTtTG8rZPn9HaHpBvk4HJ8PjoK2WSYyNNHFu3TgSan7tgXV3w23e4zMEcLsEdYzfjzwgCGiZttNDw-At3kfz65_PA" alt="Как написать игру на Python"/></figure>
<p>Отдельно необходимо записать правило, помогающее определить длину змейки. Это та самая операция с вычетом единицы:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh7-us.googleusercontent.com/na2s1s5jOB5kbOPnYHJTsZwRRpEI4V5bv0oa7dWX6E5FG7lpVwBd4KbBK3--8UhCErA4gu4Um9FjE19k9wccbGsxIXXn3S8j4vBgMLJiRBN0KPnweZ3QReQSPpddjXQ7JGNzOC1HxDIyx7jQjK8Z1g" alt="Как написать игру на Python"/></figure>
<p>Теперь на экране появится надпись со счетом. Она обновляется каждый раз, когда пользователь «съедает» очередную порцию еды на экране.</p>
<p>Лучше разобраться с программированием игр на Питоне и других языках с нуля помогут дистанционные компьютерные курсы. Пример – от OTUS. Они позволяют в комфортном режиме освоить любой язык разработки «с нуля». 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/gamedev/" rel="tag" data-wpel-link="internal">gamedev</a><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%2Fkak-napisat-igru-na-python%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%2Fkak-napisat-igru-na-python%2F&text=%D0%9A%D0%B0%D0%BA%20%D0%BD%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D0%B8%D0%B3%D1%80%D1%83%20%D0%BD%D0%B0%20Python" 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%2Fkak-napisat-igru-na-python%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%2Fkak-napisat-igru-na-python%2F&media=https%3A%2F%2Fotus.ru%2Fjournal%2Fwp-content%2Fuploads%2F2023%2F11%2Foj-1080x72036-1.jpg&description=%D0%9A%D0%B0%D0%BA%20%D0%BD%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C%20%D0%B8%D0%B3%D1%80%D1%83%20%D0%BD%D0%B0%20Python" 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/chto-takoe-front-end-opisanie-professii-i-ee-osobennosti/" 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/chto-takoe-front-end-opisanie-professii-i-ee-osobennosti/" 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="Что такое front-end: описание профессии и ее особенности" decoding="async" data-srcset="https://otus.ru/journal/wp-content/uploads/2023/11/oj-1080x72035-1-150x106.jpg 150w, https://otus.ru/journal/wp-content/uploads/2023/11/oj-1080x72035-1-300x212.jpg 300w, https://otus.ru/journal/wp-content/uploads/2023/11/oj-1080x72035-1-1024x724.jpg 1024w, https://otus.ru/journal/wp-content/uploads/2023/11/oj-1080x72035-1-768x543.jpg 768w, https://otus.ru/journal/wp-content/uploads/2023/11/oj-1080x72035-1-1536x1086.jpg 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2023/11/oj-1080x72035-1-150x106.jpg" data-sizes="(max-width: 150px) 100vw, 150px" title="Что такое front-end: описание профессии и ее особенности" /> </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/chto-takoe-front-end-opisanie-professii-i-ee-osobennosti/" data-wpel-link="internal">Что такое front-end: описание профессии и ее особенности</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/chto-takoe-front-end-opisanie-professii-i-ee-osobennosti/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2023-11-14T21:51:10+00:00">14 ноября, 2023</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">8 Mins Read</span>
</div>
</div> </div>
</span>
</div>
<div class="post next cf">
<a href="https://otus.ru/journal/gps-opisanie-princip-raboty-alternativy/" 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/gps-opisanie-princip-raboty-alternativy/" 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="GPS: описание, принцип работы, альтернативы" decoding="async" data-srcset="https://otus.ru/journal/wp-content/uploads/2023/11/oj-1080x72037-1-150x106.jpg 150w, https://otus.ru/journal/wp-content/uploads/2023/11/oj-1080x72037-1-300x212.jpg 300w, https://otus.ru/journal/wp-content/uploads/2023/11/oj-1080x72037-1-1024x724.jpg 1024w, https://otus.ru/journal/wp-content/uploads/2023/11/oj-1080x72037-1-768x543.jpg 768w, https://otus.ru/journal/wp-content/uploads/2023/11/oj-1080x72037-1-1536x1086.jpg 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2023/11/oj-1080x72037-1-150x106.jpg" data-sizes="(max-width: 150px) 100vw, 150px" title="GPS: описание, принцип работы, альтернативы" /> </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/gps-opisanie-princip-raboty-alternativy/" data-wpel-link="internal">GPS: описание, принцип работы, альтернативы</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/gps-opisanie-princip-raboty-alternativy/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2023-11-15T20:29:59+00:00">15 ноября, 2023</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">12 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\/kak-napisat-igru-na-python\/"};
/* ]]> */
</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: Mon, 09 Mar 2026 15:29:38 GMT -->