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

  • Tutorial

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

Комментарии 16

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

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

      0
      Обычно ось Z направлена вверх — в обычной аксонометрии
        0
        Скажем так, в школьной стереометрии.
          +1
          В промоборудовании обычно тоже (xy table), а так хоть в попугаях можно мерить проекцию на сферического коня, но стандарты для этого и придуманы, школа обучает стандартам. Не понимаю, зачем надо от них отступать.
          +1

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

            0

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

            0
            Мы живём на Земле — у нас есть 2 координаты, определяющие место на поверхности (декартовы или полярные, смотря какой размах работы) и 1 отличающаяся от них координата — высота. В Minecraft ось Y — высота — по своему диапазону значений, практическому смыслу и цене ошибки отличается от X и Z.

            В итоге получается интересная ситуация, когда в записи «неравноправных» координат «особое» значение, интересное в особых случаях, находится между «обычными», требуемыми для ориентирования на карте. Это не принципиально, но без привычки работать с этим трудновато, да и с привычкой ошибки нередки (по сравнению с возможной альтернативной записью, в которой высота отделена от других координат, например, находясь в конце).
              0
              Да я не спорю… Просто удобнее было бы Z направить вверх, а Y — параллельно поверхности
            0
            Найденное решение — в самом скрипте сканер сообщений игрока периодически проверяет лог игровой сессии в папке <USER_DIRECTORY>\AppData\Roaming\.minecraft, чтобы поймать сообщения из чата, распарсить их и выполнить соответствующую связанную питоновскую функцию, если таковая есть.

            Можно проще — обработать событие «onChatEvent»
              0
              В mcpi этого вроде нет, он предельно простой. Можете привести пример или скрин?
                +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
                  0
                  Спасибо. Интересно, надо попробовать. В репозитарии для книжки Adventures in Minecraft лежит сервер плюс mcpi к нему — и видно по датам, что mcpi намного старше, чем тот, что в вашей ссылке. Автор один и тот же.

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

              0

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

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

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

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое