Бэквудский лес

Метод перемещения по координатам

Описание более простого способа управления перемещениями персонажа

Читать
С ростом размеров уровня все сложнее становится управлять персонажем, если нам приходится описывать каждый его шаг.
Однако, существует функция, которая позволит существенно упросить настройку передвижений. В ней тебе предстоит командовать герою, в каких координатах он должен оказаться.
В общем виде команда выглядит так:

hero.moveXY(X, Y)

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

Раскол

Описание особо сильной атаки

Читать
Помимо обычно атаки твой герой может производить и особо сильную используя метод cleave. Его применение ничем не отличается от обычного attack:

hero.cleave(enemy)

Однако есть небольшая проблема. Будет слишком легко, если использовать cleave постоянно, поэтому после применения способности она начинает перезаряжаться и на некоторое время становится недоступной.

Дальномер

Описание определения расстояния до врага

Читать
Для определения расстояния до врага или объекта ты можешь воспользоваться методом distanceTo().
Он возвращает расстояние в числовом виде, а значит ты сможешь использовать эти значения в условиях. Кроме того, результат может быть записан в переменную:

enemy = "Враг"
distance = hero.distanceTo(enemy)

Условная конструкция ветвления

Описание основных методов работы с условиями.

Условная конструкция if
Во время приключений герой всегда готов встретить врага, однако это не значит, что ему приходится махать мечом даже, когда поблизости никого нет. Так же и во время написания кода нам не всегда нужно, чтобы программа выполнялась целиком.
Для этого предусмотрена специальная конструкция if, которая запускает часть кода только при выполнение определенных условий.
В общем виде использование условий в программе выглядит так:

 
if условие:
	Действие, если условие выполнилось

Если условие не выполнится, то эта часть программы просто будет пропущена.

Конструкция ветвления if-else
Порой в программе возникает ситуация, когда часть кода должны запускаться если условие не выполнилось.
В таком случае, мы должны описать, что происходит при выполнение условия и в обратном случае.
В общем виде такая конструкция будет выглядеть так:

if условие:
	Действие, если условие выполнено
else:
	Действие, если условие не выполнено

Из-за того, что данный метод дает программисту возможность делать в коде “развилки”, такую конструкцию принято называть “структура ветвления”.

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

if условие1:
     Выполнится, если условие1 истинно.
elif условие2:
    Выполнится, если условие1 ложно, а условие2 истинно.
else:
    Выполнится, если условие1  и условие2 ложные.

Используя elif ты можешь добавлять неограниченное число условий в программу. При этом сначала будет проверяться первое условие, если оно оказалось ложным — второе, затем третье и так далее. Если все условия ложны, то программа выполнит код для else.

Условия для поиска врага или фруктов
Во время написания программы мы можем проверять присутствие врагов рядом с героем. Для этого нужно сохранить результат поиска врага в переменную, а затем использовать ее вместо условия. Таким образом, если герой обнаружит врага, условие будет выполнено.
В общем виде программа, которая атакует врага, если он был обнаружен, выглядит так:

 Enemy = hero.findNearestEnemy()
    if Enemy:
        hero.attack(leftEnemy)

С помощью этой же логики мы можем написать программу для обнаружение фруктов на деревьях:

fruit = hero.pluckFruit(tree) 
if fruit:
    hero.eat(fruit)
Условие готовности особой атаки
К сожалению особо сильную атаку cleave не получится использовать все время, так как она имеет время перезарядки. Однако используя новые часы и метод isReady(), ты сможешь проверить готовность способности. Он вернет значение истины, если cleave готова к использованию.
Для того, чтобы способность применялась по готовности, поставь выполнение атаки cleave внутри условия для isReady:

if hero.isReady("cleave"):
    hero.cleave(enemy)
Математические условия. Проверка расстояния до врага.
Помимо методов, которые возвращают значение истина и ложь, в условиях можно использовать и математические знаки сравнения. При этом условие будет считаться истинным если записанное сравнение верно математически.
Например программа, которая заставляет героя атаковать врага, только если он находится на расстояние десяти шагов будет выглядеть так:

    enemy = hero.findNearestEnemy()
    distance = hero.distanceTo(enemy)
    if distance < 10:
hero.attack(enemy)

Для пары чисел A и B ты можешь проверить:

  • Является ли число A большим, чем число B ( if A>B:)
  • Является ли число A меньшим, чем число B ( if A
  • Является ли число A равным числу B ( if A==B:)
  • Является ли число A большим либо равным числу B ( if A>=B:)
  • Является ли число A меньшим либо равным числу B ( if A<=B:)

Функции

Описание основных методов работы с функциями.

Создание и вызов функций
Функции являются важной частью программирования.
Ты использовал функции всё это время, каждый раз при написании такого кода:

hero.attack(enemy)

…ты «вызываешь» функцию с названием attack.
Фактический код, который выполняется при вызове attack, выглядит длинным и сложным. Представь, что тебе пришлось бы писать 25 строк кода всякий раз, когда захотелось бы по размахивать своим мечом!
Это первое преимущество функций: они уменьшают целую кучу строк кода до одной. Это не только избавляет тебя от необходимости печатать один и тот же код много раз, но и делает его проще для понимания. Ведь в нём может быть скрыта действительно сложная логика («Хорошо, я хочу атаковать. Есть ли у меня оружие? Я достаточно близок, чтобы им ударить? Сколько времени на его использование потребуется? Я попал? Какой урон нанес?»), которая сводится к легко воспринимаемой идее: атаковать.
Теперь ты будешь не только вызывать функции, но и будешь создавать собственные.
В определении функции есть две части: название и тело.
Название ты будешь использовать, чтобы вызывать функцию позже, например, attack.
Тело — это код, который будет выполняться при вызове функции.
Для создания функции с название FirstFunction достаточно написать:

def FirstFunction():
	Описание того, что будет происходить при вызове функции

После того как функция создана, она будет выполняться при написание в основной программе всего лишь ее названия и скобок.
Например бесконечный вызов FirstFunction выглядит так:

while True:
	 FirstFunction()
Работа с параметрами и аргументами функций
Для более гибкого использования повторяющихся функций, чаще всего функция требует аргументы, сокращая при этом размер кода.
Аргументы — это то, что размещается между ( и ) при вызове функции.
Параметрами называется аргументы, полученные внутри функции.
Для создания функции с параметром достаточно написать его название в скобках при создание функции. В коде функции ты можешь использовать параметр как обычную переменную, несмотря на то, что ты не знаешь, что в нем находится.
Например создание функции, которая атакует получаемого в параметре врага выглядит так :

def NewAttack(target):
        if(target):
        	hero.attack(target)

В теле основной программы ты можешь вызвать функцию и переедать в нее в качестве аргумента врага, которого нужно атаковать:

enemy = hero.findNearestEnemy()
# Ниже enemy - это аргумент, он передаст данные в target
NewAttack(enemy)

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

def НазваниеФункции(Параметр1, Параметр2, Параметр3):
		Тело функции

Питомец

Описание основных методов обращения с питомцем.

Описание работы системы событий питомца
Ты можешь обращаться к своему питомцу используя pet, так же как обращаешься герою используя hero.
Кроме того, ты можешь обучать своего питомца разным трюкам используя события.
Событие (event) это то, как питомец реагирует на окружающую обстановку. Например ты можешь научиться питомца выполнять определенные команды, когда он слышит голос героя.
Для того, чтобы питомец начал реагировать на событие тебе нужно включить в основном коде его обработчик.
Обработчик событий — это функция, которая проверяет наступление определённого события.
Обработчик событий можно создать, используя функцию .on(). Используй pet.on(«название события», Функция) чтобы вызвать функцию в тот момент, когда событие произойдет.
В общем виде создание обработчика события выглядит так:

def НазваниеФункции(event):
     Тело функции
pet.on("НазваниеСобытия", НазваниеФунции)

Далее мы рассмотрим более конкретные примеры.

Событие ожидание речи
Давай попробуем научить питомца реагировать на речь героя. Для этого нам понадобится событие “hear” и функция, которую будет выполнять питомец.
Событие «hear» происходит, когда питомец что-либо слышит. Если кто-то рядом вызовет метод .say, то событие наступает и вызывается. В этот момент и запускается код внутри функции!
Таким образом программа, которая обучит питомца отвечать “Привет”, на обращение выглядит следующим образом:

def onHear(event):
    pet.say("Привет!")
   
pet.on("hear", onHear)

hero.say("Привет!")
Команда принеси
Твой питомец умеет приносить предметы! Для этого используй метод .fetch(), а в скобках укажи, что нужно принести.
Например:

item = hero.findNearestItem()
if item:
   pet.fetch(item)

Обрати внимание, что твой питомец умеет приносить только определённые предметы, например, зелья.

Событие, запускающееся при старте
Событие «spawn» происходит лишь однажды, в начале уровня, когда ты призываешь своего питомца. Таким образом функция данного события обязательно выполнится при запуске программы, однако это произойдет только один раз.
Например программа, которая обучит твоего питомца здороваться при запуске уровня, будет выглядеть так:

def SayOnStart(event):
    pet.say("Привет!")
   
pet.on("spawn", SayOnStart)

Ты можешь использовать цикл while внутри функции-обработчика события, это позволит повторять код для питомца, даже если событие «spawn» происходит однократно.