
Перейдем к программированию.
Создание кода
Создадим Python-файл под названием plane (в переводе с английского — самолет). Импортируем модули minecraft, block, minecraftstuff и time. Благодаря модулю minecraftstuff мы спроектируем самолет и будем им управлять. В переменную mc присвоим команду для операций в игре. В mcdrawing — команду для создания различных фигур и моделей. В нашем случае это самолет.
Создадим переменную planeBlocks с пустым списком. Следом у этого списка вызываем специальную функцию добавления в него элементов. Добавим туда относительные координаты расположения железного блока, который будет являться носовой частью самолета. Данные координаты будем задавать относительно определенной точки, которую зададим в коде чуть позже.


Определим цикл for с 10-ти кратным повторением кода. Таким образом мы построим корпус самолета. Верхнюю часть самолета построим неполностью. Оставим место для блоков стекла. Условием укажем места, где строить железный блок не нужно.


Следующий цикл for сделает крылья у самолета. Каждая строчка внутри цикла строит одну строчку из железных блоков.


Ниже добавим еще два цикла для строительства хвоста.


И наконец добавим цикл, который добавит к самолету стеклянные блоки.


Проект самолета полностью готов. Осталось сделать управление.
Определим позицию персонажа и при старте игры отправим его на высоту 150. Затем укажем позицию самолета, который будет находиться на два блока дальше от персонажа.
Переменная planeShape содержит команду строительства самолета. В скобки поместим три переменные: переменную для операций в игре, позицию самолета и список с блоками, из которых будет состоять самолет. Помним, что в списке мы указывали относительные координаты от определенной позиции. Переменная planePos является той самой определенной позицией.


В переменных x, y, z содержатся специальные цифры, которые будут влиять на управление самолетом. Переменные x и y содержат числа -1. В дальнейшем будет понятно почему.
Чуть ниже сделаем две переменные, влияющие на режимы игры. Переменная isExit будет контролировать, завершена ли программа, а inPlane — переключать режим просмотра. Если inPlane будет True, значит персонаж будет сидеть в самолете и не сможет никуда покинуть свое место. Если режим будет иметь значение False, то камера наблюдения за самолетом будет свободной.

Перед запуском цикла изложим правила игры и управления самолетом.

В бесконечном цикле создадим переменную b, в которой содержится команда, считывающая блок под самолетом. Эта переменная будет нужна нам для организации поведения самолета во время столкновения с другим объектом.
Ниже активируем команду, в которую поместим переменные x, y, z. Значения у “x” и “y” определяют движение самолета вперед и вниз. Так эмитируется падающий самолет, у которого двигатель еще не запущен. Программа останавливается на 0,5 секунд.
Условие с inPlane реализует режим обзора из самолета. Сделано это просто. Персонажа постоянно телепортирует на самолет. Из-за этого создается ощущение, что персонаж сидит в кресле самолета.

В переменную chat поместим команду для операций с чатом. Циклом for начнем читать чат. Настроим таким образом управление самолета. На букву s самолет будет снижаться, на букву w — подниматься, на букву d — лететь вправо, на букву a — влево. Буква q запускает двигатель или задает прямую траекторию движения.




Для выхода из программы сделаем команду end. В этом случае самолет исчезает и включиться режим выхода из программы.

На букву v добавим интересный режим переключения обзора. Командой not будем ставить противоположное значение inPlane. Если inPlane равен True, то персонаж сидит в самолете, если False — персонаж в свободном полете.


Если же самолет сталкивается с препятствием, в чат выводится аварийное сообщение, далее самолет загорается и взрывается. Программа при этом отключается.


В самом низу программы реализуем логику завершения программы посредством команды break.

Испытаем наш симулятор.
Полный код программы
import mcpi.minecraft as minecraft
import mcpi.block as block
import minecraftstuff
import time
mc = minecraft.Minecraft.create()
mcdrawing = minecraftstuff.MinecraftDrawing(mc)
planeBlocks = []
planeBlocks.append(minecraftstuff.ShapeBlock(-1,1,0,block.IRON_BLOCK.id))
for i in range(10):
planeBlocks.append(minecraftstuff.ShapeBlock(i,0,0,block.IRON_BLOCK.id))
planeBlocks.append(minecraftstuff.ShapeBlock(i,1,1,block.IRON_BLOCK.id))
if i != 0 and i != 2 and i != 4 and i != 6:
planeBlocks.append(minecraftstuff.ShapeBlock(i,2,0,block.IRON_BLOCK.id))
planeBlocks.append(minecraftstuff.ShapeBlock(i,1,-1,block.IRON_BLOCK.id))
for i in range(-4,5):
planeBlocks.append(minecraftstuff.ShapeBlock(3,1,i,block.IRON_BLOCK.id))
planeBlocks.append(minecraftstuff.ShapeBlock(4,1,i,block.IRON_BLOCK.id))
planeBlocks.append(minecraftstuff.ShapeBlock(5,1,i,block.IRON_BLOCK.id))
for i in range(-4,5):
planeBlocks.append(minecraftstuff.ShapeBlock(9,1,i,block.IRON_BLOCK.id))
for i in range(1, 4):
planeBlocks.append(minecraftstuff.ShapeBlock(9,i,-4,block.IRON_BLOCK.id))
planeBlocks.append(minecraftstuff.ShapeBlock(9,i,4,block.IRON_BLOCK.id))
for i in range(0, 7, 2):
planeBlocks.append(minecraftstuff.ShapeBlock(i,2,0,block.GLASS.id))
pos = mc.player.getTilePos()
mc.player.setTilePos(pos.x, 150, pos.z)
planePos = mc.player.getTilePos()
planePos.x += 2
planeShape = minecraftstuff.MinecraftShape(mc, planePos, planeBlocks)
x = -1
y = -1
z = 0
isExit = False
inPlane = False
mc.postToChat("Добро пожаловать с Симулятор самолета в Minecraft.")
mc.postToChat("Твоя задача - высоко лететь в небе и дальше держаться от суши.")
mc.postToChat("Управление осуществляется через чат.")
mc.postToChat("q - ЗАПУСК ДВИГАТЕЛЯ")
mc.postToChat("w - вверх.")
mc.postToChat("s - вниз.")
mc.postToChat("a - влево.")
mc.postToChat("d - вправо.")
mc.postToChat("end - завершить игру.")
mc.postToChat("v - переключить обзор камеры.")
while True:
b = mc.getBlock(planePos.x, planePos.y - 1, planePos.z)
planeShape.moveBy(x, y, z)
time.sleep(0.5)
if inPlane:
mc.player.setTilePos(planePos.x, planePos.y + 3, planePos.z)
chat = mc.events.pollChatPosts()
for c in chat:
m = c.message
if m == "s":
mc.postToChat("Направление вниз.")
y = -1
elif m == "w":
mc.postToChat("Направление вверх.")
y = 1
elif m == "d":
mc.postToChat("Поворот направо.")
z = -1
elif m == "a":
mc.postToChat("Поворот налево.")
z = 1
elif m == "q":
mc.postToChat("Курс прямо.")
y = 0
z = 0
elif m == "end":
mc.postToChat("До свидания!")
planeShape.clear()
isExit = True
elif m == "v":
mc.postToChat("Обзор камеры изменен!")
inPlane = not inPlane
if b != block.AIR.id:
mc.postToChat("Самолет потерпел крушение!!! Всем покинуть свои места!!!")
x = planePos.x
y = planePos.y
z = planePos.z
mc.setBlocks(x + 10, y + 1, z, x, y + 1, z, block.TNT.id)
mc.setBlocks(x + 10, y + 2, z, x, y + 2, z, block.FIRE.id)
isExit = True
if isExit:
break
Если вы хотите получше познакомиться с языком Python и научиться создавать классные проекты в Майнкрафте, приходите к нам в школу “Пиксель”! У нас есть полный курс по программированию на Python в Minecraft, где вы сможете учиться под руководством наставника. Вместе мы создадим мини-игры, научимся делать бота в Майнкрафте и использовать правило случайного числа и многое другое. Присоединяйтесь!