Один из первых практических проектов в курсах по Python-разработке в Практикуме — это классическая «Змейка». Несмотря на одинаковые стартовые условия, все студенты подходят к её решению по-разному. Рассказываем, как написать игру для портфолио уже через месяц обучения, и показываем шесть вариантов — с «отравой», сбрасыванием хвоста, а также барсуками и кошками.

В создании материала участвовали:

«Каждый разработчик хотя бы раз писал “Змейку”»: как игра появилась в учебной программе

В ранних версиях курса по Python-разработке в Практикуме было много практики, но почти вся она была «тру бэкендерской» — студенты отрабатывали навыки, пополняли работами портфолио, но редко доводили проекты до наглядной формы. Результатом выполнения таких заданий был код, взаимодействовать с которым иногда можно было только в консоли. А пользу программы было трудно показать друзьям и знакомым не из IT-среды, да и оценить как пользователю самостоятельно.

Чтобы исправить ситуацию, команда курсов по Python-разработке заменила проекты на более «осязаемые». Это значит, что результат выполнения таких заданий можно сразу «пощупать» и показать другим людям.

Это лишь одно из больших изменений, которое команда внесла в программу, — автор и техлид курсов по Python-разработке Евгений Бартенев рассказывал об этом более подробно в материале «Как прошло обновление курса “Python-разработчик”: новые сюжеты, Pytest и переработка алгоритмов».

Теперь первый серьёзный и самостоятельный проект в программе называется «Изгиб питона». И это не что иное как «Змейка» — классическая игра родом из 70-х, которая стала хитом кнопочных телефонов.

Такое изображение знакомо каждому, у кого был Тетрис в 90-х или кнопочный телефон в 2000-х
Такое изображение знакомо каждому, у кого был Тетрис в 90-х или кнопочный телефон в 2000-х

«Перед заданием в уроке было сказано: “Каждый разработчик должен хотя бы раз в жизни написать ,Змейку‘”. И это хорошо мотивирует!» — Марина Асташова, студентка

Задача-минимум была такой: реализовать «Змейку» так, чтобы в ней соблюдались базовые правила классической игры. Задача-максимум: придумать свои дополнения, механики и другие решения, которые сделают игру уникальной.

«”Изгиб питона” студентам понравился. С одной стороны, на этом этапе они только начинают учиться, а с другой — они уже делают что-то вполне реальное, во что можно поиграть, что можно развивать в будущем.

А ещё раньше на выходе у студентов получались одинаковые или сильно похожие друг на друга работы. Ситуация усугублялась жёсткими ограничениями автоматических тестов. Теперь мы не загоняем студентов в жёсткие рамки. А значит, начиная с первого проекта они собирают уникальные портфолио, код в которых не повторяется, — а после индивидуальной работы с ревьюерами и подавно», — Евгений Бартенев, автор и техлид курсов по Python-разработке

Но некоторые ограничения для студентов всё-таки есть. Так, игра должна быть основана на прекоде от команды курса, код должен быть написан с использованием ООП, а в реализации должна применяться библиотека Pygame.

«Мы понимаем, что написать “Змейку” — не что-то сверхъестественное. За время существования игры написаны тысячи её вариантов, а в открытом доступе есть много инструкций. Но первый проект и не должен быть непреодолимым. Важнее, чтобы он был полезным и интересным.

А что касается инструкций — студенты, конечно, могут найти информацию в интернете, но задание построено так, что сдать чужое решение не получится, а платформа и ревьюеры позаботятся о том, чтобы не пропустить плагиат», — Евгений Бартенев, автор и техлид курсов по Python-разработке

В этом материале мы расскажем истории нескольких студенческих «Змеек», покажем, как они выглядят, и поделимся ссылками на код. Возможно, не идеальный — во-первых, студенты делают «Изгиб питона» примерно через пару месяцев после начала обучения, а во-вторых, некоторые доработки вносились ими после сдачи задания, а значит, ревьюер мог их не проверить.

Змейка №1: питон стал барсуком, а яблоки — котами

До поступления в Практикум опыт Анны Ланской был скромным — работа, бизнес и жизнь студентки связаны с IT, но программированием она не занималась.

«Змейка» от Анны выделяется графикой и концепцией: змея в игре стала барсуком, а место яблок заняли коты. Добавлена система очков, ускорение и замедление при поедании яблок-котов разных типов. Также на игровом поле появляются дружественные объекты, которые надо обходить, чтобы сохранить очки.

