Тема:
Аргументы
Базовый синтаксис
Функции
Условные операторы
Переменные
Циклы «while»
Цели:
Останови всех огров.
Спаси всех крестьян.
Руководство:
Совет 1:
Патрулирование деревни может быть скучным и повторяющимся.
Использование функций упрощает эту задачу. Ты можешь превратить множество строк кода всего лишь в одну!
1 2 3 4 5 6 7 8 |
# Определим функцию def findAndAttackEnemy(): enemy = hero.findNearest(hero.findEnemies()) if enemy: hero.attack(enemy) # Теперь всего одной строки будет достаточно findAndAttackEnemy() |
JavaScript:
1 2 3 4 5 6 7 8 9 10 |
// Определим функцию hero.findAndAttackEnemy = function() { var enemy = hero.findNearestEnemy(); if (enemy) { hero.attack(enemy); } }; // Теперь всего одной строки будет достаточно hero.findAndAttackEnemy(); |
CoffeScript:
1 2 3 4 5 6 7 |
@findAndAttackEnemy = -> enemy = @findNearestEnemy() if enemy @attack(enemy) # Теперь всего одной строки будет достаточно @findAndAttackEnemy() |
Clojure:
1 |
LUA:
1 2 3 4 5 6 7 8 9 |
local function findAndAttackEnemy() local enemy = hero:findNearestEnemy() if enemy then hero:attack(enemy) end end -- Теперь всего одной строки будет достаточно findAndAttackEnemy() |
Совет 2:
Функции являются важной частью программирования.
Ты использовал функции всё это время, каждый раз при написании такого кода:
1 |
hero.attack(enemy) |
JavaScript:
1 |
hero.attack(enemy); |
CoffeScript:
1 |
@attack(enemy) |
Clojure:
1 |
(.attack this enemy) |
LUA:
1 |
self:attack(enemy) |
…ты «вызываешь» функцию с названием attack.
Фактический код, который выполняется при вызове attack, выглядит длинным и сложным. Представь, что тебе пришлось бы писать 25 строк кода всякий раз, когда захотелось бы по размахивать своим мечем!
Это первое преимущество функций: они уменьшают целую кучу строк кода до одной.
Это не только избавляет тебя от необходимости печатать один и тот же код много раз, но и делает его проще для понимания. Ведь в нём может быть скрыта действительно сложная логика («Хорошо, я хочу атаковать. Есть ли у меня оружие? Я достаточно близок, чтобы им ударить? Сколько времени на его использование потребуется? Я попал? Какой урон нанёс?»), которая сводится к легко воспринимаемой идее: атаковать.
Теперь ты будешь не только вызывать функции, но и будешь определять собственные функции!
В определении функции есть две части: название и тело.
Название ты будешь использовать, чтобы вызывать функцию позже, например, attack.
Тело — это код, который будет выполняться при вызове функции.
Иногда встречаются аргументы (например врага в attack(enemy)), но их мы рассмотрим в будущих уровнях.
Деревенский бродяга, прохождение:
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Это определяет функцию с именем `findAndAttackEnemy` def findAndAttackEnemy(): enemy = hero.findNearestEnemy() if enemy: hero.attack(enemy) # Этот код не является частью функции. while True: # Теперь ты можешь патрулировать деревню, используя `findAndAttackEnemy` hero.moveXY(35, 34) findAndAttackEnemy() # Теперь иди к правому входу. hero.moveXY(60, 31) # Используй `findAndAttackEnemy` findAndAttackEnemy() |
JavaScript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// Это определяет функцию с именем `findAndAttackEnemy` function findAndAttackEnemy() { var enemy = hero.findNearestEnemy(); if (enemy) { hero.attack(enemy); } } // Этот код не является частью функции. while(true) { // Теперь ты можешь патрулировать деревню, используя `findAndAttackEnemy` hero.moveXY(35, 34); findAndAttackEnemy(); // Теперь иди к правому входу. hero.moveXY(60, 31); // Используй `findAndAttackEnemy` findAndAttackEnemy(); } |
CoffeScript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Это определяет функцию с именем `findAndAttackEnemy` @findAndAttackEnemy = -> enemy = @findNearestEnemy() if enemy @attack(enemy) # Этот код не является частью функции. while true # Теперь ты можешь патрулировать деревню, используя `findAndAttackEnemy` @moveXY(35, 34) @findAndAttackEnemy() # Теперь иди к правому входу. @moveXY(60, 31) # Используй `findAndAttackEnemy` @findAndAttackEnemy() |
Clojure:
1 |
LUA:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
-- Это определяет функцию с именем `findAndAttackEnemy` local function findAndAttackEnemy() local enemy = hero:findNearestEnemy() if enemy then hero:attack(enemy) end end -- Этот код не является частью функции. while true do -- Теперь ты можешь патрулировать деревню, используя `findAndAttackEnemy` hero:moveXY(35, 34) findAndAttackEnemy() -- Теперь иди к правому входу. hero:moveXY(60, 31) -- Используй `findAndAttackEnemy` findAndAttackEnemy() end |
Комментарии: