Привет, друзья! Мы в школе “Пиксель” публикуем бесплатные уроки Minecraft, чтобы познакомить детей с программированием на Python и увлечь их созданием своих игр. Этот урок Minecraft мы посвятим небольшой хитрости. Расскажем, как сделать секретный замок на дверь в 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
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” в школе “Пиксель”. Будем создавать большие проекты и покорять программирование вместе!