Главная страница

1 урок Введение и подготовка


Скачать 2.7 Mb.
Название1 урок Введение и подготовка
Дата24.01.2023
Размер2.7 Mb.
Формат файлаdocx
Имя файлаKonspekt_Python (2).docx
ТипУрок
#903253
страница5 из 7
1   2   3   4   5   6   7

7 урок: Постройка 3 D фигур, простейших и сложных.


Воспользуемся сценарием с прошлого урока, там мы при помощи функции setblocks выделяли область по начальным и конечным коориднатам и заполняли блоком, в данном случае TNT.

from mcpi.minecraft import Minecraft 

import time import mcpi.block as block

mc = Minecraft.create()

pos = mc.player.getTilePos()

mc.draw.setBlocks(pos.x, pos.y, pos.z+5,pos.x+5,pos.y + 20, pos.z+10, block.TNT.id)

mcdraw.drawSphere(pos.x+20,pos.y,pos.z,15,block.TNT.id)

Внутри сфера не пустая, правильнее полученную фигуру назвать шаром. Давайте напишем функцию, в которой используем вместо блока TNT, блок воздуха – Air. Встанем на твердую землю и посмотрим, что произойдет.

mcdraw.drawSphere(pos.x+20,pos.y,pos.z,15,block.AIR.id)

У нас получилась яма.

Давайте приступим к созданию более сложных 3d объектов и начнем с многоугольников.

Итак, что такое многоугольник? Это плоская фигура образованная несколькими соединенными отрезками, многоугольники могут иметь от 3 до бесконечности сторон. Точки, которые соединяют эти стороны- вершины, в 3 мерном же пространстве с помощью объединения нескольких многоугольников мы можем создать различные фигуры.





Например, пирамида, у которой каждая её грань является треугольником.

Давайте попробуем построить пирамиду в minecraft. Продолжая использовать нашу minecraftstuff. Для построения пирамиды, воспользуемся drawFace. Но в нашем случае функция принимает все координаты каждой вершины и координаты должны быть записаны в виде векторов.

Дело в том, что в программировании некоторые функции могут принимать на вход только определенный тип данных, в нашем случае – вектор. Вектор – переменная, у которой записаны координаты одного блока по всем 3 координатам. Мы уже работали с вектором в строчке pos = mc.player.gettilepos. Pos в нашем случае это вектор.


8 урок: Конструкция else, elif.


А теперь рассмотрим более сложную конструкцию, которая запускает выполнение другого фрагмента кода, если условие возвращает False.

Называется эта конструкция else. Конструкция else работает совместно с if.

Сначала вы пишете if, запускающую фрагмент кода, если условие возвращает True, а затем добавляете else, чтобы программа могла выполнить другой фрагмент кода в случае, если условие вернет False. Компьютер понимает это так: «Если условие выполняется, нужно сделать одно, а если нет — другое». Следующий код выведет "А-а-а! Зомби!", если в комнате больше 20 зомби (программа запросит их количество, сохранив его в переменной zombies); в противном случае она напечатает: "Эй, зомби, а вы неплохие ребята". 

Zombies = int(input(“Введите количество зомби:”))

If zombies > 20:

Print (“A-a-a! Зомби!”)

else:

print(“Эй, зомби, а вы неплохие ребята.”)

Так же как и в конструкции if, для обозначения тела else используются двоеточие и отступы. Однако else не может быть самостоятельной командой — эта конструкция всегда должна следовать после if.

 Кроме того, у else нет собственного условия — тело else выполняется, если условие, указанное в if (в данном случае zombies > 20), не возвращает True. 

А что будет, если добавить в код конструкцию else без if? Пусть программа состоит лишь из следующих двух строк: else: print("Ничего не происходит.") Увы, в таком случае Python не поймет, чего вы хотите, и выведет сообщение об ошибке.

Благодаря команде mc.setting("world_immutable", True) не дает блокам разрушаться, а миру Minecraft — меняться. Он защищает ваши потрясающие постройки от вандалов и случайностей: пожаров, текущей лавы и т. д. Однако, несмотря на очевидные преимущества, пользоваться такой программой довольно неудобно. Чтобы отключить защиту, нужно написать еще один код! Совместив конструкции if и else с запросом ввода с клавиатуры, можно создать программу, которая будет спрашивать, хотите ли вы сделать блоки неизменяемыми, и в зависимости от ответа присваивать опции "world_immutable" значение True либо False.