Нейросети, возможно, и не заменят специалистов, но нарисовать простенькие изображения уже могут
Нейросети, возможно, и не заменят специалистов, но нарисовать простенькие изображения уже могут

Вся графическая часть игры сделана нейросетью и обработана в графическом редакторе.

«В задании был пункт “Можете добавить графику”. Это и подтолкнуло меня к изменению самой концепции — у меня дома как раз живут два барсука и кошка. Правда, сдать проект в таком виде уже не получилось, так как система тестирования не пропустила бы работу с такими серьёзными изменениями», — Анна Ланская

Самым сложным для Анны было реализовать проект по техническому заданию. Остальное — просто полёт фантазии.

«В целом у меня получилось всё сделать так, как я представляла. Я даже сделала версию с exe-файлом, но проект всё-таки шуточный, выкладывать никуда не стала. К тому же, боюсь, любители животных не оценят игру, в которой основная цель сводится к поеданию котов. Возможно, это было бы актуально лет 15–20 назад, но уже не в наше время. Впрочем, каждый желающий может скачать игру на GitHub, так как код находится в открытом доступе», — Анна Ланская

Посмотреть код на GitHub →

Змейка №2: сложная механика с камнем

Александра Соколова можно назвать относительно опытным студентом: в техникуме он учился Visual Basic и Pascal, а потом, работая в торговле, увлекался Unity как хобби. После он дважды поступал в Практикум, но забрасывал обучение из-за работы.

«Даже когда я работал в торговле, мне хотелось делать игры, заниматься творческим программированием. Причём больше меня увлекала инди-разработка — когда за игру отвечает один человек или небольшая команда», — Александр Соколов

Первая особенность реализации Александра встречает игрока на старте — студент добавил в «Змейку» меню, чтобы в будущем пользователь мог зайти в него, посмотреть статистику, начать новую или продолжить старую игру.

Александр понимал, что проект учебный, — но старался для себя и ревьюера
Александр понимал, что проект учебный, — но старался для себя и ревьюера

Также в версии Александра появилась новая механика. Если змейка съедает камень, то не погибает сразу. Вместо этого от неё отсекается часть длины, а камень отлетает по направлению движения, при этом раскидывая всё, с чем сталкивается. И у этой механики есть история.

«Когда я творчески подхожу к проекту, то стараюсь закладывать какие-то точки, чтобы в дальнейшем было проще развивать и улучшать его. Так и тут — я сделал для яблок и камней два класса, которые отличались по названию, но были идентичными по содержанию. Ревью такой подход не прошёл, так как нарушает базовый принцип DRY, и для зачёта требовалось объединить их в один класс. Так как у меня было своё видение, а вступать в полемику времени не было, я придумал дополнительный функционал для камня, чтобы создание независимого класса имело смысл и было логичным решением», — Александр Соколов

«Змейка» Александра далека от завершения — в ней нет полноценной концовки, возможностей тонкой настройки, случайных событий и дополнительных механик, постепенно повышающих сложность игры. Для сдачи проекта на курсе это не требуется, но Александр хочет доработать игру в будущем.

«Это отличный пет-проект для портфолио, который в перспективе сможет хорошо показать, на что я способен как разработчик и насколько глубоко погружаюсь в задачу. Ну и в целом — я был бы рад, если бы кто-то когда-нибудь просто хорошо провёл время за моей игрой, даже если это будут всего пять–десять человек», — Александр Соколов

Посмотреть код на GitHub →

Змейка №3: плавные движения и борьба со змееботами

Когда Марина Асташова приступила к заданию, весь её опыт работы с Python сводился к двум месяцам обучения. До этого Марина занималась графическим дизайном и была уверена, что программирование — это очень сложно и доступно только избранным.

Небольшое количество опыта не помешало Марине реализовать одну из самых сложных «Змеек». Вот некоторые из особенностей ее реализации.

  • Скорость змейки растёт на каждом третьем яблоке. За счёт этого сложность повышается постепенно, а игрок успевает адаптироваться.

  • Есть два режима сложности: easy и hard. Выбор режима тоже влияет на скорость змейки.

  • Во время игры можно включить режим экстра-яблок. В нём на поле появляются разные их варианты: яркие прибавляют длину змейки и увеличивают её скорость, а серые, наоборот, замедляют и отбирают ячейки. У каждого яблока подписано числовое значение от -3 до 3 — настолько меняется длина змейки при поедании.

  • Предусмотрен режим змееботов. В нём на игровом поле появляются две змейки, которые двигаются сами по себе, также поедают яблоки, растут и уменьшаются. Если одна змейка окружает другую, то забирает все ячейки себе. А если сталкивается с ней, то погибает.

