Инструкции, как скачать 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” в школе “Пиксель”. Будем создавать большие проекты и покорять программирование вместе!