Файл: 1 урок Введение и подготовка.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 27.04.2024

Просмотров: 56

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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 , где 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 (" Please return. I miss you
elif blockMood == "sad":
if distance <= 2:
blockMood = "happy"
mc.postToChat (" Hooray! Let's go!")

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 (" Please return. I miss you..
elif blockMood == "sad":
if distance <= 2:
blockMood = "happy"
mc.postToChat (" Hooray! Let's go!")
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)

10 урок: Случайные числа, списки.




Урок 9 Случайные числа, списки

Что такое случайность? Случайность он же random, это некое явление или событие которое в идеале невозможно предсказать, например, когда вы подбрасываете монетку, или выбираете случайного персонажа в какой-либо игре. Даже гуляя вы можете поскользнуться на банановой кожуре и она может быть выше 0%. Но что значит вероятность? Все эти проценты, как они связаны с искусственным интеллектом. Все дело в том что многие вещи в искусственном интеллекте могут быть завязаны на применении случайных чисел, что бы программа была непредсказуемой, а значит более похожей на поведение человека. Случайное число представляет собой число можно только угадать. Представим игральный кубик, у него 6 граней со сторонами от 1 до 6. Всего 6 возможных чисел. Вероятность – величина которая показывает наступление того или иного события. 100% - событие произойдет несмотря ни на что. Так, например, вероятность того, что завтра наступил ночь. Но если мы хотим, чтобы на кубике выпало например число 3, то вероятность выпада уже будет 1/6*100%. 



Давайте для начала посмотрим как работает рандом.

Импортируем библиотеку случайных чисел. Напишем цикл в котором мы будем генерировать случайное число от 1 до 10 и если это случайное число будет равно 1, то выведем какую либо фразу.

Чтобы создать генератор случайных чисел, первым делом импортируйте в начале кода модуль random. Затем воспользуйтесь функцией randint()  — она выведет в окне консоли случайное целое число. Функция randint() содержит два аргумента — наименьшее и наибольшее из возможных значений. В этом примере могут быть сгенерированы числа

1, 2, 3, 4, 5, 6,7 ,8, 9, 10.

import random import time
while True:
r = random. randint (1,10)
if r == 1:
print ("win")
else:
print ("lose")

Какая вероятность выпада нашего числа?

И теперь нам выводятся разные фразы выигрыша и проигрыша.

 

 

Теперь давайте вернемся к прошлому занятию и изменим немного программу. Добавим библиотеку random. Добавим возможность боту обидеться за то, что мы его бросили.

Вернемся к коду с прошлого и урока и допишем код с вероятностью


10%, что он может на нас обидеться.

if random.randint(1,10) == 10:

blockMood = “hadenought”

mc.postToChat(“ That’s it. I’ve had enough!”)

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 (" Please return. I miss you..
elif blockMood == "sad":
if distance <= 2:
blockMood = "happy"
mc.postToChat (" Hooray! Let's go!")

if random.randint (1,10) == 10:
blockMood = "hadenough"
mc.postToChat ("«bot> That's it. I've had enough!")
elif blockMood == "hadenough";
if random.randint (1,50) == 50:
blockMood = "happy"
I
mc.postToChat (" Okay, I'11 forgive you")


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)

 

Теперь, когда он на нас обидеться, программа зайдет в тупик и больше он не захочет ничего делать. Давайте добавим возможность, чтобы он мог нас простить

elif blockMood == “hadenough”:

if random.randint(1,50) == 50:

blockMood = “happy” mc.postToChat(“ Okay, I’ll forgive you”)



 В данном случае мы использовали ключевое слово elif. У нас в самом начале указано слово if и проверяет равно ли его настроение счастливому, если же условие не выполняется, то код указанный ниже не выполняется и дальше под elif сравнивается другое состояние грустный ли бот , но если это уже не выполняется то проверяется под elif что наш бот обиделся, если это так то выполняется код указанный под этим условием. 


Попробуем улететь от бота, что он обиделся и попробуйте сделать так чтобы бот ваш простил.

Настало время вспомнить первые уроки, давайте напишем программу, которая будет телепортировать нашего персонажа в случайные места. Ваша задача — сделать так, чтобы игрок переместился, изменив свои координаты xи на случайные. Для этого сначала  нужно  узнать  текущие координаты игрока и прибавить к каждой из них случайное число. Чтобы изменить координаты и z, используйте значения от ‒10 до 10, а для координаты — от 0 до 10.

 From mcpi.minecraft import Minecraft
mc = Minecraft.create ()
import random www
ROS = mc.player.getPos ()
x = pos.x
y = pos. y
2 = pos.z
× = x + Fandon-sandinti(-10, 10) mc.player. setPos (x, Y, z)

mc.player.setPos(x,y,z)

 

Здесь отсутствует фрагмент кода для генерации случайных смещений по осям и — добавьте его сами. После этого игрок сможет прыгнуть в неизвестность Позвольте случаю перенести его в новые потрясающие места!

  • Давайте сделаем программу еще более непредсказуемой! После прыжка в случайное место разместите под ногами игрока блок случайно выбранного типа. Если вы телепортируете игрока туда, откуда он не сможет выбраться, запустите еще раз, и герой окажется в более безопасном месте.

Списки


В повседневной жизни мы составляем списки покупок, вещей в дорогу или перечисляем по  пунктам порядок каких-либо действий. В Python списки устроены похожим образом: они позволяют хранить целые наборы данных в определенной последовательности. Данными могут быть строки, числа, булевы значения и даже другие списки. Обычная переменная содержит единственное значение. Списки  же позволяют помещать в одну переменную множество значений, например числа от 1 до 100 или имена друзей. В других языках программирования списки часто называются массивами. При создании программ для Minecraft в списках можно хранить идентификаторы блоков, координаты игрока и много чего еще. Всё это добавляет вашим программам гибкости.

Работа со списками


 Создать список несложно — для этого заключите набор перечисленных через запятую значений в квадратные скобки. Впрочем, в квадратных скобках может и не быть значений — тогда получится пустой список. 9. Списки, словари и удары по блокам 211 Список ингредиентов для вермишелевого супа может выглядеть так:

 

»> noodleSoup = ["вода",
"соевый соус", "зеленый лук", "вермишель"
"говядина"1
Список noodleSoup содержит несколько значений, и все они являются строками. Пустой список выглядит так:

»> print (noodleSoup [0])
вода

empryList = {}



Он ничего не содержит, однако вы можете добавить в него значения позже. В Python можно не  только хранить в  списках любые значения, но и объединять значения разных типов в один список. 

давайте научимся получать доступ к данным списка и изменять их.

 Доступ к элементам списка 


Чтобы получить значение из списка (эти значения называются элементами), нужно указать его позицию — так называемый индекс. Узнать первый элемент списка ингредиентов для вермишелевого супа можно так:

Обратите внимание: первому элементу соответствует индекс 0. Соответственно, у второго элемента будет индекс 1, у третьего — 2 и так далее. Дело в том, что, работая со списками, компьютер ведет отсчет элементов с нуля. Отсчет с  нуля может показаться странным, однако для этого есть причины: первые компьютеры были очень медленными и обладали малым объемом памяти. Отсчет с нуля позволял повысить быстродействие и эффективность программ. И хотя с тех пор компьютеры стали гораздо мощнее, они по-прежнему считают с нуля. Попытавшись обратиться к элементу, которого нет в списке, вы получите сообщение об  ошибке.

Изменение элементов списка 


Отдельные значения, хранящиеся в  списке, можно менять  — точно так же как можно менять значения переменных. Это допустимо, потому что списки являются изменяемыми. Чтобы присвоить элементу новое значение, нужно обратиться к нему по индексу и задать значение так же, как мы присваивали его переменной (при помощи знака «равно»). Давайте заменим ингредиент говядина в списке noodleSoup на курица. Это пятый элемент списка, а значит, ему соответствует индекс 4 (вспомните: мы ведем отсчет от 0). Присвоить элементу 4 новое значение можно так:

» noodleSoup [4] = "курица"

Выбор случайного элемента 


Наверное, вы уже заметили, что мы используем в  коде случайные значения. Это делает работу программы при каждом запуске непредсказуемой. Иногда бывает нужно получить случайный элемент из списка — например, выбрать случайный блок из списка блоков. Для этого хорошо подходит функция choice() из модуля random. Эта функция принимает список в качестве аргумента и возвращает случайный элемент. В коде листинга 9.5 список colors содержит названия разных цветов. Программа выбирает одно из них с помощью choice() и выводит его на экран:

import random
colors = ["красный",
",
" синий",
"пурпурный"]
print (random.choice (colors))
"желтый", "оранжевый"

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

Практическое задание:

  •   Выбор случайного идентификатора блока из всего диапазона значений осложняется тем, что некоторым значениям не  соответствует какой либо тип блока. Один из способов решить эту проблему — создать список с подходящими идентификаторами и выбирать из него случайное значение с помощью choice(). Ваша задача  - составить список идентификаторов блоков, выбрать из него случайное значение и создать соответствующий блок в позиции игрока. (Подсказка: Первым делом создайте список идентификаторов. Затем получите случайный элемент, вызвав функцию random.choice(). Далее используйте функцию setBlock(), чтобы создать в игровом мире блок выбранного типа.)

Вы уже знаете, что аргументами функций setBlock() и setBlocks() являются координаты блока и его идентификатор. Однако у этих функций есть еще один, необязательный аргумент — состояние блока. Все блоки в Minecraft находятся в одном из шестнадцати состояний, которые обозначаются числами от 0 до 15. Для шерстяных блоков каждому состоянию соответствует свой цвет. С блоком «динамит» (идентификатор 46) ничего не случится, если вы ударите по нему в его обычном состоянии (состояние 0), однако в состоянии 1 он взорвется. При этом, хотя у блока любого типа есть все 16 состояний, они не обязательно различаются между собой. Чтобы задать состояние блока, функциям setBlock() или setBlocks() нужно передать дополнительный аргумент, в данном примере state. Следующий код создает блок шерсти розового цвета:

 

Практическое задание:

  •     Создайте стену из блоков шерсти, причем цвет укажите при помощи случайного числа





Стр.