Как стать автором
Обновить
159.05
Яндекс Практикум
Помогаем людям расти

Играть = учиться. Как я создал образовательную игру для школьников

Время на прочтение5 мин
Количество просмотров1.2K

Всем привет! Меня зовут Андрей Волков, уже более семи лет я занимаюсь разработкой.

За свою карьеру я также успел поработать в продуктовой разработке в России и на аутстаффе с российскими и западными заказчиками. Моим основным стеком был Symfony/PHP. Спустя несколько лет работы на фреймворке Symfony благодаря курсу «Продвинутый Go-разработчик» от Яндекс Практикума у меня получилось сменить стек и уйти на позицию PHP/Go разработчика в компанию Rambler.

Обучающая игра: как пришла идея

Это было ещё задолго до обучения в Практикуме. Понял, что хочу передавать свою экспертизу, делиться накопленным опытом и растить новое поколение IT-специалистов. Чуть позже появилась конкретная цель — обучать школьников 7-9 классов программированию, закладывать в них самые основы. Идея игры появилась, когда я только начал работать со своими учениками. 

В родном городе Мичуринске на базе МичГАУ функционирует Центр развития современных компетенций детей, там я и начал реализовывать свой план. Быстро понял, что функционала стандартных и имеющихся в сети тренажёров по программированию недостаточно: не хватает геймификации и соревновательного элемента. Тогда на волне хайпа вокруг ИИ я подумал: а что, если давать детям писать свой ИИ и испытывать его гибкость в соревнованиях со своими друзьями? Так и была заложена идея проекта, который смог реализоваться только спустя год.

В сети есть несколько детских тренажёров с поэтапным обучением программированию: например, один, в котором можно играть за зверька, который собирает шишки. Я понял, что можно создать новый продукт для школьников — более понятный и универсальный. Цель моего проекта — научить школьников обращаться с алгоритмическими конструкциями. Объяснить, что такое условные операторы, циклы, операции булевой алгебры, условия и т. д.

Чем я вдохновлялся: 

  • Зарубежной платформой CodinGame. Тренажёр для программирования, но, опять же, там другое — нужно уже уметь программировать на каком-то специфическом языке. 

  • Сервисом Scratch. Его нет онлайн, поэтому сервис не самый доступный. И там тоже все-таки о другом: ты пишешь именно игру, а хотелось бы, чтобы был соревновательный аспект и люди состязались друг с другом. Например, соревновались в рамках одного класса или в компании единомышленников.

  • Игрой Snake Battle на MS-DOS. В этой древней игре уже была достаточно хорошо реализована ключевая задумка моего сервиса: программируешь змейку и отпускаешь её на арену. Осталось только перевести идею в онлайн! :)

Snake Battle, 1992, MS-DOS
Snake Battle, 1992, MS-DOS
  • Игрой в танки на JS, которую писали коллеги на моей первой работе. Идея витала в воздухе: ты точно так же пишешь искусственный интеллект для танка (поворачиваешь, разворачиваешь, стреляешь, обходишь препятствия) и выпускаешь его на арену с препятствиями. Однако мне не хотелось использовать какие-либо военные атрибуты в сервисе, ориентированном на школьников, поэтому была принята идея с добрыми змейками, кушающими яблоки :)

Типичный игровой процесс: игрок вводит координаты «спавна» змейки → составляет алгоритм, по которому она будет двигаться → выпускает её в открытый (не совсем) мир. Красный квадратик — вкусняха, зелёный — змейка первого игрока, жёлтые с зелёным — змейка второго игрока (зелёный — «голова» змейки)
Типичный игровой процесс: игрок вводит координаты «спавна» змейки → составляет алгоритм, по которому она будет двигаться → выпускает её в открытый (не совсем) мир. Красный квадратик — вкусняха, зелёный — змейка первого игрока, жёлтые с зелёным — змейка второго игрока (зелёный — «голова» змейки)

Как создавалась игра SnakeAI

Сначала я хотел написать игру на JS, потому что у него есть встроенные функции — в частности, функция eval(), которая позволяет распарсить строку с JS-кодом и тут же её исполнить. Тогда мне не нужно было бы писать собственный парсер. Однако, из-за нехватки времени, проект пришлось отложить. И вот только в мае этого года я стал думать о том, что можно было бы написать игру на Go и дать идее второй шанс. 

Какие были этапы создания игры — всего ушло около месяца:

  1. Создание MVP. Работу над проектом я начал в середине обучения на курсе в Практикуме. На курсе было два этапа, и вот после первого, на экваторе, я начал делать так называемый MVP — минимально жизнеспособный продукт. Ещё не было никаких условных операторов, можно было только выполнить последовательность действий. 

