1 урок Введение и подготовка
Скачать 2.7 Mb.
|
9 урок: Расстояние между объектом и создание бота.Путешествуя по миру Minecraft, легко заблудиться и забыть, где находится дом. Так можно бродить часами и в итоге обнаружить, что оказался еще дальше от него, чем был в начале. Как же определить, близко ли дом? С помощью всего нескольких строк кода можно узнать, на каком расстоянии от любой точки мира Minecraft (в нашем случае — от дома) находится игрок. А затем сравнить это расстояние с определенным количеством блоков. Если игрок отошел от дома не дальше чем на 40 блоков, будем считать, что дом близко. Давайте же создадим такую Python программу! Нужно вычислить, насколько игрок удалился от дома. И основную часть работы возьмет на себя код представленный ниже From mcpi.minecraft import Minecraft Mc = Minecraft.create() Import math homeX = 10 homeZ = 10 pos= mc.player.getTilePos() x= pos.x z = pos.z Предполагается, что дом игрока имеет координаты x = 10 и z = 10, которые хранятся в переменных homeX и homeZ , а y-координата нам в данном случае не нужна. С помощью функции getTilePos() получаем позицию игрока и присваиваем значения переменным x и z. Чтобы вычислить расстояние, воспользуемся формулой из теоремы Пифагора. Она позволяет узнать длину гипотенузы прямоугольного треугольника по двум его катетам, а нам пригодится, чтобы рассчитать расстояние между двумя точками. Возможно, вы помните эту формулу из уроков математики: 𝑎2+𝑏2 =𝑐2 , где a и b — это два катета прямоугольного треугольника, а c — его гипотенуза. На рис. 5.5 показано, как рассчитать расстояние от игрока до дома при помощи формулы c = √𝑎2+𝑏2. В строке кода находим длину гипотенузы (на рисунке — c) и присваиваем ее переменной distance. Код нужно немного доработать. Воспользуйтесь операцией «меньше или равно», чтобы выяснить, действительно ли distance меньше или равно 40. Результат отправьте в чат в виде сообщения "Дом игрока близко: True/False". Запустите программу. Если игрок рядом с домом, она должна вывести в чат True, а если дальше чем на 40 блоков — False. Результат работы программы показан на рисунке ниже. Теперь можем приступить к созданию бота. Прежде всего разберемся что такое Искусственный интеллект(ИИ) – это особая программа которая выполняет различные творческие функции, которые традиционно считаются особенностью человека и способные от исходных данных выполнять самостоятельно правильные действия. Уже есть программы, которые способны обыграть человека в шахматы. В настоящее время мало сфер, где он не задействован, мы же создадим бота в Minecraft который будет следовать за нами, в свою очередь если мы уйдем – он загрустит и будет стоять на месте пока мы к нему снова не вернемся. Разделим программу на 2 части. В первой части будут оговорены правила в помощью которых бот решает, что делать; дальше, во второй, напишем код для перемещения бота. Добавим новую строчку import math, это математика, которая позволит определить расстояние до нашего бота. From mcpi.mincraft import Mincraft Impor mcpi.block as block From mincraftstuff import MinecraftDrawing Import math Import time mc=Minecraft.create() mcdraw=MincraftDrawing(mc) Напишем функцию для определения этого самого расстояния. Для этого вычисляем разницу по координатам x,y,z, от первого и второго pos; Sqrt – обозначение квадратного корня, взятие корня из квадратов полученных координат даст нам кратчайшее расстояние между объектами. Создадим несколько переменных для нашего бота FAR_AWAY – расстояние больше которого бот будет нас терять, далее настроение бота. Затем определяем наши координаты и ставим бота недалеко от нас. getHeight мы определяем высоту блока на координатах, которые мы ему дадим, иными словами чтобы бот не парил над землей, а ходил по ней. Напишем основной бесконечный цикл работы нашего бота Сначала определяем наши координаты, чтобы воспользоваться нашей заготовленной функцией, определяющей расстояние между нами и нашим ботом, затем воспользуемся условиями для проверки настроений, если бот счастлив и недалеко от нас тогда бот начинает идти к нам. Если он счастлив и мы далеко, бот начинает грустить и начинает стоять на месте. Но если блок уже грустит, то проверим расстояние между нами и нашим ботом, если мы близки, то бот становится happy (счастливым) и снова готов идти за нами. Допишем часть отвечающую за передвижение нашего бота Для начала строится мысленно линия от нас до бота, движение осуществляется в этой линии будут определяться блоки от бота до нас, бот будет перемещаться, а на его месте создаться блок воздуха, тоесть наш блок исчезнет с прошлой координаты. Бот каждые 0.25 секунд будет следовать за нами Запустим модуль и попробуем улететь от нашего бота Создайте бота, с аналогичным функциями, но вместо состоящего из 1 блока расширьте, по крайней мере 2 блоков. При хороших навыках строительства можете создать полноценного персонажа из блоков. import math import time mc = Minecraft.create () mcdraw = MinecraftDrawing (mc) def distanceBetweenPoints (pos1, pos2) : xd = pos2.x - posl.x yd = pos2.y - pos1.y zd = pos2.z - posl.z return math.sqrt ( (xd*xd) + (yd*yd) + (zd*zd)) FAR AWAY = 15 blockMood = "happy" friend = mc.player.getTilePos () friend.x = friend.x + 5 friend.y = mc.getHeight (friend.z, friend. z) me. setBlock (friend.z, friend.y, friend.z, block.DIAMOND_BL while True: pos = mc.player.getTilePos () distance = distanceBetweenPoints (pos, friend) if blockMood == "happy": if distance < FAR AWAY: target = pos.clone () else: blockMood = "sad" mc.postToChat (" elif blockMood == "sad": if distance <= 2: blockMood = "happy" mc.postToChat (" FAR AWAY = 15 blockMood = "happy" friend = mc.player.getTilePos () friend.x = friend.x + 5 friend.y = mc.getHeight (friend.z, friend.z) me. setBlock(friend.z, friend.y, friend.z, block.DIAMOND_BLOCK.id) while True: pos = mc.player.getTilePos () distance = distanceBetweenPoints (pos, friend) if blockMood == "happy": if distance < FAR AWAY: target = pos.clone () else: blockMood = "sad" mc.postToChat (" elif blockMood == "sad": if distance <= 2: blockMood = "happy" mc.postToChat (" if friend != target: line = medraw.getLine (friend.x, friend.y, friend., target.x, target.y, target.z) for nextBlock in line[:-1]: mc. setBlock (friend.x, friend.y, friend.z, block.AIR.id) friend = nextBlock.clone () friend.y = mc.getHeight (friend.x, friend.z) mc. setBlock (friend.x, friend.y, friend., block.DIAMOND_BLOCK.id) time.sleep (0.25) target = friend.clone () time.sleep (0.25) |