Стив пишет заклинания на Python. Обучение детей программированию в Minecraft

Как можно оценить настойчивую побудку второклассником часов в 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 по большому счету всего две - установка блоков и перемещения игрока в пространстве мира. Когда это освоено на десятке заранее подготовленных примеров, можно дать ученику модифицировать готовые скрипты, но обязательно с предварительным обсуждением - а что, собственно, он хочет сделать. Лучше всего, если удастся организовать предварительное написание кода на бумаге, но в реальности это далеко не всегда получается.

Вертикальные и наклонные столбы
Вертикальные и наклонные столбы

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

О чем больше всего хотелось рассказать - небольшое усовершенствование процесса запуска питоновских скриптов из 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 удалось зажечь и продержать увлечение до выработки умений и привычек - это уже огромное достижение.

@makondo
19.01.2021 03:10 UTC
Первоисточник

Комментарии

@ya_ne_znau
19.01.2021 06:12 UTC
+1
Здесь большое неудобство доставляет система координат, выбранная в игре: вертикальная ось — это координата Y, а горизонтальная плоскость — XZ

не понимаю, как ещё может быть, всё правильно, 3 оси, в чем проблема?

@makondo
19.01.2021 06:13 UTC
0
Обычно ось Z направлена вверх — в обычной аксонометрии
19.01.2021 06:14 UTC
0
Скажем так, в школьной стереометрии.
19.01.2021 06:23 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
19.01.2021 06:35 UTC
+1

В компьютерной графике обычно принято считать экран монитора плоскостью XY. И это не вызывает ни каких нареканий пока работаешь с 2D графикой (например рисуешь графики функций). Для добавления оси Z, без изменения "старых привычек", остаётся только один вариант — направить её вдоль оси перпендикулярной плоскости экрана. Вот и получается что понятия вверх/вниз в компьютерных 3D играх соответствуют оси Y.

19.01.2021 06:42 UTC
0

А в HTML ось Y вообще вниз :)

@
19.01.2021 09:19 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
19.01.2021 10:03 UTC
0
Да я не спорю… Просто удобнее было бы Z направить вверх, а Y — параллельно поверхности
@tvaishim
19.01.2021 10:01 UTC
0
Найденное решение — в самом скрипте сканер сообщений игрока периодически проверяет лог игровой сессии в папке <USER_DIRECTORY>\AppData\Roaming\.minecraft, чтобы поймать сообщения из чата, распарсить их и выполнить соответствующую связанную питоновскую функцию, если таковая есть.

Можно проще — обработать событие «onChatEvent»
@makondo
19.01.2021 10:02 UTC
0
В mcpi этого вроде нет, он предельно простой. Можете привести пример или скрин?
21.01.2021 05:05 UTC
+1
mc = minecraft.Minecraft.create()

events_chat = mc.events.pollChatPosts()
for event in events_chat:
print(event.message)
Это обработка событий сообщений чата.
Еще обрабатываются события касания блока деревянным мечом и попадания стрелы.
github.com/martinohanlon/mcpi/blob/master/mcpi/minecraft.py
21.01.2021 11:37 UTC
0
Спасибо. Интересно, надо попробовать. В репозитарии для книжки Adventures in Minecraft лежит сервер плюс mcpi к нему — и видно по датам, что mcpi намного старше, чем тот, что в вашей ссылке. Автор один и тот же.

github.com/AdventuresInMinecraft/AdventuresInMinecraft-PC/tree/master/MyAdventures/mcpi

@GritsanY
19.01.2021 10:02 UTC
0

Если ребёнку Roblox тоже нравится, то лучше даже начать с Roblox Studio. Минус — русского интерфейса нет, зато практически полноценный игровой движок с визуальным редактором уровней и анимаций, а также возможностью писать и дебажить скрипты на Lua.

@makondo
19.01.2021 10:06 UTC
0
Не уверен, что Lua подходящий первый язык для обучения, хотя и знаком с ним очень мало. Вы не пробовали с ребенком — как ему? Русский интерфейс как раз не очень нужен — то есть его отсутствие вообще не проблема.
19.01.2021 10:12 UTC
0
В общем-то у меня и к питону есть вопросы по динамической типизации — человеку хорошо бы для начала попробовать строгую типизацию.
19.01.2021 10:17 UTC
+1

Я не думаю, что синтаксис Lua сложнее чем, в Python. Там больше проблем будет объяснить иерархии объектов в игровом мире и всякие логические конструкты в виде событий, методов, свойств и функций. Плюс клиент-серверное взаимодействие начинает довольно много значить, если игру делать многопользовательскую.
Главное, правильно подобрать примеры — начать чисто с построения мира, потом манипулировать свойствами объектов, потом физикой, потом простейшие скрипты и так далее.