Головы змейки и змееботов отсылают к логотипу Python
Головы змейки и змееботов отсылают к логотипу Python
  • Рекорды остаются в памяти игры, пока идёт игровая сессия. Кроме того, данные о них сохраняются в отдельном файле. Можно посмотреть, чтобы постараться перебить достижения друга.

  • Движения змейки фиксируются не по ячейкам, а по пикселям — в результате, чтобы съесть яблоко, достаточно не занять его место полностью, а только коснуться. Подобную механику Марина подсмотрела в игре «Слизарио», а для реализации ей понадобилось вспомнить школьный курс геометрии и составить формулу для расчёта расстояния между точками.

Изначально Марина не планировала добавлять новые функции и механики — все идеи родились во время доработки по правкам ревьюера.

«Сначала я просто хотела сдать зачёт и успеть до дедлайна. Но когда ревьюер Андрей Квичанский, помимо исправления ошибок, предложил поработать над структурой, содержанием и, можно сказать, философией игры, я загорелась и захотела сделать что-то вроде “Слизарио”, придумать что-то необычное. Спасибо Андрею — он меня направлял и давал подсказки.

Например, мне было трудно реализовать режим со змееботами — изначально при отключении режима они просто прекращали взаимодействовать с игроком и перекрашивались в цвет фона, становились невидимыми. В какой-то момент это начало меня пугать — вот играю я в “Змейку”, а невидимые змееботы в это время обхаживают меня и пытаются укусить… Андрей подсказал, что лучше построить логику не на цвете, а на атрибуте активности каждого объекта. Получилось корректно и совсем не крипово», — Марина Асташова

Марина планирует продолжить работу над проектом и добавить сетевой режим, чтобы играть в «Змейку» можно было с друзьями. Но это потом — сейчас она хочет доучиться и освоить JavaScript.

«Интернет-браузеры не понимают код, написанный на Python. Знаю, что есть Web Assembly, с помощью которого можно перевести проект в веб, но, как я поняла по туториалам, это решение нестабильное и не очень хорошо работает. Поэтому я бы хотела переписать игру на JavaScript. А пока её можно запустить в формате EXE», — Марина Асташова

Скачать приложение →
Посмотреть код на GitHub →

Змейка №4: ностальгия по Тетрису и Mortal Kombat

Владислав Ляско никогда не занимался программированием, а в Практикум пришёл после 13 лет работы руководителем в ресторанной сфере. У кого-то получается схватывать новый материал на лету, но не у Владислава. У него часто возникали трудности, которые тормозили процесс обучения, и это отставание от однокурсников его нередко пугало.

Главная особенность «Змейки» от Владислава — второй экран справа от игрового поля. На нём находится счётчик очков, а также правила игры. Механика осталась базовая: есть красные яблоки, которые при поедании добавляют очки и увеличивают скорость змейки, а есть синие, столкновение с которыми ведёт к проигрышу. Владислав решил не добавлять ничего необычного, следуя, как говорит студент, одному из принципов философии Python — простое лучше, чем сложное.

Графику Владислав оставил пиксельной, как дань ностальгии по классической «Змейке» с Тетриса. Из-за любви к играм 90-х Владислав добавил ещё одну пасхалку — сообщение на экране при столкновении с «отравой».

На этом моменте в голове должен прозвучать голос Скорпиона из Mortal Kombat
На этом моменте в голове должен прозвучать голос Скорпиона из Mortal Kombat

Игра давалась Владиславу сложно. Сначала он не обратил внимание на приложенный к заданию прекод, который нельзя было игнорировать. Поэтому первая версия игры не прошла даже автоматическую проверку. После ориентации на прекод пришло время проверок ревьюером, и он пять раз возвращал код Владиславу на доработку с комментариями о том, как сделать код качественнее и лаконичнее.

«Мне хотелось рвать на себе волосы и кричать — почему оно не работает? Что я сделал не так? К счастью, в самые страшные моменты я был дома один, и супруга с детьми не видели всего этого. После второй-третьей доработки мне хотелось всё бросить, но на следующий день удавалось собраться с мыслями и продолжать работу над кодом», — Владислав Ляско

В будущем Владислав хочет написать и другие игры, попробовать повторить несложные проекты других разработчиков, переработать их под себя. Не для портфолио — просто для тренировки.

Посмотреть код на GitHub →

Змейка №5: сбрасывание кожи и иллюзия плавного движения