Я использовал паттерны Worker Pool для матч-мейкинга и обновления состояния игры, Strategy — для реализации разного поведения змеек, и Observer — для управления событиями в игре. В процессе, конечно, столкнулся с некоторыми трудностями — совершенно новый для меня язык, data race + race conditions, докеризация, проблемы с выкаткой на сервер (реализация Https-сервера с проксированием через Cloudflare). Приходилось искать много новой информации, освежать в памяти множество моментов из курса и тренировать усидчивость — многие-многие часы за ноутбуком после работы. 

  1. Ревью проекта. Я отправлял на ревью уже почти готовый рабочий проект. Всё было сделано мной самостоятельно с помощью поисковика и документации. От ментора всегда была обратная связь по качеству кода, что и где улучшить. Так что после ревью всегда был большой рефакторинг. Комментарии коллег и менторов на ревью были очень ценными. Фидбек получил максимально положительный, с рекомендаций пиариться в СМИ и искать других разработчиков.

  1. Готовый продукт. Окончательно проект был написан к выпуску из Практикума: я добавил новые функции — их уже можно посмотреть и попробовать.

Можно создать игровую партию со своей картой препятствий произвольного размера и конфигурации
Можно создать игровую партию со своей картой препятствий произвольного размера и конфигурации

SnakeAI: главное об игре

  • В SnakeAI код можно писать на собственном DSL напрямую, либо по нажатию элементов интерфейса: ты жмёшь кнопку, у тебя выстраивается последовательность из команд, которая передаётся змейке.

  • Соревновательный элемент реализован так: есть список игроков, у каждого из них есть уровень навыков, который увеличивается с количеством съеденных вкусняшек. И чем дольше змея продержится на поле, чем больше соберет “яблок”, тем больше будет очков, тем выше поднимется игрок в таблице.

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

Было бы неплохо встроить интерпретатор Python... Закодить змейку на питоне — звучит модно
Было бы неплохо встроить интерпретатор Python... Закодить змейку на питоне — звучит модно

Планы развития

Я бы хотел встраивать SnakeAI в обучающую программу школ. Скоро планируется первый урок технологии у 9 класса с использованием данного сервиса, там как раз мы создадим тестовую игровую комнату и попробуем на практике понять, что ещё нужно дополнить, улучшить и как вообще дальше двигаться. 

Также в планах выйти на финансирование, может быть, на грант. Взять в команду фронтендера, а лучше двух, и всё это вывести на новый уровень, совершенно красочный, так как сейчас сервис реализован на статичном HTML. Хотелось бы развития, ведь изначально проект создан с целью содействовать учебному процессу — текущих инструментов их мало и аналогов на зарубежном рынке нет. Было бы здорово распиарить проект и может быть в конечном итоге даже начать организовывать чемпионаты по SnakeAI! Можно уйти в своеобразную киберспортивно-обучающую историю, но это уже как получится.

В будущем планируется добавить возможность написания искусственного интеллекта на разных языках при помощи встраивания виртуальных машин, чтобы была возможно, как на LeetCode, переключаться между разными языками (например, PHP, C#, С) и писать интеллект на нужном языке.

Какой совет можно было бы дать начинающим разработчикам? Запастись терпением и трудиться, а также взять интересную задумку. Если есть классная идея, работа над ней и сложности будут казаться не «problems», а «issues».

Где можно попробовать?

Прямо сейчас по этой ссылке (нужна регистрация, но она быстрая и без одноразовых кодов):
https://snakeai.netvolk.online/
Баг-репорты можно присылать сюда:
https://github.com/andreamper220/snakeai/issues

Можно играть как в режиме тренировки (создать партию на одного игрока), так и с друзьями (до 10 человек одновременно).
А если Вы - преподаватель, можете потренироваться вместе со своими учениками!

Буду рад обратной связи!
Предлагаю устроить баттл онлайн, пишите - скооперируемся по времени, половим баги ;)

Теги:
Хабы:
+5
Комментарии1
3

Полезные ссылки

Jaeger для трассировки в микросервисной архитектуре

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров19K
Всего голосов 17: ↑17 и ↓0+17
Комментарии1

Как работает PGO-оптимизация в Go «на пальцах»

Уровень сложностиСредний
Время на прочтение16 мин
Количество просмотров7K
Всего голосов 14: ↑13 и ↓1+15
Комментарии2

Переходим на Go: 16 материалов для самостоятельного изучения языка

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров57K
Всего голосов 16: ↑12 и ↓4+11
Комментарии12

Информация

Сайт
practicum.yandex.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
Ира Ко