Блог онлайн школы Пиксель

Как сделать секретную дверь с паролем в Minecraft

Привет, друзья! Мы в школе “Пиксель” публикуем бесплатные уроки Minecraft, чтобы познакомить детей с программированием на Python и увлечь их созданием своих игр. Этот урок Minecraft мы посвятим небольшой хитрости. Расскажем, как сделать секретный замок на дверь в Minecraft с помощью языка программирования Python. Ну что, давайте начинать!

Инструкции, как скачать Minecraft и Python:

Принцип работы


Наш замок будет работать по следующему принципу. Рядом с домом будет находиться алмазный блок, который будет являться нашей панелью для ввода кода. Чтобы открыть дверь с кодовым замком в Майнкрафте, нужно будет в определенной последовательности нажимать мечом на грани куба изумрудного блока. Перед входом в дом мы построим золотой блок, чтобы использовать его для бесконечного использования нашего замка. Внутри дома создадим блок из шерсти и нажимную плиту, чтобы выйти из дома на улицу.
Ну а теперь приступим к выполнению данной задачи. Полный код программы вы найдете в конце материала.


Подготовка


Для того чтобы создать секретный замок на дверь, нужно сделать некоторые приготовления. Для начала откроем с вами Idle и запустим Tlauncher. Запустим сервер и зайдем на него. Теперь мы возвращаемся к нашему файлу в Idle и начинаем писать программный код!

Пишем код программы


Начинаем наш код с того, что импортируем необходимые библиотеки для работы с Minecraft:
import mcpi.minecraft as minecraft 
import mcpi.block as block
import time

Самая важная библиотека, которую нужно подключить, — библиотека блоков, так как в процессе написания кода нам нужно будет внести в нее изменения.

Далее создаем переменную mc и присваиваем ей канал подключения к нашему серверу.

Далее мы создаем переменную diamond_pos и присваиваем ей функцию определения координат персонажа:
diamond_pos = mc.player.getTilePos()

Далее мы сдвигаемся по координате x на 1:
diamond_pos.x = diamond_pos.x + 1

Создаем переменную check, которая будет использоваться как счетчик. А также данной переменной присвоим значение 0:
check = 0

Далее создаем с вами алмазный блок с помощью функции setBlock:
mc.setBlock(diamond_pos.x, diamond_pos.y, diamond_pos.z, block.DIAMOND_BLOCK.id)

Пишем код для дома


Теперь нам нужно сделать наброски нашего дома, а также под дверью поставить блок красного камня с редстоуновым факелом. Приступаем.


Для начала, используя функцию setBlocks создадим каркас нашего дома:
mc.setBlocks(diamond_pos.x+4, diamond_pos.y-1, diamond_pos.z, diamond_pos.x+14,diamond_pos.y+14,diamond_pos.z+14, block.IRON_BLOCK.id)
mc.setBlocks(diamond_pos.x+5, diamond_pos.y, diamond_pos.z +1, diamond_pos.x+13,diamond_pos.y+13,diamond_pos.z+13, block.AIR.id)
mc.setBlock(diamond_pos.x+7,diamond_pos.y,diamond_pos.z, block.AIR.id)
mc.setBlock(diamond_pos.x+7,diamond_pos.y+1,diamond_pos.z, block.AIR.id)

Для того чтобы создать под нашей дверью блок из красного камня, а также поставить на него редстоуновый факел, нужно дописать данный блок и предмет из инвентаря в файл block, который располагается в папке mcpi.

Вот теперь мы можем использовать эти элементы в наше программе:
mc.setBlock(diamond_pos.x+7,diamond_pos.y-2,diamond_pos.z, block.REDSTONE_TORCH.id)
mc.setBlock(diamond_pos.x+7,diamond_pos.y-3,diamond_pos.z, block.REDSTONE_BLOCK.id)
Для того, чтобы использовать замок бесконечно, создаем золотой блок перед домом:
mc.setBlock(diamond_pos.x+7,diamond_pos.y-1,diamond_pos.z-1, block.GOLD_BLOCK.id)