Программа должна задавать пользователю вопрос, хочет  ли он сделать блоки неизменяемыми: 

“ВЫ хотите защитить блоки от разрушений? Да/Нет”

 Поместите эту строку в качестве аргумента в функцию input(), а  значение, которое функция вернет, сохраните в  переменной answer.

Программа должна проверить, находится  ли в  переменной answer значение "Д" (оно будет соответствовать ответу «да»). И, если это так, выполнит следующие команды: 

mc.setting(“World_immutable”, True)

mc.postToChat(“Защита от разрушений включена”)
Введите этот код, поместив его в тело конструкции if, чтобы он выполнялся, только если значение answer равно "Д". Не забывайте про отступы! 3. Если пользователь введет не "Д", а что-либо другое, программа должна выполнить другие команды: 

mc.setting(“World_immutable”, False)

mc.postToChat(“Защита от разрушений выключена”)
Введите этот фрагмент кода в тело конструкции else, соблюдая отступы. Сохраните программу и запустите ее. В ответ на запрос, хотите ли вы сделать блоки неизменяемыми, введите "Д" либо "Н" и нажмите ENTER. Проверьте, что получилось: если вы ввели "Д", блоки должны стать неизменяемыми; в обратном случае они будут разрушаться, как обычно. 

На рисунке показано, как выглядит запрос в окне консоли и сообщение в чате. Обратите внимание — вы можете ввести как "Н", так и любую чепуху, например "банан", а результат будет одинаковым. Как думаете, почему так происходит?
Ø При помощи логических операций можно сделать программу более дружелюбной. Например, научить ее понимать ответ пользователя, если вместо ответа «Д» он наберет слово «Да», строчными или прописными буквами, или если буква «д» будет строчной. Попробуйте сделать это сами!
Конструкция elif

С помощью конструкций if и else вы можете запускать один фрагмент кода, если условие возвращает True, и другой, если False. Но что делать, когда необходимо запустить более двух фрагментов кода? Для этого подойдет конструкция elif. Сначала введите if, затем — elif и в самом конце — else. Используя эти конструкции, вы как бы говорите программе:
«Если условие возвращает True, нужно запустить первый фрагмент кода. Если второе условие возвращает True — второй фрагмент кода. И, наконец, если ни одно из условий не выполняется, нужно запустить третий фрагмент кода». Elif (сокр. от else if) — иначе если. Давайте посмотрим, как это работает. Представьте, что вы выбираете в магазине мороженое. Вы можете рассуждать так: «Если шоколадное мороженое еще осталось, возьму его.
А если его нет, но есть клубничное, возьму клубничное. А если нет ни его, ни шоколадного, выберу ванильное».
В коде это решение можно записать так:

hasChocolate = False

hasStrawberry = True

if hasChocolate:

print(“Ура! Беру шоколадное.”)

elif hasStrawBerry

print(“Выбираю второй вариант - клуююничное.”)

else:

print(“Ладно, ванильное тоже вкусно.”)

В первых двух строках задаются начальные условия. Допустим, сегодня в магазине нет шоколадного мороженого, зато есть клубничное. Соответственно, мы присваиваем переменной hasChocolate значение False, а переменной hasStrawberry значение True. Далее мы передаем значение переменной hasChocolate в конструкцию if, и, если оно равно True, программа выведет: "Ура! Беру шоколадное". Однако в нашем случае это сообщение не будет напечатано, ведь в hasChocolate находится значение False. Вместо этого программа перейдет к конструкции elif и проверит, равняется ли True значение переменной hasStrawberry. Так оно и есть, поэтому программа запустит код тела elif и выведет на экран: "Выбираю второй вариант — клубничное". Как видите, тело конструкции elif состоит из команды, которая запускается лишь в том случае, если условие if возвращает False, а условие elif — True. И наконец, стоящая после elif конструкция else сработает только тогда, когда и условие if, и условие elif вернут False. В нашем примере код тела else запустился бы и вывел на экран "Ладно, ванильное тоже вкусное", будь и в переменных hasChocolate и hasStrawberry значение False.
Телепортация в нужное место
Если очередность конструкций if и elif нарушена, код, который должен сработать, выполняться не будет. Вместо этого запустится код, который выполняться не должен. Из-за этого в программе могут возникать странные ошибки. Чтобы исправить код, вам придется заменить очередность проверок на верную. Давайте попробуем это сделать. Код представленный ниже работает неправильно. Он должен телепортировать игрока в различные точки мира Minecraft в зависимости от количества очков (points), которое введет пользователь. В строках, отвечающих за выбор места для телепортации в зависимости от количества очков, ошибки нет. Однако, судя по всему, очередность конструкций if и elif нарушена. Чем больше у игрока очков, тем лучше место, в которое он отправится. Посмотрите на следующий код — координаты для телепортации являются аргументами функции setPos().
from mcpi.minecraft import Minecraft

mc = Minecraft.create ()

points = int (input ("Введите количество очков: "))

if points > 2: mc.player.setPos (112, 10, 112)

elif points <= 2: mc.player. setPos (0, 12, 20)

elif points > 4: mc.player.setPos (60, 20, 32)

elif points > 6:

mc.player.setPos (32,18, -38)

В коде отдельно проверяется, больше ли количество очков, чем 2, 4, 6, а также меньше ли оно 2.
Введите код представленный выше и измените его так, чтобы все точки телепортации стали доступны. Протестируйте программу, вводя разное количество очков, — убедитесь, что конструкция if и каждая из конструкций elif могут запуститься. На рис. 6.4 показан результат работы неправильного кода.

Создайте программу, которая позволит указать место телепортации в виде строки — например, "замок". Для выбора места телепортации для каждого из вариантов используйте конструкции if и elif.

Лучшие дома в мире Minecraft обустроены с большим вниманием к деталям. Многие пользователи, заботясь об уюте, делают в доме деревянный пол, очаг, украшают стены картинами. Вы же превзойдете их всех, создав работающий душ. Для этого вам понадобятся проверки диапазонов и логические операции. Вы создадите душевую кабину, в которой будет включаться вода, когда внутри окажется игрок. Иными словами, если игрок находится в заданном диапазоне координат, кабина заполнится водяными блоками. Основа кода показана в ниже. Ваша задача — его дописать.
from mcpi.minecraft import Minecraft

mc = Minecraft.create ()

shwrX=

shwrY=

shwrZ=
swidth = 5

height = 5

length = 5
pos = mc.player.getTilePos ()

x = pos.x

y = pos.y

z = pos.z
if shwrx <= x < shwrx + width and

mc. setBlocks (shwrX, shwrY + height, shwrz,

shwrx + width, shwrY + height, shwrZ + length, 8)

else:

mc.setBlocks (shwrX, shwry + height, shwrz,

shwrx + width, shwry + height, shwrz + length, 0)
Первым делом присвойте значения переменным shwrX, shwrY и shwrZ — они должны соответствовать координатам вашей душевой кабины. Затем укажите размеры кабины, добавив значения переменных width, height и length , — присвоим им значение 5, однако вы можете выбрать любые размеры на свой вкус.
Допишите условие if. В нем необходимо проверить, действительно ли переменные y и z находятся в пределах душевой кабины. Чтобы вам было проще, я уже добавил проверку координаты x (shwrX < x < shwrX + width). Выражения для y и z будут аналогичными. Подсказка: эти три проверки нужно объединить с помощью операции and. Функция setBlocks() нужна для включения и выключения душа. При включенном душе она будет заполнять кабину блоками «текущая вода» (идентификатор 8), а при выключенном — блоками «воздух» (идентификатор 0). Вызовы функции setBlocks() внутри конструкций if и else разбиты на две строки. Для длинного списка аргументов допускается такая запись.
Если вы запустите программу, когда игрок будет находиться в душевой кабине, она создаст вокруг него водяные блоки. Вода будет течь до тех пор, пока герой не выйдет из душа, а вы не запустите программу снова.
Добавьте в программу лимит времени, после которого вода должна отключаться автоматически.

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

1   2   3   4   5   6   7


написать администратору сайта