Как можно оценить настойчивую побудку второклассником часов в 7 утра воскресенья со словами "Папа! Пойдем учить Python"? Бесценно. Назрело желание поделиться наработками домашнего обучения детей программированию - систематизировать и законспектировать хотя бы для самого себя. Даже не столько обучению, сколько привлечения детского внимания и интереса. Ведь согласно Сократу, человек - не сосуд для заполнения, а факел, который нужно зажечь. Изначально были попытки начать со Scratch, но несмотря на понятный графический интерфейс желание продолжать и что-то делать в среде быстро угасло. Minecraft пошел намного лучше, потому что дети уже были хорошо знакомы с игрой по мобильной версии и любимому creative mode.
Ради иллюстрации этой статьи я решился на запись скринкаста. Со второй или третьей попытки удалось сократить все до 20 минут. Все равно получилось растянуто, зато показаны основные моменты в динамике - все, что в тексте ниже.
Я не имею в виду создание и использование модов, это слишком высокий уровень входа. Первые попытки были после знакомства с первым изданием книги Minecraft. Программируй свой мир и удачной настройки сервера Bukkit на домашней машине. На данный момент (начало 2021 г.) есть второе издание, ссылка как раз на него а также несколько похожих книг других авторов. Второе издание хорошо тем, что в нем исправлены ошибки в коде, которые были в первом, а также используется Python3 и более новая версия сервера. Вот тут на Хабре обзор первого издания от издательства Питер.
Сразу оговорка - игра запускается на одной домашней машине, обычно ноутбуке, в Windows. Серверные версии не пробовал, хотя было бы интересно посмотреть, если кто-то уже делал. Быстрый поиск показывает многочисленные русскоязычные курсы и школы программирования для детей, использующие Minecraft для обучения, но полноценного открытого руководства или хотя бы форума энтузиастов для обмена опыта - не видно.
На странице издательства Wiley есть несколько видео для упрощения, самое первое как раз об установке и настройке сервера Bukkit, отдельно установка Python (не Anaconda, из простого дистрибутива), тьюториал подключения к запущенному серверу и запуска в нем HelloWorld из питоновского IDLE.
Библиотека mcpi была изначально написана для запуска python-скриптов в Майнрафте на Raspberry Pi. Версия Minecraft для Raspberry Pi распространяется бесплатно. Сейчас mcpi работает под Windows. Качать отдельно ее не надо, все входит в состав Bukkit-сервера.
Школьник даже начальной школы очень легко осваивает клавиатуру, набор кода в окошке IDLE. API mcpi предоставляет не очень богатые, даже убогие, возможности для такого сложного мира, как Minecraft. Но для начала как раз то, что надо. Самое первое, что осваивает начинающий программист в Minecraft после подключения к миру - вывод сообщений в чат. Далее - создание разного типа блоков и готовых параллелепипедов из них. Опыт показывает, что самое сложное для ребенка - понять, что такое 2D и 3D-координаты. Здесь пришлось отдельно провести урок с объяснениями на бумажке о движениях игрока по полю, о смещениях по вертикали. Здесь большое неудобство доставляет система координат, выбранная в игре: вертикальная ось - это координата Y, а горизонтальная плоскость - XZ. Вот тут хорошо прорисовано. Лучше всего на начальном этапе повторять это несколько раз и обязательно задавать маленькие проверочные задачки. Надо просить указать координаты перемещения с нарисованными на бумаге осями.
Когда координаты освоены, нужно объяснить, как их можно использовать в игре. Возможностей в mcpi по большому счету всего две - установка блоков и перемещения игрока в пространстве мира. Когда это освоено на десятке заранее подготовленных примеров, можно дать ученику модифицировать готовые скрипты, но обязательно с предварительным обсуждением - а что, собственно, он хочет сделать. Лучше всего, если удастся организовать предварительное написание кода на бумаге, но в реальности это далеко не всегда получается.
![Вертикальные и наклонные столбы Вертикальные и наклонные столбы](https://habrastorage.org/getpro/habr/upload_files/7c1/067/b79/7c1067b79a8a85cd3ab0247500a6c79c.jpg)
Следующий логичный шаг - объяснение главных тем программирования - переменные и простые типы, циклы и условия. С объяснениями и показом примеров сразу же в игровом мире все эти сложные для школьников штуки схватываются удивительно быстро. Поначалу мы клали отдельные блоки разных типов, указывая номер. Иногда игровая сессия слетала, если ставили какой-то недокументированный или опасный блок вроде тринитротолуола. А большой куб из лавы вполне может сжечь лес и траву на поверхности, устроив масштабный пожар. Вот здесь пример встречи люда и пламени. Трехмерные координаты хорошо демонстрируются установкой в цикле стеклянных столбов, вертикальных, наклонных свай, спиралей из блоков, уходящих в небо - и так далее.
О чем больше всего хотелось рассказать - небольшое усовершенствование процесса запуска питоновских скриптов из IDLE. Скажем, на ноутбуке, даже с подключенным вторым монитором, крайне неудобно перескакивать по Alt-Tab из клиента Майнкрафта в IDLE, чтобы запустить скрипт из окошка по F5. При таком перескоке клиент выходит из игрового времени в паузу. Если скрипт что-то выводит в чат игры, можно успеть вернуться и увидеть результат. Найденное решение - в самом скрипте сканер сообщений игрока периодически проверяет лог игровой сессии в папке <USER_DIRECTORY>\AppData\Roaming\.minecraft, чтобы поймать сообщения из чата, распарсить их и выполнить соответствующую связанную питоновскую функцию, если таковая есть. Игрок вводит сообщение в чате вроде /me build, сканер ловит запись в логе, и если для команды build есть функция, запускает ее. А функция, к примеру, строит дом в координате рядом с игроком с небольшим сдвигом. Здесь сразу естественно объясняется процедурный подход и немного структуры данных - хэш-таблица и вызов функции в Питоне по ее имени в строковой переменной. Такой режим хорош для ребенка тем, что вызов в игре своего личного кода происходит без переключения, выполняется в течении 2-3 секунд и выглядит в игре как вызов заклинания. А заклинание он только что написал сам.
Совсем не обязательно ограничиваться стандартным миром, загружаемым по умолчанию. Готовых миров - уйма. Главное убедиться, что он подходит к конкретной версии сервера Bukkit (не самой новой). Самое простое - положить скачанную и распакованную папку мира в папку сервера, прописать ее в конфиг server.properties
level-name=Midgard
Перезапускаем bukkit server - если стартовал, можно теперь творить свои скрипты там
Из планов - хотелось бы посмотреть opensource-версию Майнкрафта - Minetest. Она написана на плюсах, по этой причине пишут об очень хорошей производительности и большом наборе игровых возможностей. Все-таки Майнкрафт начинает заметно тормозить несмотря на очень простую графику. Кроме этого в Minetest есть похожие возможности программирования, но на Lua. Возможно, займемся этим в ближайшем будущем - статья в Вики. Хотелось бы еще попробовать другие реализации API Minecraft, но они все довольно старые, и на страничках в github прямо предупреждается, что максимальные версии сервера, где их библиотеки работают, очень и очень старые. Picraft - интересная библиотека. Кроме всего этого свет клином на Minecraft не сошелся. Что-то краем уха слышал об аналогичных возможностях в Roblox - тоже горячо любимой платформе.
Хотелось бы попробовать режим с несколькими игроками, каждый из которых может выполнять свой код. Очень интересно попытаться вставить в игру самостоятельных существ с собственным запрограммированным поведением. С большим интересом посмотрел на микрософтовский сайт Minecraft MakeCode, но глубоко не изучал. Еще множество интересных примеров собраны на instructables.com с видеодемками и на сайте проектов под RaspberryPi, их тоже можно использовать. Самый лучший результат таких усилий - если у человека появляются идеи и стремление создать что-то самому. В современном мире один из самых дорогих ресурсов, за который идет борьба - человеческое внимание, привлеченный интерес. Если среди изобилия развлечений, гаджетов, картинок, youtube удалось зажечь и продержать увлечение до выработки умений и привычек - это уже огромное достижение.