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

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

Как построить подводную лодку в “Майнкрафт” без модов, не потратив много времени? На помощь придет язык программирования Python. Подключив Python к Minecraft, можно упростить процесс создания игровой карты: многие предметы вы можете воплощать, используя всего лишь скрипт.
Онлайн-школа программирования для детей “Пиксель” делится полезными бесплатными уроками, которые помогают создавать интересные постройки всего за 5-10 минут.
В данном уроке мы покажем, как создать подводную лодку в Minecraft, используя язык программирования Python, и как запрограммировать ее движения. Главная задача игрока — не допустить столкновение подводной лодки с препятствием. Также подводной лодке запрещено подниматься слишком высоко, иначе игра будет завершена.
Давайте перейдем к написанию скрипта. Если вам удобнее изучать материал в видеоформате, мы добавим видеоурок в конце этой статьи.

Создание файла и начало программирования подводной лодки на “Майнкрафте”

Создадим python-файл под названием sub. В переводе с английского это слово переводится как подводная лодка. Импортируем необходимые инструменты для разработки: модули minecraft, block и time, а также библиотеку minecraftstuff, которая нам нужна для создания подводной лодки.
В переменную mc поместим команду для проведения операций в игре. Позицию персонажа поместим в переменную pos. На следующей строчке позицию по оси Y приравняем к значению 59. В нашем случае это значение говорит об уровне воде. На этом уровне и будет появляться лодка.
Используя функцию ShapeBlock из библиотеки minecraftstuff, мы спроектируем подводную лодку из железных блоков, стекла и алмазных блоков. С помощью алмаза сделаем лодке перископ.
MinecraftShape из модуля minecraftstuff поместим в переменную subShape. Это нужно, чтобы лодка появилась в игре и можно было задать ей управление в будущем. В качестве аргументов функции MinecraftShape передадим переменную mc, чтобы связаться с игрой, переменную pos — чтобы обозначить позицию лодки, а переменную sub — чтобы показать логику строения подводной лодки, а также материал, из которого она состоит. Переменные xSub, ySub, zSub нам нужны для управления лодкой. Пока поместим туда нули.
За завершение игры будет отвечать переменная over, содержащая в себе значение False, которое означает, что режим завершения игры пока отключен. Скорость передвижения лодки будет зависеть от времени, на которое программа будет останавливаться. Для этого создадим переменную t, куда будем помещать количество секунд. По умолчанию это будет единица.
Выведем в чат приветственное сообщение, условия игры и управление лодкой. После этого начнется игра.
Запускаем бесконечный цикл, который будет останавливаться раз в t секунд, то есть раз в одну секунду по умолчанию. Это число будет меняться в зависимости от того, что в чате напишет игрок.
В переменную b поместим команду для считывания номера блока в определенном месте. Считывать мы будем блок, который находится чуть выше вершины лодки в области носовой зоны. Таким образом программа будет определять момент столкновения или слишком высокий подъем из воды.
Функция moveBy задает направление лодке. По запуску программы она будет стоять на месте. Чтобы реализовать управление, необходимо в переменную chat поместить специальную команду для получения сообщений из чата. Цикл for будет проводить считывание этих сообщений. А в переменной M будет находиться то сообщение, которое написал игрок в чат. Добавим ряд условий. Начнем с запуска двигателя. Если игрок напишет start, то xSub будет равен -1 (в нашем случае это движение вперед).
Добавим условие для остановки лодки. Значение xSub теперь равно 0.
Если напишем up, то лодка будет двигаться вверх, если down — вниз, mid — прямо. Для этого нужно работать со значением ySub.
Команды s1, s2 и s3 будут регулировать скорость подводной лодки. Скорость s1 самая медленная, а s3 — самая быстрая, так как при s3 остановка программы идет на одну миллисекунду.
Команда control будет показывать управление игрока (вдруг игрок забудет управление).
Команда exit прекращает игру. Функция clear удаляет лодку из игры, а в переменной over значение меняется на True. Данная переменная будет использована в конце программы.

Добавление условий проигрыша

А теперь нужно написать условие проигрыша. Если датчик, то есть команда которая считывает номер блока в заданном месте, не обнаружит воды (WATER_STATIONARY — это вода в стоячем состоянии), то игра заканчивается и лодка исчезает. Команда break завершает работу цикла.
Перейдем к написанию очень маленького условного блока. Если over будет равен True (можно просто написать over), то командой break завершим работу цикла.
Протестируем игру полностью.
Если вы хотите продолжить создавать постройки и даже целые игры в Minecraft, используя язык программирования Python, то записывайтесь на курсы в школе “Пиксель”, и мы вас всему научим!

Полный код для лодки из урока:

