🎯 Цели занятия

📋 План занятия

ЭтапВремяЧто делаем
Идея проекта10 минСюжет и правила безопасности в мире
Новые команды15 минon_item_interacted, randint, block_by_id
Алгоритм чанка15 минКоординаты + тройной цикл
Интерактив15 минСопоставление и порядок шагов
Мини-проект30 минПишем программу по подсказкам
Итоги5 минВикторина и рефлексия
Итого90 мин—

🌀 Что происходит в мире?

Ты находишь зачарованное яблоко — странный предмет. Когда игрок использует его (ПКМ / взаимодействие), перед ним внезапно вырастает куб из случайных блоков размером 16 × 16 × 16 — как будто открылась «изнанка» мира.

4096 блоков — мощная магия! Не злоупотребляй.

⚠️ Важно для занятия

1 Событие: использование предмета

Раньше мы запускали код по команде в чате. Здесь код запускается, когда игрок использует конкретный предмет.

🍎 player.on_item_interacted
player.on_item_interacted(ENCHANTED_APPLE, on_item_interacted)
Вызывает функцию on_item_interacted, когда игрок использует зачарованное яблоко. В начале файла нужна функция с этим именем (без параметров).
📍 player.position()
posP = player.position()
Сохраняет текущую позицию игрока. Из неё можно взять X, Y, Z через get_value(Axis.X) и т.д.
🎲 randint
randint(0, 800)
Случайное целое число от 0 до 800 — будем использовать как ID блока.
🧱 blocks.block_by_id
blocks.block_by_id(42)
Превращает число (ID) в тип блока для команды blocks.place.
item_event_skeleton.py
def on_item_interacted():
    player.say("Что-то странное начинается...")

player.on_item_interacted(ENCHANTED_APPLE, on_item_interacted)
💡 Предмет в инвентаре: выдай себе зачарованное яблоко через творческий режим или команду в чате, иначе протестировать не получится.

2 Строим куб 16×16×16

Чанк в Minecraft часто ассоциируют с размером 16 блоков. Нам нужно перебрать все комбинации x, y, z от 0 до 15 — для этого подходит тройной вложенный цикл for.

triple_loop.py
for x in range(16):
    for y in range(16):
        for z in range(16):
            # здесь: выбрать случайный блок и поставить его в world(...)
            pass

Где строить? Возьми координаты игрока и сдвинь угол куба, например на +10 по X и +10 по Z — чтобы куб появился рядом, а не внутри игрока. Каждый блок внутри цикла:

world(posX + x, posY + y, posZ + z)

📐 Связь с занятием 2.3: здесь мы снова используем world() — абсолютные координаты. Угол куба считаем один раз; в цикле только прибавляем x, y, z.

🔑 Сопоставь команду и смысл

player.on_item_interacted(...)
randint(0, 800)
range(16)
blocks.block_by_id(n)

🧩 Расставь шаги алгоритма

Выбери правильный порядок (1 — первый, 5 — последний):

? Зарегистрировать обработчик: яблоко → функция
? Получить позицию игрока и вычислить угол куба (posX, posY, posZ)
? Тройной цикл for по x, y, z от 0 до 15
? Внутри цикла: случайный ID → block_by_id → blocks.place в world(...)
? Объявить функцию on_item_interacted (внутри неё вся логика)

Подсказка: в Python сначала пишут функцию, потом регистрируют событие внизу файла.

🤖
Спроси Алису (ИИ-помощник)

Нажми на вопрос — Алиса ответит тебе прямо сейчас!

💬 Нажми на любой вопрос — откроется Алиса с готовым ответом.
💡 Хочешь спросить что-то своё? Открой Алису сам и задай вопрос про «Upside Down» или циклы в Minecraft.
«Алиса, как сделать тройной цикл for в Python?»
⚠️ Никогда не отправляй Алисе личные данные (адрес, телефон, пароли) — вопросы обсуждай только с родителями и преподавателем.

🛠️ Мини-проект: собери программу сам

Открой Python в Minecraft (C). Не копируй готовое решение — иди по шагам. Отмечай галочкой, что уже сделал.

Выполнено шагов: 0 из 7
Шаг 1 Функция-обработчик

Создай функцию on_item_interacted без параметров. Внутри можно написать player.say("..."), чтобы проверить, что яблоко «слышит» код.

Шаг 2 Привязка к яблоку

После функции добавь регистрацию: ENCHANTED_APPLE и имя функции. Используй яблоко в игре — должно появиться сообщение.

Шаг 3 Угол куба

Сохрани player.position(), вычисли posX, posY, posZ через get_value(Axis.X) и сдвинь X и Z вперёд (например +10).

Шаг 4 Тройной цикл

Три вложенных for с range(16). Счётчики: x, y, z.

Шаг 5 Случайный блок

Внутри цикла: block = blocks.block_by_id(randint(0, 800)). Ошибки в чате про «предмет» можно игнорировать.

Шаг 6 Поставить блок

blocks.place(block, world(posX + x, posY + y, posZ + z)). Запусти один раз в своём мире — куб большой, подожди завершения.

Шаг 7 Тест и рефлексия

Покажи результат преподавателю. Что получилось красиво? Что бы ты изменил (размер, смещение, диапазон randint)?

🔐 Готовое решение — только если застрял или преподаватель разрешил.

strange_things_solution.py

                

📝 Проверь себя

1. Сколько блоков в кубе 16×16×16?

2. Какой предмет запускает наш проект?

3. Зачем сдвигаем posX и posZ от позиции игрока?

4. Почему лучше тестировать в своём мире?

💭 Рефлексия