Валерий Ходорищенко — один из самых опытных студентов, выполнивших задание. В институте он изучал язык программирования для инженеров MATLAB, а потом осваивал разработку самостоятельно. В портфолио Валерия есть проекты посложнее «Змейки» — например, программа, которая переводит выделенный текст в PDF-файлах.

Валерий добавил в игру следующие функции.

  • Через каждые пять съеденных яблок змея сбрасывает кожу. Кожа становится дополнительным препятствием — если змея съедает её, то становится короче и скидывает кожу снова.

  • Цвета квадратиков, из которых состоит змейка, меняются, что создаёт иллюзию движения и отражения кожи на солнце.

  • Кнопка Shift вызывает ускорение.

Со временем препятствий становится больше, а змейка ползёт быстрее
Со временем препятствий становится больше, а змейка ползёт быстрее

«Изгиб питона» в Практикуме стал третьей «Змейкой» Валерия, но первой, которую принимал профессиональный ревьюер. Поэтому студент поначалу не относился к заданию серьёзно, но переосмыслил свой подход после третьего возвращения проекта на доработку.

«Мне понравилась сложность ревью. Я не соглашался с ревьюером и хотел реализовать код по-своему, но потом подумал, что у наставника точно больше опыта и если он чего-то от меня хочет, то это имеет смысл. А ещё, что уметь следовать чужим правилам — это полезный навык, который пригодится в работе», — Валерий Ходорищенко

Сейчас Валерий хочет сконцентрироваться на более продуктовых проектах, так как «Змейка» меньше интересует работодателей, чем, например, продающий сайт или сервис, который можно применить в бизнесе. Но, возможно, вернётся к написанию игр в качестве тренировки.

Скачать приложение →
Посмотреть код на GitHub →

Змейка №6: базовая механика и много анимации

Александр Комков подошёл к заданию относительно подготовленным: он уже писал программы на Python, создавал приложения с графическом интерфейсом на Kivy и даже пробовал написать платформер с помощью Pygame.

Особенность его «Змейки» бросается в глаза сразу — это графика. В игре есть меню, много анимаций и переходов.

Змейка движется плавно, а яблоки появляются с анимацией фейерверка
Змейка движется плавно, а яблоки появляются с анимацией фейерверка

Механика при этом осталась самой простой: ни камней, ни отравы, ни стен. Просто змейка и яблоки. Так и было задумано.

«Когда я прочитал задание и примеры необязательных опций вроде “плохой еды”, я сразу решил повернуть “не туда” — сделать иначе и сосредоточиться на визуальных изменениях. Идею для оформления подсказал онлайн-сервис, который превращает текст в пиксель-арт», — Александр Комков

Александр подчёркивает, что его «Змейку» трудно назвать полноценной игрой. Скорее, концептом игры, так как многие из идей он не успел реализовать к дедлайну. Например, в меню должны были появиться маленькие змейки, которых игрок будет гонять мышкой.

«Я бы хотел вернуться к “Змейке” в будущем, но, если честно, у меня уже столько проектов, которые я хотел бы доработать…» — Александр Комков

Посмотреть код на GitHub →


Это лишь часть работ — на деле интересных «Змеек» было куда больше шести. Более того, команда курса отмечает, что каждый проект был по-своему интересен и уникален.

«Проблемы уникального портфолио и мотивации учиться дальше — очень важны. Мы хотим, чтобы наши студенты выделялись, а их глаза горели. И появление в программе “Изгиба питона” — верный шаг в этом направлении.

Такие задания нравятся даже тем, кто не ставит целью трудоустройство. Ведь это всё равно круто — сделать через пару месяцев учёбы что-то реальное, что можно использовать самому или показать другим, не объясняя перед этим, что такое бэкенд», — Евгений Бартенев, автор и техлид курсов по Python-разработке

Если вы хотите написать свой первый код на Python и подготовиться к созданию реальных проектов, познакомьтесь с основами языка на бесплатном курсе «Основы Pyhton-разработки». За 20 часов вы узнаете, чем занимаются бэкенд-разработчики, освоите базовый синтаксис Python и напишете первую программу.

