Один из первых практических проектов в курсах по Python-разработке в Практикуме — это классическая «Змейка». Несмотря на одинаковые стартовые условия, все студенты подходят к её решению по-разному. Рассказываем, как написать игру для портфолио уже через месяц обучения, и показываем шесть вариантов — с «отравой», сбрасыванием хвоста, а также барсуками и кошками.
В создании материала участвовали:
Евгений Бартенев — автор и техлид курсов по Python-разработке,
Анна Ланская — студентка курса «Python-разработчик буткемп»,
Александр Соколов — студент курса «Python-разработчик»,
Марина Асташова — студентка курса «Python-разработчик буткемп».
Владислав Ляско — студент курса «Python-разработчик плюс»,
Валерий Ходорищенко — студент курса «Python-разработчик плюс»,
Александр Комков — студент курса «Python-разработчик буткемп».
«Каждый разработчик хотя бы раз писал “Змейку”»: как игра появилась в учебной программе
В ранних версиях курса по Python-разработке в Практикуме было много практики, но почти вся она была «тру бэкендерской» — студенты отрабатывали навыки, пополняли работами портфолио, но редко доводили проекты до наглядной формы. Результатом выполнения таких заданий был код, взаимодействовать с которым иногда можно было только в консоли. А пользу программы было трудно показать друзьям и знакомым не из IT-среды, да и оценить как пользователю самостоятельно.
Чтобы исправить ситуацию, команда курсов по Python-разработке заменила проекты на более «осязаемые». Это значит, что результат выполнения таких заданий можно сразу «пощупать» и показать другим людям.
Это лишь одно из больших изменений, которое команда внесла в программу, — автор и техлид курсов по Python-разработке Евгений Бартенев рассказывал об этом более подробно в материале «Как прошло обновление курса “Python-разработчик”: новые сюжеты, Pytest и переработка алгоритмов». |
Теперь первый серьёзный и самостоятельный проект в программе называется «Изгиб питона». И это не что иное как «Змейка» — классическая игра родом из 70-х, которая стала хитом кнопочных телефонов.
«Перед заданием в уроке было сказано: “Каждый разработчик должен хотя бы раз в жизни написать ,Змейку‘”. И это хорошо мотивирует!» — Марина Асташова, студентка
Задача-минимум была такой: реализовать «Змейку» так, чтобы в ней соблюдались базовые правила классической игры. Задача-максимум: придумать свои дополнения, механики и другие решения, которые сделают игру уникальной.
«”Изгиб питона” студентам понравился. С одной стороны, на этом этапе они только начинают учиться, а с другой — они уже делают что-то вполне реальное, во что можно поиграть, что можно развивать в будущем.
А ещё раньше на выходе у студентов получались одинаковые или сильно похожие друг на друга работы. Ситуация усугублялась жёсткими ограничениями автоматических тестов. Теперь мы не загоняем студентов в жёсткие рамки. А значит, начиная с первого проекта они собирают уникальные портфолио, код в которых не повторяется, — а после индивидуальной работы с ревьюерами и подавно», — Евгений Бартенев, автор и техлид курсов по Python-разработке
Но некоторые ограничения для студентов всё-таки есть. Так, игра должна быть основана на прекоде от команды курса, код должен быть написан с использованием ООП, а в реализации должна применяться библиотека Pygame.
«Мы понимаем, что написать “Змейку” — не что-то сверхъестественное. За время существования игры написаны тысячи её вариантов, а в открытом доступе есть много инструкций. Но первый проект и не должен быть непреодолимым. Важнее, чтобы он был полезным и интересным.
А что касается инструкций — студенты, конечно, могут найти информацию в интернете, но задание построено так, что сдать чужое решение не получится, а платформа и ревьюеры позаботятся о том, чтобы не пропустить плагиат», — Евгений Бартенев, автор и техлид курсов по Python-разработке
В этом материале мы расскажем истории нескольких студенческих «Змеек», покажем, как они выглядят, и поделимся ссылками на код. Возможно, не идеальный — во-первых, студенты делают «Изгиб питона» примерно через пару месяцев после начала обучения, а во-вторых, некоторые доработки вносились ими после сдачи задания, а значит, ревьюер мог их не проверить.
Змейка №1: питон стал барсуком, а яблоки — котами
До поступления в Практикум опыт Анны Ланской был скромным — работа, бизнес и жизнь студентки связаны с IT, но программированием она не занималась.
«Змейка» от Анны выделяется графикой и концепцией: змея в игре стала барсуком, а место яблок заняли коты. Добавлена система очков, ускорение и замедление при поедании яблок-котов разных типов. Также на игровом поле появляются дружественные объекты, которые надо обходить, чтобы сохранить очки.
Вся графическая часть игры сделана нейросетью и обработана в графическом редакторе.
«В задании был пункт “Можете добавить графику”. Это и подтолкнуло меня к изменению самой концепции — у меня дома как раз живут два барсука и кошка. Правда, сдать проект в таком виде уже не получилось, так как система тестирования не пропустила бы работу с такими серьёзными изменениями», — Анна Ланская
Самым сложным для Анны было реализовать проект по техническому заданию. Остальное — просто полёт фантазии.
«В целом у меня получилось всё сделать так, как я представляла. Я даже сделала версию с exe-файлом, но проект всё-таки шуточный, выкладывать никуда не стала. К тому же, боюсь, любители животных не оценят игру, в которой основная цель сводится к поеданию котов. Возможно, это было бы актуально лет 15–20 назад, но уже не в наше время. Впрочем, каждый желающий может скачать игру на GitHub, так как код находится в открытом доступе», — Анна Ланская
Змейка №2: сложная механика с камнем
Александра Соколова можно назвать относительно опытным студентом: в техникуме он учился Visual Basic и Pascal, а потом, работая в торговле, увлекался Unity как хобби. После он дважды поступал в Практикум, но забрасывал обучение из-за работы.
«Даже когда я работал в торговле, мне хотелось делать игры, заниматься творческим программированием. Причём больше меня увлекала инди-разработка — когда за игру отвечает один человек или небольшая команда», — Александр Соколов
Первая особенность реализации Александра встречает игрока на старте — студент добавил в «Змейку» меню, чтобы в будущем пользователь мог зайти в него, посмотреть статистику, начать новую или продолжить старую игру.
Также в версии Александра появилась новая механика. Если змейка съедает камень, то не погибает сразу. Вместо этого от неё отсекается часть длины, а камень отлетает по направлению движения, при этом раскидывая всё, с чем сталкивается. И у этой механики есть история.
«Когда я творчески подхожу к проекту, то стараюсь закладывать какие-то точки, чтобы в дальнейшем было проще развивать и улучшать его. Так и тут — я сделал для яблок и камней два класса, которые отличались по названию, но были идентичными по содержанию. Ревью такой подход не прошёл, так как нарушает базовый принцип DRY, и для зачёта требовалось объединить их в один класс. Так как у меня было своё видение, а вступать в полемику времени не было, я придумал дополнительный функционал для камня, чтобы создание независимого класса имело смысл и было логичным решением», — Александр Соколов
«Змейка» Александра далека от завершения — в ней нет полноценной концовки, возможностей тонкой настройки, случайных событий и дополнительных механик, постепенно повышающих сложность игры. Для сдачи проекта на курсе это не требуется, но Александр хочет доработать игру в будущем.
«Это отличный пет-проект для портфолио, который в перспективе сможет хорошо показать, на что я способен как разработчик и насколько глубоко погружаюсь в задачу. Ну и в целом — я был бы рад, если бы кто-то когда-нибудь просто хорошо провёл время за моей игрой, даже если это будут всего пять–десять человек», — Александр Соколов
Змейка №3: плавные движения и борьба со змееботами
Когда Марина Асташова приступила к заданию, весь её опыт работы с Python сводился к двум месяцам обучения. До этого Марина занималась графическим дизайном и была уверена, что программирование — это очень сложно и доступно только избранным.
Небольшое количество опыта не помешало Марине реализовать одну из самых сложных «Змеек». Вот некоторые из особенностей ее реализации.
Скорость змейки растёт на каждом третьем яблоке. За счёт этого сложность повышается постепенно, а игрок успевает адаптироваться.
Есть два режима сложности: easy и hard. Выбор режима тоже влияет на скорость змейки.
Во время игры можно включить режим экстра-яблок. В нём на поле появляются разные их варианты: яркие прибавляют длину змейки и увеличивают её скорость, а серые, наоборот, замедляют и отбирают ячейки. У каждого яблока подписано числовое значение от -3 до 3 — настолько меняется длина змейки при поедании.
Предусмотрен режим змееботов. В нём на игровом поле появляются две змейки, которые двигаются сами по себе, также поедают яблоки, растут и уменьшаются. Если одна змейка окружает другую, то забирает все ячейки себе. А если сталкивается с ней, то погибает.
Рекорды остаются в памяти игры, пока идёт игровая сессия. Кроме того, данные о них сохраняются в отдельном файле. Можно посмотреть, чтобы постараться перебить достижения друга.
Движения змейки фиксируются не по ячейкам, а по пикселям — в результате, чтобы съесть яблоко, достаточно не занять его место полностью, а только коснуться. Подобную механику Марина подсмотрела в игре «Слизарио», а для реализации ей понадобилось вспомнить школьный курс геометрии и составить формулу для расчёта расстояния между точками.
Изначально Марина не планировала добавлять новые функции и механики — все идеи родились во время доработки по правкам ревьюера.
«Сначала я просто хотела сдать зачёт и успеть до дедлайна. Но когда ревьюер Андрей Квичанский, помимо исправления ошибок, предложил поработать над структурой, содержанием и, можно сказать, философией игры, я загорелась и захотела сделать что-то вроде “Слизарио”, придумать что-то необычное. Спасибо Андрею — он меня направлял и давал подсказки.
Например, мне было трудно реализовать режим со змееботами — изначально при отключении режима они просто прекращали взаимодействовать с игроком и перекрашивались в цвет фона, становились невидимыми. В какой-то момент это начало меня пугать — вот играю я в “Змейку”, а невидимые змееботы в это время обхаживают меня и пытаются укусить… Андрей подсказал, что лучше построить логику не на цвете, а на атрибуте активности каждого объекта. Получилось корректно и совсем не крипово», — Марина Асташова
Марина планирует продолжить работу над проектом и добавить сетевой режим, чтобы играть в «Змейку» можно было с друзьями. Но это потом — сейчас она хочет доучиться и освоить JavaScript.
«Интернет-браузеры не понимают код, написанный на Python. Знаю, что есть Web Assembly, с помощью которого можно перевести проект в веб, но, как я поняла по туториалам, это решение нестабильное и не очень хорошо работает. Поэтому я бы хотела переписать игру на JavaScript. А пока её можно запустить в формате EXE», — Марина Асташова
Скачать приложение →
Посмотреть код на GitHub →
Змейка №4: ностальгия по Тетрису и Mortal Kombat
Владислав Ляско никогда не занимался программированием, а в Практикум пришёл после 13 лет работы руководителем в ресторанной сфере. У кого-то получается схватывать новый материал на лету, но не у Владислава. У него часто возникали трудности, которые тормозили процесс обучения, и это отставание от однокурсников его нередко пугало.
Главная особенность «Змейки» от Владислава — второй экран справа от игрового поля. На нём находится счётчик очков, а также правила игры. Механика осталась базовая: есть красные яблоки, которые при поедании добавляют очки и увеличивают скорость змейки, а есть синие, столкновение с которыми ведёт к проигрышу. Владислав решил не добавлять ничего необычного, следуя, как говорит студент, одному из принципов философии Python — простое лучше, чем сложное.
Графику Владислав оставил пиксельной, как дань ностальгии по классической «Змейке» с Тетриса. Из-за любви к играм 90-х Владислав добавил ещё одну пасхалку — сообщение на экране при столкновении с «отравой».
Игра давалась Владиславу сложно. Сначала он не обратил внимание на приложенный к заданию прекод, который нельзя было игнорировать. Поэтому первая версия игры не прошла даже автоматическую проверку. После ориентации на прекод пришло время проверок ревьюером, и он пять раз возвращал код Владиславу на доработку с комментариями о том, как сделать код качественнее и лаконичнее.
«Мне хотелось рвать на себе волосы и кричать — почему оно не работает? Что я сделал не так? К счастью, в самые страшные моменты я был дома один, и супруга с детьми не видели всего этого. После второй-третьей доработки мне хотелось всё бросить, но на следующий день удавалось собраться с мыслями и продолжать работу над кодом», — Владислав Ляско
В будущем Владислав хочет написать и другие игры, попробовать повторить несложные проекты других разработчиков, переработать их под себя. Не для портфолио — просто для тренировки.
Змейка №5: сбрасывание кожи и иллюзия плавного движения
Валерий Ходорищенко — один из самых опытных студентов, выполнивших задание. В институте он изучал язык программирования для инженеров MATLAB, а потом осваивал разработку самостоятельно. В портфолио Валерия есть проекты посложнее «Змейки» — например, программа, которая переводит выделенный текст в PDF-файлах.
Валерий добавил в игру следующие функции.
Через каждые пять съеденных яблок змея сбрасывает кожу. Кожа становится дополнительным препятствием — если змея съедает её, то становится короче и скидывает кожу снова.
Цвета квадратиков, из которых состоит змейка, меняются, что создаёт иллюзию движения и отражения кожи на солнце.
Кнопка Shift вызывает ускорение.
«Изгиб питона» в Практикуме стал третьей «Змейкой» Валерия, но первой, которую принимал профессиональный ревьюер. Поэтому студент поначалу не относился к заданию серьёзно, но переосмыслил свой подход после третьего возвращения проекта на доработку.
«Мне понравилась сложность ревью. Я не соглашался с ревьюером и хотел реализовать код по-своему, но потом подумал, что у наставника точно больше опыта и если он чего-то от меня хочет, то это имеет смысл. А ещё, что уметь следовать чужим правилам — это полезный навык, который пригодится в работе», — Валерий Ходорищенко
Сейчас Валерий хочет сконцентрироваться на более продуктовых проектах, так как «Змейка» меньше интересует работодателей, чем, например, продающий сайт или сервис, который можно применить в бизнесе. Но, возможно, вернётся к написанию игр в качестве тренировки.
Скачать приложение →
Посмотреть код на GitHub →
Змейка №6: базовая механика и много анимации
Александр Комков подошёл к заданию относительно подготовленным: он уже писал программы на Python, создавал приложения с графическом интерфейсом на Kivy и даже пробовал написать платформер с помощью Pygame.
Особенность его «Змейки» бросается в глаза сразу — это графика. В игре есть меню, много анимаций и переходов.
Механика при этом осталась самой простой: ни камней, ни отравы, ни стен. Просто змейка и яблоки. Так и было задумано.
«Когда я прочитал задание и примеры необязательных опций вроде “плохой еды”, я сразу решил повернуть “не туда” — сделать иначе и сосредоточиться на визуальных изменениях. Идею для оформления подсказал онлайн-сервис, который превращает текст в пиксель-арт», — Александр Комков
Александр подчёркивает, что его «Змейку» трудно назвать полноценной игрой. Скорее, концептом игры, так как многие из идей он не успел реализовать к дедлайну. Например, в меню должны были появиться маленькие змейки, которых игрок будет гонять мышкой.
«Я бы хотел вернуться к “Змейке” в будущем, но, если честно, у меня уже столько проектов, которые я хотел бы доработать…» — Александр Комков
Это лишь часть работ — на деле интересных «Змеек» было куда больше шести. Более того, команда курса отмечает, что каждый проект был по-своему интересен и уникален.
«Проблемы уникального портфолио и мотивации учиться дальше — очень важны. Мы хотим, чтобы наши студенты выделялись, а их глаза горели. И появление в программе “Изгиба питона” — верный шаг в этом направлении.
Такие задания нравятся даже тем, кто не ставит целью трудоустройство. Ведь это всё равно круто — сделать через пару месяцев учёбы что-то реальное, что можно использовать самому или показать другим, не объясняя перед этим, что такое бэкенд», — Евгений Бартенев, автор и техлид курсов по Python-разработке
Если вы хотите написать свой первый код на Python и подготовиться к созданию реальных проектов, познакомьтесь с основами языка на бесплатном курсе «Основы Pyhton-разработки». За 20 часов вы узнаете, чем занимаются бэкенд-разработчики, освоите базовый синтаксис Python и напишете первую программу.
Комментарии (17)
Andrey_Solomatin
03.05.2024 06:30Какие критерии для оценки что используется ООП?
bartenev_ev
03.05.2024 06:30Решение должно быть реализовано на принципах ООП. Необходимо реализовать базовые классы, применить наследование, полиморфизм и инкапсуляцию. То есть решение исключительно на функциях не будет принято, но вспомогательные функции использовать можно. Часть задания проверяется автоматическими тестами на базе Pytest (что есть определенные в задании классы, есть наследники этих классов и так далее), а финальная проверка и решение о принятии работы после доработок в зоне ответственности ревьюера.
Andrey_Solomatin
03.05.2024 06:30В примере с барсуками и я не вижу инкапсуляции.
Да и с полиморфизмом там не очень. Draw вызывается у конкретных объектов.
У вас точно ревьюверы на нужной волне?
kvichans
03.05.2024 06:30Есть примитивное дерево из классов для фигур, которые можно показывать: общий базовый, наследник Яблоко, наследник Змея. Метод для отрисовки фигуры лежит в базовом, а реализован в каждом из наследников.
alexxisr
03.05.2024 06:30хотелось бы технических подробностей реализации растущей змеи. Какие подходы используют студенты? У меня тоже где-то валяется моя студенческая змейка начала 2000-х, хотелось бы сравнить.
bartenev_ev
03.05.2024 06:30В статье есть ссылки на репозитории студентов, где можно посмотреть все подробности именно их реализаций.
kvichans
03.05.2024 06:30Ох! Десятки их!
Чего только не выдумывают. Хорошо известно, что новички выдумывают такое, что опытным никогда в голову не придет.
Но если змея бегает и ест яблоки, то все это считается правильным.
JQuery567
03.05.2024 06:30После питона предлагаю написать клоны игры Filler (https://ru.wikipedia.org/wiki/Filler), разумеется на python.
Третьим пунктом пусть будет игра "точки"
( https://ru.wikipedia.org/wiki/Точки_(игра) )
Andrey_Solomatin
03.05.2024 06:30На мой взгляд лучше давать разные задачи. Веб сервер, обучить модельку, поиграться с базой данных и каким-нибудь API, простенький парсер.
kvichans
03.05.2024 06:30Если бы мне доверили - я точно бы заставлял делать Пентамино.
Сам на разных языках писал - очень помогает понимать где в языке засада по нагрузочным вычислениям.И еще алгоритмические скилы прокачивает.
Andrey_Solomatin
Так сделайте шаблон готового репозитория где будут requirements.txt, ридми, настроенные линтеры, прекоммитхуки и всё подготовленное для написания тестов.
Это некоторый оверхед для студентов, но зато с места в настоящую разработку. И это будет проект который не стыдно показать.
bartenev_ev
На самом деле именно так и сделано: студентам на базе шаблона генерируется индивидуальный репозиторий, который уже содержит базовый прекод, тесты, настройки линтера и прочее. В итоге ревьюер получает работу, в которой уже не надо тратить время на замечания по поводу форматирования или на проверку ключевых пунктов из задания, а можно сфокусироваться на самом коде и на лучших практиках.
Andrey_Solomatin
Некоторые репозитории в примерах этого не видно.
kvichans
Это будет уже не "оверхед", а чистый "кыш отсюда" для большей части студентов. Ведь многие приходят совсем зеленые (вот как Марина в статье).
Курс рассчитан на постепенное погружение в настоящую разработку - после года обучения они уже все перечисленное: requirements.txt, ридми, линтеры и даже больше - понимают и применяют.
А в первом проекте это не нужно. Лучше не пугать, а мотивировать на обучение.
Andrey_Solomatin
С учётом того что большая часть этого придёт из шаблона и понимать это не надо, а нужно просто пользоваться, то не так уж и сложно как вы описали. Гит с гитхабом и то сложнее.
Ну и начинать знакомство с инструментами можно с простых задач. Или это первый код который пишут студенты?
kvichans
До этого они балуются в автоматическом тренажере - решают крохотные задачки на создание отдельных функций или даже кусков кода.
Так что "да" - это их первый реальный код. Им почти бесконечно сложно все сразу: и Питон, и ООП, и Гитхаб, и IDE - а еще и над логикой и дизайном игры нужно думать.