Внутри дома создаем блок из шерсти и нажимную плиту, которую также нужно добавить в библиотеку блоков:
mc.setBlock(diamond_pos.x+7,diamond_pos.y-1,diamond_pos.z-1, block.GOLD_BLOCK.id)
mc.setBlock(diamond_pos.x+7,diamond_pos.y,diamond_pos.z+1, block.STONE_PLATE.id)
Далее мы создаем функцию checkHit(), в которой нужно прописать обработку события касания граней блока:
def checkHit():
    check=0
    events = mc.events.pollBlockHits()
    for e in events:
        pos = e.pos

А также прописываем условие, которое по итогу возвращает нам грань куба, которая была нажата:
        if e.face <6:
            return e.face 

Наша функция готова и осталось совсем немного. Сейчас самое время придумать пароль, который состоит из цифр от 0 до 5. Однако, использовать цифру ноль не очень удобно, так как это нижняя грань изумрудного куба.

Пароль, который я буду реализовывать, — это число 123.

Начинаем мы с того, что создаем бесконечный цикл:
while True

Внутри цикла мы вызываем нашу функцию checkhit() и начинаем проверять, какие грани куба были нажаты. 

Если была нажата грань куба под номером 1, то переменной check мы будет добавлять единицу, а также напишем в чат, что грань верна:
mc.postToChat("Success").

После чего вновь вызываем функцию checkHit, которая будет выполняться заново в том случае, если была нажата не та грань куба.

Далее мы проверяем и оставшиеся цифры, не забывая добавлять к переменной check каждый раз единицу:
while True:
    checkHit()
    if checkHit() == 1:
        check +=1
        mc.postToChat("Success")
        checkHit()
    elif checkHit() == 2 and check == 1:
        check +=1
        mc.postToChat("Success")
        checkHit()
    elif checkHit() == 3 and check == 2:
        check +=1
        mc.postToChat("Success")
        checkHit()

В последнем условии прописываем создание блока из камня, чтобы запустить механизм работы красного камня и редстоунового факела:
    elif check == 3:
        while check!=4:
            mc.postToChat("Open the door")
            mc.setBlock(diamond_pos.x+7,diamond_pos.y-3,diamond_pos.z, block.STONE.id)

А также присваиваем переменной check значение 4, чтобы завершить проверку условий:
check = 4

И теперь пришло время разобраться с принципом работы обратного механизма, то есть в том, как открыть дверь, если мы будем находиться внутри дома.

Для этого создаем переменную ppos. Она понадобится, чтобы считать блок под ногами персонажа:
    ppos = mc.player.getTilePos()

Затем прописываем условия, что если мы стоим на блоке из шерсти, то мы заменяем редстоуновый факел под дверью на воздух, и в начале нашей программы дописываем новую переменную woolflag = 0, которая не дает использовать функционал золотого блока до того, как игрок попал внутрь дома.

В данном условии присваиваем этой переменной значение 1:
    if mc.getBlock(ppos.x,ppos.y-1,ppos.z) == block.WOOL.id:
        mc.setBlock(diamond_pos.x+7,diamond_pos.y-2,diamond_pos.z, block.AIR.id)
        woolflag = 1

Прописываем последнее условие, благодаря которому наша программа будет работать бесконечно и мы сможем использовать наш секретный замок бесконечно:
    elif mc.getBlock(ppos.x,ppos.y-1,ppos.z) == block.GOLD_BLOCK.id and woolflag ==1:
        mc.setBlock(diamond_pos.x+7,diamond_pos.y-2,diamond_pos.z, block.REDSTONE_TORCH.id)
        mc.setBlock(diamond_pos.x+7,diamond_pos.y-3,diamond_pos.z, block.REDSTONE_BLOCK.id)
        checkHit()
        check = 0
        woolflag = 0


