Играть = учиться. Как я создал образовательную игру для школьников
Всем привет! Меня зовут Андрей Волков, уже более семи лет я занимаюсь разработкой.
За свою карьеру я также успел поработать в продуктовой разработке в России и на аутстаффе с российскими и западными заказчиками. Моим основным стеком был Symfony/PHP. Спустя несколько лет работы на фреймворке Symfony благодаря курсу «Продвинутый Go-разработчик» от Яндекс Практикума у меня получилось сменить стек и уйти на позицию PHP/Go разработчика в компанию Rambler.
Обучающая игра: как пришла идея
Это было ещё задолго до обучения в Практикуме. Понял, что хочу передавать свою экспертизу, делиться накопленным опытом и растить новое поколение IT-специалистов. Чуть позже появилась конкретная цель — обучать школьников 7–9 классов программированию, закладывать в них самые основы. Идея игры появилась, когда я только начал работать со своими учениками.
В родном городе Мичуринске на базе МичГАУ функционирует Центр развития современных компетенций детей, там я и начал реализовывать свой план. Быстро понял, что функционала стандартных и имеющихся в сети тренажёров по программированию недостаточно: не хватает геймификации и соревновательного элемента. Тогда на волне хайпа вокруг ИИ я подумал:, а что, если давать детям писать свой ИИ и испытывать его гибкость в соревнованиях со своими друзьями? Так и была заложена идея проекта, который смог реализоваться только спустя год.
В сети есть несколько детских тренажёров с поэтапным обучением программированию: например, один, в котором можно играть за зверька, который собирает шишки. Я понял, что можно создать новый продукт для школьников — более понятный и универсальный. Цель моего проекта — научить школьников обращаться с алгоритмическими конструкциями. Объяснить, что такое условные операторы, циклы, операции булевой алгебры, условия и т. д.
Чем я вдохновлялся:
Зарубежной платформой CodinGame. Тренажёр для программирования, но, опять же, там другое — нужно уже уметь программировать на каком-то специфическом языке.
Сервисом Scratch. Его нет онлайн, поэтому сервис не самый доступный. И там тоже все-таки о другом: ты пишешь именно игру, а хотелось бы, чтобы был соревновательный аспект и люди состязались друг с другом. Например, соревновались в рамках одного класса или в компании единомышленников.
Игрой Snake Battle на MS-DOS. В этой древней игре уже была достаточно хорошо реализована ключевая задумка моего сервиса: программируешь змейку и отпускаешь её на арену. Осталось только перевести идею в онлайн! :)
Snake Battle, 1992, MS-DOS
Игрой в танки на JS, которую писали коллеги на моей первой работе. Идея витала в воздухе: ты точно так же пишешь искусственный интеллект для танка (поворачиваешь, разворачиваешь, стреляешь, обходишь препятствия) и выпускаешь его на арену с препятствиями. Однако мне не хотелось использовать какие-либо военные атрибуты в сервисе, ориентированном на школьников, поэтому была принята идея с добрыми змейками, кушающими яблоки :)
Типичный игровой процесс: игрок вводит координаты «спавна» змейки → составляет алгоритм, по которому она будет двигаться → выпускает её в открытый (не совсем) мир. Красный квадратик — вкусняха, зелёный — змейка первого игрока, жёлтые с зелёным — змейка второго игрока (зелёный — «голова» змейки)
Как создавалась игра SnakeAI
Сначала я хотел написать игру на JS, потому что у него есть встроенные функции — в частности, функция eval()
, которая позволяет распарсить строку с JS-кодом и тут же её исполнить. Тогда мне не нужно было бы писать собственный парсер. Однако, из-за нехватки времени, проект пришлось отложить. И вот только в мае этого года я стал думать о том, что можно было бы написать игру на Go и дать идее второй шанс.
Какие были этапы создания игры — всего ушло около месяца:
Создание MVP. Работу над проектом я начал в середине обучения на курсе в Практикуме. На курсе было два этапа, и вот после первого, на экваторе, я начал делать так называемый MVP — минимально жизнеспособный продукт. Ещё не было никаких условных операторов, можно было только выполнить последовательность действий.
Я использовал паттерны Worker Pool для матч-мейкинга и обновления состояния игры, Strategy — для реализации разного поведения змеек, и Observer — для управления событиями в игре. В процессе, конечно, столкнулся с некоторыми трудностями — совершенно новый для меня язык, data race + race conditions, докеризация, проблемы с выкаткой на сервер (реализация Https-сервера с проксированием через Cloudflare). Приходилось искать много новой информации, освежать в памяти множество моментов из курса и тренировать усидчивость — многие-многие часы за ноутбуком после работы.
Ревью проекта. Я отправлял на ревью уже почти готовый рабочий проект. Всё было сделано мной самостоятельно с помощью поисковика и документации. От ментора всегда была обратная связь по качеству кода, что и где улучшить. Так что после ревью всегда был большой рефакторинг. Комментарии коллег и менторов на ревью были очень ценными. Фидбек получил максимально положительный, с рекомендаций пиариться в СМИ и искать других разработчиков.
Готовый продукт. Окончательно проект был написан к выпуску из Практикума: я добавил новые функции — их уже можно посмотреть и попробовать.
Можно создать игровую партию со своей картой препятствий произвольного размера и конфигурации
SnakeAI: главное об игре
В SnakeAI код можно писать на собственном DSL напрямую, либо по нажатию элементов интерфейса: ты жмёшь кнопку, у тебя выстраивается последовательность из команд, которая передаётся змейке.
Соревновательный элемент реализован так: есть список игроков, у каждого из них есть уровень навыков, который увеличивается с количеством съеденных вкусняшек. И чем дольше змея продержится на поле, чем больше соберет «яблок», тем больше будет очков, тем выше поднимется игрок в таблице.
Школьнику не нужно знать никакой отдельный язык программирования, не нужно разбираться в алгоритмах. Суть в том, что можно просто жать на кнопки, и в алгоритм будут добавляться условия, окончание цикла, движение вперёд, поворот направо, налево. А тот, кто захочет, может разблокировать окно для кода и уже вводить руками те же самые команды, когда разберётся, как всё работает.
Было бы неплохо встроить интерпретатор Python… Закодить змейку на питоне — звучит модно
Планы развития
Я бы хотел встраивать SnakeAI в обучающую программу школ. Скоро планируется первый урок технологии у 9 класса с использованием данного сервиса, там как раз мы создадим тестовую игровую комнату и попробуем на практике понять, что ещё нужно дополнить, улучшить и как вообще дальше двигаться.
Также в планах выйти на финансирование, может быть, на грант. Взять в команду фронтендера, а лучше двух, и всё это вывести на новый уровень, совершенно красочный, так как сейчас сервис реализован на статичном HTML. Хотелось бы развития, ведь изначально проект создан с целью содействовать учебному процессу — текущих инструментов их мало и аналогов на зарубежном рынке нет. Было бы здорово распиарить проект и может быть в конечном итоге даже начать организовывать чемпионаты по SnakeAI! Можно уйти в своеобразную киберспортивно-обучающую историю, но это уже как получится.
В будущем планируется добавить возможность написания искусственного интеллекта на разных языках при помощи встраивания виртуальных машин, чтобы была возможно, как на LeetCode, переключаться между разными языками (например, PHP, C#, С) и писать интеллект на нужном языке.
Какой совет можно было бы дать начинающим разработчикам? Запастись терпением и трудиться, а также взять интересную задумку. Если есть классная идея, работа над ней и сложности будут казаться не «problems», а «issues».
Где можно попробовать?
Прямо сейчас по этой ссылке (нужна регистрация, но она быстрая и без одноразовых кодов):
https://snakeai.netvolk.online/
Баг-репорты можно присылать сюда:
https://github.com/andreamper220/snakeai/issues
Можно играть как в режиме тренировки (создать партию на одного игрока), так и с друзьями (до 10 человек одновременно).
А если Вы — преподаватель, можете потренироваться вместе со своими учениками!
Буду рад обратной связи!
Предлагаю устроить баттл онлайн, пишите — скооперируемся по времени, половим баги ;)