Тема:
Арифметика
Литералы объектов
Функции
Булевая логика
Математические операции
Алгоритмы
Цели:
Люди должны выжить.
Совет 1:
Функции могут «возвращать» значение.
На этом уровне , у вас есть функция ‘findStrongerTarget()’ которая находит и указывает (или как говорят программисты «возвращает») местонахождение противника с самым высоким уровнем здоровья.
Когда функция возвращает значение, Вы можете присвоить это значение переменной при вызове функции. Например: ‘archerTarget = findStrongestTarget ()’ (форма может измениться в зависимости от языка, который Вы используете, но идея остается неизменной).
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# Hushbaum попал в засаду огров! # Она занята исцелением своих солдат. Вам следуют отдать им приказ сражаться! # Огры могут вызвать подкрепление, если посчитают, что смогут добраться до Hushbaum'а или ваших лучников. Поэтому держите их в оборонительном кольце! # Солдаты формируют круг и защищаются. def commandSoldier(soldier, soldierIndex, numSoldiers): angle = Math.PI * 2 * soldierIndex / numSoldiers defendPos = {"x": 41, "y": 40} defendPos.x += 10 * Math.cos(angle) defendPos.y += 10 * Math.sin(angle) hero.command(soldier, "defend", defendPos); # Найдите самую крепкую цель (больше всего здоровья) # Эта функция что-то возвращает! Когда Вы вызываете функцию, то получаете от неё какое-то значение. def findStrongestTarget(): mostHealth = 0 bestTarget = None enemies = hero.findEnemies() # Определите, у какого из врагов больше всего уровень здоровья и направьте метод bestTarget на этого врага. for enemie in enemies: if bestTarget: if enemie.health>bestTarget.health: bestTarget=enemie else: bestTarget=enemie # Концентрируйте огонь лучников на одного противника только в том случае, когда нападает большой огр. if bestTarget and bestTarget.health > 15: return bestTarget else: return None # Если у врага, определенного как strongestTarget больше 15 единиц здоровья, атакуйте его. Иначе, атакуйте ближайшего врага. def commandArcher(archer): nearest = archer.findNearestEnemy() if archerTarget: hero.command(archer, "attack", archerTarget) elif nearest: hero.command(archer, "attack", nearest) archerTarget = None while True: # Если враг, определенный как archerTarget мертв или не существует, найдите нового. if not archerTarget or archerTarget.health <= 0: # Установите целью (или "аргументом") функции archerTarget, значение, возвращенное функцией findStrongestTarget(). archerTarget = findStrongestTarget() friends = hero.findFriends() soldiers = hero.findByType("soldier") # Create a variable containing your archers. archers = hero.findByType("archer") for i in range(len(soldiers)): soldier = soldiers[i] commandSoldier(soldier, i, len(soldiers)); # Используйте функцию commandArcher() для управления своими лучниками. for i in range(len(archers)): archer = archers[i] commandArcher(archer) |
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
// Hushbaum попал в засаду огров! // Она занята исцелением своих солдат. Вам следуют отдать им приказ сражаться! // Огры могут вызвать подкрепление, если посчитают, что смогут добраться до Hushbaum'а или ваших лучников. Поэтому держите их в оборонительном кольце! // Солдаты формируют круг и защищаются. hero.commandSoldier = function(soldier, soldierIndex, numSoldiers) { var angle = Math.PI * 2 * soldierIndex / numSoldiers; var defendPos = {x: 41, y: 40}; defendPos.x += 10 * Math.cos(angle); defendPos.y += 10 * Math.sin(angle); hero.command(soldier, "defend", defendPos); }; // Найдите самую крепкую цель (больше всего здоровья) // Эта функция что-то возвращает! Когда Вы вызываете функцию, то получаете от неё какое-то значение. hero.findStrongestTarget = function() { var mostHealth = 0; var bestTarget = null; var enemies = hero.findEnemies(); // Определите, у какого из врагов больше всего уровень здоровья и направьте метод bestTarget на этого врага. for(var i=0; i < enemies.length; i++) { var enemie=enemies[i]; if (bestTarget){ if (enemie.health>bestTarget.health){ bestTarget=enemie; } } else { bestTarget=enemie; } } // Концентрируйте огонь лучников на одного противника только в том случае, когда нападает большой огр. if (bestTarget && bestTarget.health > 15) { return bestTarget; } else { return null; } }; // Если у врага, определенного как strongestTarget больше 15 единиц здоровья, атакуйте его. Иначе, атакуйте ближайшего врага. hero.commandArcher = function(archer) { var nearest = archer.findNearestEnemy(); if(archerTarget) { hero.command(archer, "attack", archerTarget); } else if(nearest) { hero.command(archer, "attack", nearest); } }; var archerTarget = null; while(true) { // Если враг, определенный как archerTarget мертв или не существует, найдите нового. if(!archerTarget || archerTarget.health <= 0) { // Установите целью (или "аргументом") функции archerTarget, значение, возвращенное функцией findStrongestTarget(). archerTarget = hero.findStrongestTarget(); } var friends = hero.findFriends(); var soldiers = hero.findByType("soldier"); // Create a variable containing your archers. var archers = hero.findByType("archer"); for(var i=0; i < soldiers.length; i++) { var soldier = soldiers[i]; hero.commandSoldier(soldier, i, soldiers.length); } // Используйте функцию commandArcher() для управления своими лучниками. for(var i=0; i < archers.length; i++) { var archer = archers[i]; hero.commandArcher(archer); } } |
CoffeScript:
1 |
## |
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
-- Hushbaum попал в засаду огров! -- Она занята исцелением своих солдат. Вам следуют отдать им приказ сражаться! -- Огры могут вызвать подкрепление, если посчитают, что смогут добраться до Hushbaum'а или ваших лучников. Поэтому держите их в оборонительном кольце! -- Солдаты формируют круг и защищаются. function self.commandSoldier(soldier, soldierIndex, numSoldiers) local angle = Math.PI * 2 * soldierIndex / numSoldiers local defendPos = {"x"= 41, "y"= 40} defendPos.x = defendPos.x + 10 * Math.cos(angle) defendPos.y = defendPos.y + 10 * Math.sin(angle) self:command(soldier, "defend", defendPos) end -- Найдите самую крепкую цель (больше всего здоровья) -- Эта функция что-то возвращает! Когда Вы вызываете функцию, то получаете от неё какое-то значение. function self.findStrongestTarget() local mostHealth = 0 local bestTarget = nil local enemies = self:findEnemies() -- Определите, у какого из врагов больше всего уровень здоровья и направьте метод bestTarget на этого врага. for enemieIndex=1, #enemies do if bestTarget then if enemies[enemieIndex].health> bestTarget.health then bestTarget=enemies[enemieIndex] end else bestTarget=enemies[enemieIndex] end end -- Концентрируйте огонь лучников на одного противника только в том случае, когда нападает большой огр. if bestTarget and bestTarget.health > 15 then return bestTarget else return nil end end -- Если у врага, определенного как strongestTarget больше 15 единиц здоровья, атакуйте его. Иначе, атакуйте ближайшего врага. function self.commandArcher(archer) --local nearest = archer:findNearest(archer:findEnemies()) local nearest = archer:findNearestEnemy() if archerTarget then self:command(archer, "attack", archerTarget) elseif nearest then self:command(archer, "attack", nearest) end end local archerTarget = nil local soldiers = self:findByType("soldier") -- Create a variable containing your archers. local archers = self:findByType("archer") loop -- Если враг, определенный как archerTarget мертв или не существует, найдите нового. if not archerTarget then archerTarget = self.findStrongestTarget() end if archerTarget then if archerTarget.health <= 0 then -- Установите целью (или "аргументом") функции archerTarget, значение, возвращенное функцией findStrongestTarget(). archerTarget = self.findStrongestTarget() end end for i, soldier in pairs(soldiers) do self.commandSoldier(soldier, i, #soldiers) end -- Используйте функцию commandArcher() для управления своими лучниками. for archerIndex=1, #archers do self.commandArcher(archers[archerIndex]) end end |
Приведенный выше код бесспорно правильный, но как ни странно не дает возможности победить — солдаты гибнут даже при фокусе огня лучников. Поэтому после долгих «страданий» родилось что-то подобное:
// Солдаты формируют круг и защищаются.
function commandSoldier(soldier, soldierIndex, numSoldiers) {
var angle = Math.PI * 2 * soldierIndex / numSoldiers;
var defendPos = {x: 41, y: 40};
defendPos.x += 10 * Math.cos(angle);
defendPos.y += 10 * Math.sin(angle);
hero.command(soldier, «defend», defendPos);
}
// Найди самого сильного врага (с наибольшим здоровьем)
// Эта функция что-то возвращает! Когда ты её вызываешь, то получаешь назад некоторое значение.
function findStrongestTarget() {
var ogres = hero.findByType(«OGRE»);
// Определи, у кого из врагов наибольший уровень здоровья, и присвой это значение переменной
bestTarget
.for (i = 0; i < ogres.length; i++){
var ogre = ogres[i];
if (ogre && ogre == "OGRE" ) {
var bestTarget = ogre;
return bestTarget;
} else {
return null;
}
}
}
// Если у врага
strongestTarget
больше 15 единиц здоровья, атакуй его. Иначе атакуй ближайшего врага.function commandArcher(archer) {
var nearest = archer.findNearestEnemy();
if(archerTarget) {
hero.command(archer, "attack", archerTarget);
} else if(nearest) {
hero.command(archer, "attack", nearest);
}
}
var archerTarget = null;
while(true) {
// Если враг
archerTarget
повержен или не существует, найди нового.if(!archerTarget || archerTarget.health <= 0) {
// Установи в переменную
archerTarget
результат, который возвращает функцияfindStrongestTarget()
archerTarget = findStrongestTarget();
}
var friends = hero.findFriends();
var soldiers = hero.findByType("soldier");
// Создай переменную, указывающую на твоих лучников.
for(var i=0; i < soldiers.length; i++) {
var soldier = soldiers[i];
if (soldier.health < 50) {
hero.command(soldier, 'move', {x:40, y:40});
}
else {
commandSoldier(soldier, i, soldiers.length);
}
}
// используй функцию
commandArcher()
для управления своими лучникамиvar archers = hero.findByType("archer");
for(var i = 0; i < archers.length; i++) {
var archer = archers[i];
commandArcher(archer);
}
}