Полный код программы:


import mcpi.minecraft as minecraft
import mcpi.block as block
import time
mc = minecraft.Minecraft.create()
diamond_pos=mc.player.getTilePos()
diamond_pos.x=diamond_pos.x+1
check = 0

mc.setBlock(diamond_pos.x, diamond_pos.y, diamond_pos.z, block.DIAMOND_BLOCK.id)
mc.setBlocks(diamond_pos.x+4, diamond_pos.y-1, diamond_pos.z, diamond_pos.x+14,diamond_pos.y+14,diamond_pos.z+14, block.IRON_BLOCK.id)
mc.setBlocks(diamond_pos.x+5, diamond_pos.y, diamond_pos.z +1, diamond_pos.x+13,diamond_pos.y+13,diamond_pos.z+13, block.AIR.id)
mc.setBlock(diamond_pos.x+7,diamond_pos.y,diamond_pos.z, block.AIR.id)
mc.setBlock(diamond_pos.x+7,diamond_pos.y+1,diamond_pos.z, block.AIR.id)
mc.setBlock(diamond_pos.x+7,diamond_pos.y-2,diamond_pos.z, block.REDSTONE_TORCH.id)
mc.setBlock(diamond_pos.x+7,diamond_pos.y-3,diamond_pos.z, block.REDSTONE_BLOCK.id)
mc.setBlock(diamond_pos.x+7,diamond_pos.y-1,diamond_pos.z+1, block.WOOL.id)
mc.setBlock(diamond_pos.x+7,diamond_pos.y-1,diamond_pos.z-1, block.GOLD_BLOCK.id)
mc.setBlock(diamond_pos.x+7,diamond_pos.y,diamond_pos.z+1, block.STONE_PLATE.id)
woolflag = 0

def checkHit():
    check=0
    events = mc.events.pollBlockHits()
    for e in events:
        pos = e.pos
        if e.face <6:
            return e.face 
while True:
    checkHit()
    if checkHit() == 1:
        check +=1
        mc.postToChat("Success")
        checkHit()
    elif checkHit() == 2 and check == 1:
        check +=1
        mc.postToChat("Success")
        checkHit()
    elif checkHit() == 3 and check == 2:
        check +=1
        mc.postToChat("Success")
        checkHit()
    elif check == 3:
        while check!=4:
            mc.postToChat("Open the door")
            mc.setBlock(diamond_pos.x+7,diamond_pos.y-3,diamond_pos.z, block.STONE.id)
            check = 4
    ppos = mc.player.getTilePos()
    if mc.getBlock(ppos.x,ppos.y-1,ppos.z) == block.WOOL.id:
        mc.setBlock(diamond_pos.x+7,diamond_pos.y-2,diamond_pos.z, block.AIR.id)
        woolflag = 1
    elif mc.getBlock(ppos.x,ppos.y-1,ppos.z) == block.GOLD_BLOCK.id and woolflag ==1:
        mc.setBlock(diamond_pos.x+7,diamond_pos.y-2,diamond_pos.z, block.REDSTONE_TORCH.id)
        mc.setBlock(diamond_pos.x+7,diamond_pos.y-3,diamond_pos.z, block.REDSTONE_BLOCK.id)
        checkHit()
        check = 0
        woolflag = 0

Понравился ли вам наш проект? В мире Minecraft можно создать много необычных игр и заодно освоить популярный язык программирования Python, улучшить цифровые навыки. Мы программируем Minecraft на Python, создаем игры онлайн, экспериментируем и развиваемся вместе с любимой игровой вселенной. Всех самых активных и любящих Майнкрафт приглашаем на углубленный курс “Python-программирование в Minecraft” в школе “Пиксель”. Будем создавать большие проекты и покорять программирование вместе!

2021-06-30 08:00 Бесплатные видеоуроки Minecraft для детей