Тема:
Переменные
Строки
Циклы
Массивы
Циклы «for»
Функции
Цели:
Собери не менее 125 золота.
Продержись 30 секунд.
Бонус: Продержись 60 секунд.
Бонус: Собери 350 золота.
Руководство:
Заметки:
Функции являются важной частью программирования.
Вы постоянно используете функции, вы пишете код на подобии hero.attack(target), так вы вызываете функцию, с именем attack.
Весь код, который используется при выполнении атаки большой и сложный. Представьте себе, что для того что бы использовать свой меч, в коде вашей программы вам пришлось бы написать 25 строк кода!
Это первое преимущество функций — после описания они уменьшают количества кода до одной строки.
Функции не только избавят вас от необходимости повторно вводить один и тот же код снова и снова. Но так же позволяют делать ваш код более понятным, потому что они убирают сложные логические вопросы («И так я хочу атаковать. У меня есть оружие? Нахожусь ли я на достаточно близкой дистанции, с условием моего оружия, что бы я мог атаковать? Сколько времени потребуется для атаки моим оружием? Я попал? Какой урон я причинил?»), И делает код более понятным: атакую.
Теперь вы будете не только вызывать функции, вы будете делать свои собственные функции!
Определение функции состоит из двух частей: имя и тело функции.
Имя функции, будет использоваться для вызова функции в дальнейшем, так же как у функция attak.
Тело функции — это код который будет выполнятся, когда функция вызывается.
Так же иногда имеются аргументы (как target в attack(target)), но мы изучем их в следующих уровнях.
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# Этом уровень покажет, как определять собственные функции. # Код внутри функции не выполняется сразу. Он сохраняется для последующего использования # Эта функция заставляет вашего героя поднять ближайшую монету. def pickUpNearestCoin(): items = hero.findItems() coin = hero.findNearest(items) maxcost = coin.value/hero.distanceTo(coin) maxcoin = coin for coin in items: cost = coin.value/hero.distanceTo(coin) if cost > maxcost: maxcoin = coin maxcost = cost hero.move(maxcoin.pos) #nearestCoin = hero.findNearest(items) #if nearestCoin: #hero.move(nearestCoin.pos) # С помощью этой функции ваш герой призывает солдата. def summonSoldier(): # Размести здесь код, призывающий солдата, если у тебя достаточно золота. if hero.gold>=20: hero.summon("soldier") # Эта функция приказывает вашим солдатам атаковать ближайшего врага. def commandSoldiers(): for soldier in hero.findFriends(): enemy = soldier.findNearestEnemy() if enemy: hero.command(soldier, "attack", enemy) else: hero.command(soldier, "move", hero.pos) while True: # В своем цикле ты можешь "вызывать" функции, определенные выше. # Эта строка вызывает выполнение кода внутри функции "pickUpNearestCoin" . pickUpNearestCoin() # Вызови summonSoldier здесь. summonSoldier() # Вызови commandSoldiers здесь. commandSoldiers() |
JavaScript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
// Этом уровень покажет, как определять собственные функции. // Код внутри функции не выполняется сразу. Он сохраняется для последующего использования // Эта функция заставляет вашего героя поднять ближайшую монету. hero.pickUpNearestCoin = function() { var items = hero.findItems(); var nearestCoin = hero.findNearest(items); if(nearestCoin) { hero.move(nearestCoin.pos); } }; // С помощью этой функции ваш герой призывает солдата. hero.summonSoldier = function() { // Размести здесь код, призывающий солдата, если у тебя достаточно золота. if (hero.gold>=20){ hero.summon("soldier"); } }; // Эта функция приказывает вашим солдатам атаковать ближайшего врага. hero.commandSoldiers = function() { var friends = hero.findFriends(); for(var i=0; i < friends.length; i++) { var enemy = friends[i].findNearestEnemy(); if(enemy) { hero.command(friends[i],"attack", enemy); } } }; while(true) { // В своем цикле ты можешь "вызывать" функции, определенные выше. // Эта строка вызывает выполнение кода внутри функции "pickUpNearestCoin" . hero.pickUpNearestCoin(); // Вызови summonSoldier здесь. hero.summonSoldier(); // Вызови commandSoldiers здесь. hero.commandSoldiers(); } |
CoffeScript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# Этом уровень покажет, как определять собственные функции. # Код внутри функции не выполняется сразу. Он сохраняется для последующего использования # Эта функция заставляет вашего героя поднять ближайшую монету. @pickUpNearestCoin = -> items = @findItems() nearestCoin = @findNearest(items) if nearestCoin @move(nearestCoin.pos) # С помощью этой функции ваш герой призывает солдата. @summonSoldier = -> # Размести здесь код, призывающий солдата, если у тебя достаточно золота. if @gold>=20 @summon "soldier" #@say("I need some help.") # Эта функция приказывает вашим солдатам атаковать ближайшего врага. @commandSoldiers = -> for soldier in @findFriends() enemy = soldier.findNearestEnemy() if enemy @command(soldier, "attack", enemy) loop # В своем цикле ты можешь "вызывать" функции, определенные выше. # Эта строка вызывает выполнение кода внутри функции "pickUpNearestCoin" . @pickUpNearestCoin() # Вызови summonSoldier здесь. @summonSoldier() # Вызови commandSoldiers здесь. @commandSoldiers() |
Clojure:
1 |
;; |
LUA:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
-- Этом уровень покажет, как определять собственные функции. -- Код внутри функции не выполняется сразу. Он сохраняется для последующего использования -- Эта функция заставляет вашего героя поднять ближайшую монету. function self.pickUpNearestCoin() local items = self:findItems() local nearestCoin = self:findNearest(items) if nearestCoin then self:move(nearestCoin.pos) end end -- С помощью этой функции ваш герой призывает солдата. function self.summonSoldier() -- Размести здесь код, призывающий солдата, если у тебя достаточно золота. if hero.gold>=20 then hero:summon("soldier") end end -- Эта функция приказывает вашим солдатам атаковать ближайшего врага. function self.commandSoldiers() local friends = self:findFriends() for i=1, #friends do local soldier = friends[i] local enemy = soldier:findNearestEnemy() if enemy then self:command(soldier, "attack", enemy) end end end loop -- В своем цикле ты можешь "вызывать" функции, определенные выше. -- Эта строка вызывает выполнение кода внутри функции "pickUpNearestCoin" . self:pickUpNearestCoin() -- Вызови summonSoldier здесь. self:summonSoldier() -- Вызови commandSoldiers здесь. self:commandSoldiers() end |
Комментарии: