第16關:潛伏
// 用findEnemies把敵人存在數組enemies中 // 只攻擊薩滿巫師,不要攻擊氂牛! var enemies = hero.findEnemies(); var enemyIndex = 0; // 把這段代碼用一個while loop 功能循環遍歷所有的敵人 // 當 enemyIndex 小於 enemies 的長度時: while (enemyIndex < enemies.length) { var enemy = enemies[enemyIndex]; if (enemy.type == 'shaman') { while (enemy.health > 0) { hero.attack(enemy); } } // 記得增加enemyIndex enemyIndex += 1; }
第17關:優待
// 首先,在所有的敵人中循環... var enemies = hero.findEnemies(); var enemyIndex = 0; // ...但是僅攻擊"thrower"類型的敵人。 while (enemyIndex < enemies.length) { var enemy = enemies[enemyIndex]; if (enemy && enemy.type === "thrower") { hero.attack(enemy); } enemyIndex += 1; } // 然后再到所有的敵人中循環... enemies = hero.findEnemies(); enemyIndex = 0; // ...干掉仍然活着的每個 while (enemyIndex < enemies.length) { var enemy = enemies[enemyIndex]; if (enemy) { hero.attack(enemy); } enemyIndex += 1; }
第18關:Sarven牧羊人
// 使用 while 循環來對付食人魔。 while (true) { var enemies = hero.findEnemies(); var enemyIndex = 0; // 將攻擊邏輯放到 while 循環里來攻擊所有的敵人。 // 查找數組的長度: enemies.length while (enemyIndex < enemies.length) { var enemy = enemies[enemyIndex]; // "!=" 意思是 "不等於" if (enemy.type != "sand-yak") { // 當敵人的健康值大於0,攻擊它! while (enemy.health > 0) { hero.attack(enemy); } } enemyIndex += 1; // 攻擊完敵人后,回到中間位置 hero.moveXY(40, 32); } }
第19關:撿閃亮東西的人
// 很快的獲取最多的金幣 while (true) { var coins = hero.findItems(); var coinIndex = 0; // 把這個封裝進循環里枚舉所有的硬幣 while (coinIndex < coins.length) { var coin = coins[coinIndex]; // 金幣價值3點。 if (coin.value == 3) { // 只撿金幣。 hero.moveXY(coin.pos.x, coin.pos.y); } coinIndex += 1; } }
第20關:掠奪者
// 打幾下泡泡人撿走掉出的幣 while (true) { var coin = hero.findNearestItem(); // 當存在金幣時: while (coin) { // 移動到金幣處。 hero.moveXY(coin.pos.x, coin.pos.y); // ‘coin’應該是最近的那枚 撿到手以后要另找一枚最近的 var coin = hero.findNearest(hero.findItems()); } var enemy = hero.findNearestEnemy(); if (enemy) { // 如果敵人還會動 if (enemy) { while (enemy.health > 0) { // 就打它 hero.attack(enemy); } } } }
第21關:沙蛇
// 這片區域布滿了火焰陷阱。幸好我們之前派出了偵察員,他沿路在地上留下了硬幣作為暗號,我們只需要順着最近的硬幣走就能躲過這些陷阱。 // 沙漠峽谷似乎會干擾你使用眼鏡的findNearest技能! // 你需要自己找到離你最近的硬幣。 while (true) { var coins = hero.findItems(); var coinIndex = 0; var nearest = null; var nearestDistance = 9999; // 搜索所有的硬幣,找到離你最近的那一顆。 while (coinIndex < coins.length) { var coin = coins[coinIndex]; coinIndex++; var distance = hero.distanceTo(coin); // 如果硬幣與你的距離小於“最近距離(nearestDistance)” if (distance < nearestDistance) { // 設置該硬幣為離你最近的硬幣 nearest = coin; // 設置該距離為“最近距離(nearestDistance)” nearestDistance = distance; } // 如果找到離你最近的硬幣,移動英雄到硬幣的位置。你需要使用moveXY,不需要你抄近路,也不會踩到陷阱。 }if (nearest) { hero.moveXY(nearest.pos.x, nearest.pos.y); } }
第22關:奇數沙塵暴
// 這個數組包含朋友和食人魔。 // 偶數元素是食人魔,奇數元素是朋友。 var everybody = ['Yetu', 'Tabitha', 'Rasha', 'Max', 'Yazul', 'Todd']; var enemyIndex = 0; while (enemyIndex < everybody.length) { // 使用[ ] 符號訪問數組中食人魔名字,放到變量里 var enemy = everybody[enemyIndex]; // 攻擊食人魔,使用存有名字的變量 hero.attack(enemy); // 每次遞增2,來跳過朋友。 enemyIndex += 2; } // 在擊敗食人魔之后,向綠洲移動。 hero.moveXY(36, 53);
第23關:瘋狂的Maxer
// 優先殺掉最遠的敵人。 while(true) { var farthest = null; var maxDistance = 0; var enemyIndex = 0; var enemies = hero.findEnemies(); // 查看全部敵人,找出最遠的那個。 while (enemyIndex < enemies.length) { var target = enemies[enemyIndex]; enemyIndex += 1; // 是不是存在遠得看不到的敵人? var distance = hero.distanceTo(target); if (distance > maxDistance) { maxDistance = distance; farthest = target; } } if (farthest) { // 干掉最遠的敵人! // 如果敵人血量大於0就保持攻擊。 while (farthest.health > 0){ hero.attack(farthest);} } }
第24關:脆弱的士氣
// 你只有一個弓箭手,要發揮他的作用 // 這將返回一個最多生命值的敵人 function findStrongestEnemy(enemies) { var strongest = null; var strongestHealth = 0; var enemyIndex = 0; // 當 enemyIndex 少於enemies數組的長度 while (enemyIndex < enemies.length) { // 將enemy變量設置為enemies[enemyIndex] var enemy = enemies[enemyIndex]; // 如果 enemy.health 大於 strongestHealth if (enemy.health > strongestHealth) { // 將enemy賦值給strongest // 將enemy.health賦值為strongestHealth strongest = enemy; strongestHealth = enemy.health; } // 讓 enemyIndex 遞增 enemyIndex += 1; } return strongest; } var enemies = hero.findEnemies(); var leader = findStrongestEnemy(enemies); if (leader) { hero.say(leader); }
第25關:瘋狂Maxer反擊
// 小一點的食人魔會造成更多的傷害! // 優先攻擊血少的敵人 while (true) { var weakest = null; var leastHealth = 99999; var enemyIndex = 0; var enemies = hero.findEnemies(); // 循環檢查所有敵人。 while (enemyIndex < enemies.length) { var enemy = enemies[enemyIndex]; // 如果當前對象的血量更少 if (enemy.health < leastHealth) { // 標為最弱的,更新 leastHealth 變量 weakest = enemy; leastHealth = enemy.health; } // 別忘了給enemyIndex 加一 enemyIndex += 1; } if (weakest) { // 攻擊最弱的食人魔。 hero.attack(weakest); } }
第26關:許願井
// 你需要104的硬幣,不多也不少。 var less = "Nimis"; var more = "Non satis"; var requiredGold = 104; // 此函數計算所有的硬幣值的總和。 function sumCoinValues(coins) { var coinIndex = 0; var totalValue = 0; // 遍歷所有的硬幣。 while (coinIndex < coins.length) { totalValue += coins[coinIndex].value; coinIndex++; } return totalValue; } function collectAllCoins() { var item = hero.findNearest(hero.findItems()); while (item) { hero.moveXY(item.pos.x, item.pos.y); item = hero.findNearest(hero.findItems()); } } while (true) { var items = hero.findItems(); // 獲得硬幣的總值 var goldAmount = sumCoinValues(items); // 如果有硬幣,那么硬幣數目 (goldAmount) 不會是零 if (goldAmount !== 0) { // 如果goldAmount 小於requiredGold。 if (goldAmount < requiredGold) { // 那就說“Non satis” hero.say(more); } // 如果goldAmount 大於requiredGold。 if (goldAmount > requiredGold) { // 那么說出“Nimis”。 hero.say(less); } // 如果 “goldAmount” 等於 “requiredGold” if (goldAmount == requiredGold) { // 如果有剛好 104 硬幣,就全部收集。 collectAllCoins(); } } }
第27關:峭壁追逐
// 抓住 Pender Spellbane 去了解她的秘密。 while (true) { // Pender是這里唯一的朋友,所以她總是在最近的位置。 var pender = hero.findNearest(hero.findFriends()); if (pender) { // moveXY()將移動到 Pender 在的位置, // 但是她會向遠離你的位置移動。 //hero.moveXY(pender.pos.x, pender.pos.y); // move()只一次移動一步。 // 所以你可以用它來追蹤你的目標。 hero.move(pender.pos); } }
第28關:激流回旋
// 使用對象枚舉來走安全的路,並收集寶石。 // 在本關你不能夠使用 moveXY()方法!使用 move()來移動 var gems = hero.findItems(); while (hero.pos.x < 20) { // move()移動物體通過 x 和 y 的屬性,不僅僅是數字。 hero.move({ 'x': 20, 'y': 35 }); } while (hero.pos.x < 25) { // 一個寶石的位置是一個對象,有 x 和 y 屬性。 var gem0 = gems[0]; hero.move(gem0.pos); } // 當你的 x 小於30的時候, // 使用物體移動到30,35位置 while (hero.pos.x < 30) { hero.move({ 'x': 30, 'y': 35 }); } // 當你的 x 小於35的時候 // 移動到寶石[1]的位置 while (hero.pos.x < 35) { var gem1 = gems[1]; hero.move(gem1.pos); } // 拿到最后一對寶石! while (hero.pos.x < 40) { hero.move({ 'x': 40, 'y': 35 }); } while (hero.pos.x < 45) { var gem2 = gems[2]; hero.move(gem2.pos); } while (hero.pos.x < 50) { hero.move({ 'x': 50, 'y': 35 }); } while (hero.pos.x < 55) { var gem3 = gems[3]; hero.move(gem3.pos); }
第29關:食人魔山谷挖寶
// 一大群食人魔到來之前,你只有20秒時間! // 盡可能多撿金子,然后撤退到你的基地,築好圍欄! while (hero.time < 20) { // 收集金幣 var coin = hero.findNearest(hero.findItems()); hero.move(coin.pos); // hero.say("我應該撿起硬幣"); } while (hero.pos.x > 16) { // 撤退到圍欄后面 hero.move({ "x": 15, "y": 38 }); // hero.say("我應該撤退"); } // 建立圍欄,擋住食人魔。 hero.buildXY("fence", 20, 37);
第30關:安息之雲指揮官
// 召喚一些士兵,然后引導他們去你的基地。 // 每個士兵消耗20金幣。 while (hero.gold > hero.costOf("soldier")) { hero.summon("soldier"); } var soldiers = hero.findFriends(); var soldierIndex = 0; // 添加一個while 循環來命令所有的士兵。 while (soldierIndex < soldiers.length) { var soldier = soldiers[soldierIndex]; hero.command(soldier, "move", { x: 50, y: 40 }); soldierIndex += 1; } // 去加入你的朋友! var target = { "x": 48, "y": 40 }; while (hero.distanceTo(target)) { hero.move(target); }
第31關:佣兵山
// 收集硬幣招募士兵,並指揮他們攻擊敵人。 while (true) { // 移動到最近的硬幣處。 // 使用 move 取代 moveXY,以便於不斷發出命令。 var coin = hero.findNearest(hero.findItems()); if (coin) { hero.move(coin.pos); } // hero.say("我需要金幣!"); // 如果錢夠了就招募士兵。 if (hero.gold > hero.costOf("soldier")) { hero.summon("soldier"); } var enemy = hero.findNearest(hero.findEnemies()); if (enemy) { var soldiers = hero.findFriends(); var soldierIndex = 0; // 遍歷你所有的士兵,命令他們攻擊。 while (soldierIndex < soldiers.length) { var soldier = soldiers[soldierIndex]; soldierIndex += 1; // 使用'attack'命令,讓你的士兵們發起攻擊。 hero.command(soldier, "attack", enemy); } } }
第32關:木材守衛
while (true) { // 收集金子 var coin = hero.findNearest(hero.findItems()); hero.move(coin.pos); // 如果你有足夠的金幣,召喚一個士兵。 if (hero.gold > hero.costOf("soldier")) { hero.summon("soldier"); } // 使用 for 循環來命令每個士兵。 var friends = hero.findFriends(); // for 循環用三個部分,用分號分隔開。 // for(初始化;條件;表達式) // 初始化是在第一次循環開始時完成的。 // 當條件為真的時候,循環繼續 for (var friendIndex = 0; friendIndex < friends.length; friendIndex++) { var friend = friends[friendIndex]; if (friend.type == "soldier") { var enemy = friend.findNearestEnemy(); // 如果這有一個敵人,命令她攻擊。 // 否則的話,移動她到地圖的右邊。 if (enemy) { hero.command(friend, "attack", enemy); } else { hero.command(friend, "move", { "x": 72, "y": 34 }); } } } }
第33關:動物管理員
// 保護籠子。 // 放一個士兵在每一個 X 的位置 var points = []; points[0] = { x: 33, y: 42 }; points[1] = { x: 47, y: 42 }; points[2] = { x: 33, y: 26 }; points[3] = { x: 47, y: 26 }; // 1.收集80金幣。 while (hero.gold < 80) { var coins = hero.findItems(); var coin = hero.findNearest(coins); if (coin) { hero.move(coin.pos); } } // 2.建造4個士兵。 for (var i = 0; i < 4; i++) { hero.summon("soldier"); } // 3.派你的士兵到特定的位置上。 while (true) { var friends = hero.findFriends(); for (var j = 0; j < friends.length; j++) { var point = points[j]; var friend = friends[j]; var enemy = friend.findNearestEnemy(); if (enemy && enemy.team == "ogres" && friend.distanceTo(enemy) < 5) { // 命令友方攻擊。 hero.command(friend, "attack", enemy); } else { // 命令的朋友移動到特定點上。 hero.command(friend, "move", point); } } }
第34關:高貴的犧牲
// 收集80金。 while (hero.gold <= 80) { var coin = hero.findNearest(hero.findItems()); hero.move(coin.pos); } // 建造4個士兵來做誘餌 while (hero.gold > hero.costOf("soldier")) { hero.summon("soldier"); } // 派你的士兵到指定位置。 var points = []; points[0] = { x: 13, y: 73 }; points[1] = { x: 51, y: 73 }; points[2] = { x: 51, y: 53 }; points[3] = { x: 90, y: 52 }; var friends = hero.findFriends(); // 使用 for 循環,讓i從0到4遍歷 // 讓各盟友士兵和各地點位置匹配,以命令他們移動 for (var i = 0; i < 4; i++) { var friend = friends[i]; var point = points[i]; hero.command(friend, "move", point); }
第35關:狩獵派對
// 你可以對你的軍隊使用findNearestEnemy() 得到離軍隊最近的敵人 while (true) { var friends = hero.findFriends(); // 使用for循環,遍歷每一位軍人 for (var i = 0;i < friends.length;i += 1){ var friend = friends[i]; var newX = friend.pos.x + 0.5; var newY = friend.pos.y; // 如果他們看到敵人,則command命令他們攻擊 var enemy = friend.findNearestEnemy(); if (enemy){ hero.command(friend, "attack", enemy);} // 否則,命令軍隊向右側移動一小步 else{ hero.command(friend, "move", {"x":newX,"y": newY}); } } }
第36關:借刀
// 你的英雄不需要在本關參與戰斗。 // 命令你的弓箭手集中在火攻敵人。 while(true){ var toughest = null; var maxHealth = 0; var enemies = hero.findEnemies(); //找生命值最高的人 for (var i = 0; i < enemies.length; ++i) { var enemy = enemies[i]; if(enemy.health > maxHealth) { toughest = enemy; maxHealth = enemy.health; } } var friends = hero.findFriends(); if (toughest) { for (var aa = 0; aa < friends.length; ++aa) { var friend = friends[aa]; hero.command(friend, "attack", toughest); } } }