第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); } } }