Комментарии (17)


  1. Andrey_Solomatin
    03.05.2024 06:30

    Так, игра должна быть основана на прекоде от команды курса, код должен быть написан с использованием ООП

    Так сделайте шаблон готового репозитория где будут requirements.txt, ридми, настроенные линтеры, прекоммитхуки и всё подготовленное для написания тестов.

    Это некоторый оверхед для студентов, но зато с места в настоящую разработку. И это будет проект который не стыдно показать.


    1. bartenev_ev
      03.05.2024 06:30

      На самом деле именно так и сделано: студентам на базе шаблона генерируется индивидуальный репозиторий, который уже содержит базовый прекод, тесты, настройки линтера и прочее. В итоге ревьюер получает работу, в которой уже не надо тратить время на замечания по поводу форматирования или на проверку ключевых пунктов из задания, а можно сфокусироваться на самом коде и на лучших практиках.


      1. Andrey_Solomatin
        03.05.2024 06:30

        Некоторые репозитории в примерах этого не видно.


    1. kvichans
      03.05.2024 06:30
      +1

      Это будет уже не "оверхед", а чистый "кыш отсюда" для большей части студентов. Ведь многие приходят совсем зеленые (вот как Марина в статье).

      Курс рассчитан на постепенное погружение в настоящую разработку - после года обучения они уже все перечисленное: requirements.txt, ридми, линтеры и даже больше - понимают и применяют.

      А в первом проекте это не нужно. Лучше не пугать, а мотивировать на обучение.


      1. Andrey_Solomatin
        03.05.2024 06:30

        С учётом того что большая часть этого придёт из шаблона и понимать это не надо, а нужно просто пользоваться, то не так уж и сложно как вы описали. Гит с гитхабом и то сложнее.

        Ну и начинать знакомство с инструментами можно с простых задач. Или это первый код который пишут студенты?


        1. kvichans
          03.05.2024 06:30

          До этого они балуются в автоматическом тренажере - решают крохотные задачки на создание отдельных функций или даже кусков кода.

          Так что "да" - это их первый реальный код. Им почти бесконечно сложно все сразу: и Питон, и ООП, и Гитхаб, и IDE - а еще и над логикой и дизайном игры нужно думать.


  1. Andrey_Solomatin
    03.05.2024 06:30

    Какие критерии для оценки что используется ООП?


    1. bartenev_ev
      03.05.2024 06:30

      Решение должно быть реализовано на принципах ООП. Необходимо реализовать базовые классы, применить наследование, полиморфизм и инкапсуляцию. То есть решение исключительно на функциях не будет принято, но вспомогательные функции использовать можно. Часть задания проверяется автоматическими тестами на базе Pytest (что есть определенные в задании классы, есть наследники этих классов и так далее), а финальная проверка и решение о принятии работы после доработок в зоне ответственности ревьюера.


      1. Andrey_Solomatin
        03.05.2024 06:30

        В примере с барсуками и я не вижу инкапсуляции.

        Да и с полиморфизмом там не очень. Draw вызывается у конкретных объектов.

        У вас точно ревьюверы на нужной волне?


    1. kvichans
      03.05.2024 06:30

      Есть примитивное дерево из классов для фигур, которые можно показывать: общий базовый, наследник Яблоко, наследник Змея. Метод для отрисовки фигуры лежит в базовом, а реализован в каждом из наследников.


  1. alexxisr
    03.05.2024 06:30

    хотелось бы технических подробностей реализации растущей змеи. Какие подходы используют студенты? У меня тоже где-то валяется моя студенческая змейка начала 2000-х, хотелось бы сравнить.


    1. bartenev_ev
      03.05.2024 06:30

      В статье есть ссылки на репозитории студентов, где можно посмотреть все подробности именно их реализаций.


    1. kvichans
      03.05.2024 06:30

      Ох! Десятки их!
      Чего только не выдумывают. Хорошо известно, что новички выдумывают такое, что опытным никогда в голову не придет.

      Но если змея бегает и ест яблоки, то все это считается правильным.


  1. JQuery567
    03.05.2024 06:30

    После питона предлагаю написать клоны игры Filler (https://ru.wikipedia.org/wiki/Filler), разумеется на python.

    Третьим пунктом пусть будет игра "точки"

    ( https://ru.wikipedia.org/wiki/Точки_(игра) )


    1. Andrey_Solomatin
      03.05.2024 06:30

      На мой взгляд лучше давать разные задачи. Веб сервер, обучить модельку, поиграться с базой данных и каким-нибудь API, простенький парсер.


      1. kvichans
        03.05.2024 06:30

        Ага. Так и происходит


    1. kvichans
      03.05.2024 06:30

      Если бы мне доверили - я точно бы заставлял делать Пентамино.
      Сам на разных языках писал - очень помогает понимать где в языке засада по нагрузочным вычислениям.

      И еще алгоритмические скилы прокачивает.