Для начала создадим python файл под названием classics и сохраним его в любое удобное для нас место. Импортируем нужные для нашей программы библиотеки и модули: minecraft, block и time. В переменную mc поместим команду для проведения операций в игре. В переменной pos будем хранить позиции персонажа на момент запуска программы.
В xp, yp и zp будут расположенные координаты для создания платформы. Чтобы она появилась на приличной для нас высоте, нам нужно к позиции Y прибавить 50. Создадим функцию под названием classics, принимающую аргументы x, y и z. Данная функция будет строить платформу 3 на 7 из железных блоков. В этой платформе будут еще 7 алмазных блоков, на которые игрок должен будет наступать.
Игрока обязательно телепортируем на платформу, чтобы игра не началась без него. Используем функцию classics для создания платформы в тех координатах, которые мы объявляли еще до создания функции. Создадим переменные для подсчета очков, времени от начала игры, уровня и количества алмазных блоков, оставшихся для повышения уровня. Как только игрок соберет все алмазные блоки, он получит повышение уровня и все алмазные блоки снова появятся на платформе.
В чат игры сделаем вывод сообщения за 10 секунд до началы игры. Для остановки программы используем команду time.sleep. После истечения времени в чат сделаем вывод сообщения о начале игры. Добавим бесконечный цикл, останавливающий программу на одну секунду. В переменную timer будет прибавляться единица. В pos мы записываем еще раз команду для получения координат персонажа. Эта переменная будет обновляться каждую новую итерацию, то есть каждый раз, когда цикл будет повторяться. Для удобства координату каждой оси поместим в переменные x, y и z. В переменной Y у позиции отнимаем единицу для того, чтобы получать координаты блока под ногами.
Команду для получения номера блока поместим в переменную b. В качестве аргументов передадим три переменные, которые мы создавали выше. Запишем несколько условий. Первое условие будет считывать нахождение игрока на алмазном блоке. В этом случае прибавляется один балл, у переменной diamonds (для подсчета оставшихся алмазных блоков) отнимается единица, на месте алмазного блока образуется железный блок, а в чат отображается информация о набранных очках, пройденном времени, уровне игрока и количестве оставшихся алмазных блоков.
Второе условие считывает нахождение игрока на железном блоке. В этом случае игроку начисляются 3 штрафных балла, блок исчезает и в чат происходит вывод информации об игре. Третье условие нужно на случай, если игрок наступил на все алмазные блоки. В этом случае переменная diamonds снова становится равной 7, повышается уровень, производится вывод информации об игре в чат и используется функция classics для обновления платформы.
Последнее условие будет для поражения игрока. Если персонаж упадет с платформы, то в чат игры произойдет вывод итогов: сколько очков набрал игрок, за какое время и какого уровня он достиг. Затем мы уберем платформы из игры, чтобы не засорять карту и в чат последует вывод сообщения об окончании игры. Командой break мы оборвем цикл и программа будет отключена.
Проверяем игру в деле.
Для того, чтобы научиться создавать игры в Minecraft с помощью языка программирования Python, записывайтесь к нам на онлайн-курс по Minecraft. А также не пропускайте наши видеоуроки на YouTube, где мы создаем много интересных проектов на Python и других языках программирования.
Полный скрипт игры:
import mcpi.minecraft as minecraft
import mcpi.block as block
import time
mc = minecraft.Minecraft.create()
pos = mc.player.getTilePos()
xp = pos.x
yp = pos.y + 50
zp = pos.z
def classics(x, y, z):
mc.setBlocks(x - 1, y - 1, z, x + 1, y - 1, z + 6, block.IRON_BLOCK.id)
mc.setBlock(x, y - 1, z + 1, block.DIAMOND_BLOCK.id)
mc.setBlock(x - 1, y - 1, z + 2, block.DIAMOND_BLOCK.id)
mc.setBlock(x + 1, y - 1, z + 2, block.DIAMOND_BLOCK.id)
mc.setBlock(x, y - 1, z + 3, block.DIAMOND_BLOCK.id)
mc.setBlock(x - 1, y - 1, z + 4, block.DIAMOND_BLOCK.id)
mc.setBlock(x + 1, y - 1, z + 4, block.DIAMOND_BLOCK.id)
mc.setBlock(x, y - 1, z + 5, block.DIAMOND_BLOCK.id)
mc.player.setTilePos(xp, yp + 2, zp)
classics(xp, yp, zp)
scores = 0
timer = 0
level = 1
diamonds = 7
mc.postToChat("Привет! Через 10 секунд начнется игра Классики!")
time.sleep(10)
mc.postToChat("Игра началась! Удачи!")
while True:
time.sleep(1)
timer += 1
pos = mc.player.getTilePos()
x = pos.x
y = pos.y - 1
z = pos.z
b = mc.getBlock(x, y, z)
if b == block.DIAMOND_BLOCK.id:
scores += 1
diamonds -= 1
mc.setBlock(x, y, z, block.IRON_BLOCK.id)
mc.postToChat("Scores: " + str(scores))
mc.postToChat("Timer: " + str(int(timer)))
mc.postToChat("Level: " + str(int(level)))
mc.postToChat("Diamonds: " + str(diamonds))
if b == block.IRON_BLOCK.id:
scores -= 3
mc.setBlock(x, y, z, block.AIR.id)
mc.postToChat("Scores: " + str(scores))
mc.postToChat("Timer: " + str(int(timer)))
mc.postToChat("Level: " + str(int(level)))
mc.postToChat("Diamonds: " + str(diamonds))
if diamonds == 0:
diamonds = 7
level += 1
mc.postToChat("Scores: " + str(scores))
mc.postToChat("Timer: " + str(int(timer)))
mc.postToChat("Level: " + str(int(level)))
classics(xp, yp, zp)
if y < yp - 1:
mc.postToChat("Total:")
mc.postToChat("Scores: " + str(scores))
mc.postToChat("Timer: " + str(int(timer)))
mc.postToChat("Level: " + str(int(level)))
mc.setBlocks(xp - 1, yp - 1, zp, xp + 1, yp - 1, zp + 6, block.AIR.id)
mc.postToChat("Game Over!!!")
break