import mcpi.minecraft as minecraft
import mcpi.block as block
import minecraftstuff
import time
mc = minecraft.Minecraft.create()
pos = mc.player.getTilePos()
pos.y = 59
sub = [
minecraftstuff.ShapeBlock(0, 0, 0, block.IRON_BLOCK.id),
minecraftstuff.ShapeBlock(1, 0, 0, block.IRON_BLOCK.id),
minecraftstuff.ShapeBlock(-1, 0, 0, block.IRON_BLOCK.id),
minecraftstuff.ShapeBlock(-2, 1, 0, block.GLASS.id),
minecraftstuff.ShapeBlock(-1, 1, 1, block.IRON_BLOCK.id),
minecraftstuff.ShapeBlock(-1, 1, -1, block.IRON_BLOCK.id),
minecraftstuff.ShapeBlock(0, 1, -1, block.GLASS.id),
minecraftstuff.ShapeBlock(0, 1, 1, block.GLASS.id),
minecraftstuff.ShapeBlock(1, 1, -1, block.IRON_BLOCK.id),
minecraftstuff.ShapeBlock(1, 1, 1, block.IRON_BLOCK.id),
minecraftstuff.ShapeBlock(2, 1, -1, block.IRON_BLOCK.id),
minecraftstuff.ShapeBlock(2, 1, 1, block.IRON_BLOCK.id),
minecraftstuff.ShapeBlock(2, 1, 0, block.IRON_BLOCK.id),
minecraftstuff.ShapeBlock(0, 2, 0, block.IRON_BLOCK.id),
minecraftstuff.ShapeBlock(1, 2, 0, block.IRON_BLOCK.id),
minecraftstuff.ShapeBlock(-1, 2, 0, block.IRON_BLOCK.id),
minecraftstuff.ShapeBlock(2, 2, 0, block.IRON_BLOCK.id),
minecraftstuff.ShapeBlock(1, 3, 0, block.DIAMOND_BLOCK.id),
minecraftstuff.ShapeBlock(1, 4, 0, block.DIAMOND_BLOCK.id),
minecraftstuff.ShapeBlock(0, 4, 0, block.DIAMOND_BLOCK.id),
]
subShape = minecraftstuff.MinecraftShape(mc, pos, sub)
xSub = 0
ySub = 0
zSub = 0
over = False
t = 1
mc.postToChat("Добро пожаловать! Ты диспетчер подводной лодки!")
mc.postToChat("Твоя задача - не врезаться и не всплывать слишком высоко!")
mc.postToChat("Иначе проиграешь!")
time.sleep(5)
mc.postToChat("Управление в чате:")
mc.postToChat("start: запустить лодку")
mc.postToChat("stop: остановить лодку")
mc.postToChat("up: плыть вверх")
mc.postToChat("down: плыть вниз")
mc.postToChat("mid: плыть прямо")
mc.postToChat("s1: первая скорость")
mc.postToChat("s2: вторая скорость")
mc.postToChat("s3: третья скорость")
mc.postToChat("control: управление лодкой")
mc.postToChat("exit: выйти")
time.sleep(5)
mc.postToChat("Игра началась!")
while True:
time.sleep(t)
b = mc.getBlock(pos.x - 2, pos.y + 3, pos.z)
subShape.moveBy(xSub, ySub, zSub)
chat = mc.events.pollChatPosts()
for c in chat:
m = c.message
if m == "start":
xSub = -1
mc.postToChat("Запускаю двигатель!")
elif m == "stop":
xSub = 0
elif m == "up":
ySub = 1
elif m == "down":
ySub = -1
elif m == "mid":
ySub = 0
elif m == "s1":
t = 1
elif m == "s2":
t = 0.5
elif m == "s3":
t = 0.1
elif m == "control":
mc.postToChat("Управление в чате:")
mc.postToChat("start: запустить лодку")
mc.postToChat("stop: остановить лодку")
mc.postToChat("up: плыть вверх")
mc.postToChat("down: плыть вниз")
mc.postToChat("mid: плыть прямо")
mc.postToChat("s1: первая скорость")
mc.postToChat("s2: вторая скорость")
mc.postToChat("s3: третья скорость")
mc.postToChat("control: управление лодкой")
mc.postToChat("exit: выйти")
elif m == "exit":
subShape.clear()
over = True
if b != block.WATER_STATIONARY.id:
mc.postToChat("---------------")
mc.postToChat("Ты проиграл!!!")
mc.postToChat("---------------")
time.sleep(3)
subShape.clear()
break
if over:
break

Видео по построению подводной лодки в “Майнкрафте”:

2023-02-04 19:00 Бесплатные видеоуроки Minecraft для детей