Codecombat 游戏攻略——JavaScript编辑语言——关卡(计算机科学三)Ⅲ

第41关:截断

// 站在农民和塔之间。
while (true) {
    var enemy = hero.findNearestEnemy();
    var friend = hero.findNearestFriend();
    // 通过将friend.pos.x和enemy.pos.x相加来计算x
    // 然后除以2。
    // 如需更多帮助,请查看指南!
    var x = (friend.pos.x + enemy.pos.x) / 2;
    // 现在对y做同样的事情
    var y = (friend.pos.y + enemy.pos.y) / 2;
    // 移动到计算得到的X和Y坐标。
    hero.moveXY(x, y);
}

 

第42关:雷蹄

// 向右朝绿洲移动。
// 看到牦牛时,在上方或是下方建造一段"fence"
while (true) {
    var yak = hero.findNearestEnemy();
    if (yak) {
        // 如果yak.pos.y大于hero.pos.y
        if (yak.pos.y > hero.pos.y) {
            // 使用buildXY在牦牛下方10米处建造一段"fence"
            hero.buildXY("fence", yak.pos.x, yak.pos.y - 10);
        }    // 否则:
        else {
            // 使用buildXY在牦牛上方10米处建造一段"fence"
            hero.buildXY("fence", yak.pos.x, yak.pos.y + 10);
        }
    } else {
        // 使用moveXY向右朝绿洲移动10米。
        hero.moveXY(hero.pos.x + 10, hero.pos.y);
    }
}

 

第43关:Kithgard附魔师

// 定义你自己的简单移动函数。
// 定义moveRight
// 注意:每个函数都应该让英雄移动12米!
function moveRight() {
    var x = hero.pos.x + 12;
    var y = hero.pos.y;
    hero.moveXY(x, y);
}
// 定义moveDown
function moveDown() {
    var x = hero.pos.x;
    var y = hero.pos.y - 12;
    hero.moveXY(x, y);
}
// 定义moveUp
function moveUp() {
    var x = hero.pos.x;
    var y = hero.pos.y + 12;
    hero.moveXY(x, y);
}
// 现在,使用这些函数!
moveRight();
moveDown();
moveUp();
moveUp();
moveRight();

 

第44关:扫雷

// 带领农民和医生穿越雷区。
while (true) {
    var coin = hero.findNearestItem();
    var healingThreshold = hero.maxHealth / 2;
    // 检查你是否身受重伤。
    if (hero.health < healingThreshold) {
        // 向左移动10米。
        hero.moveXY(hero.pos.x - 10, hero.pos.y);
        // 请求治疗。
        hero.say("Can I get a heal?");    // 否则,移动到下一枚硬币。
    } else if (coin) {
        hero.moveXY(coin.pos.x, coin.pos.y);
    }
}

 

第45关:'Killdeer'操作

// 诱使食人魔陷入陷阱。 这些食人魔很谨慎。
// 只有英雄受伤时,他们才会追击。
// 该函数检查英雄的生命值
// 并返回一个布尔值。
function shouldRun() {
    if (hero.health < hero.maxHealth / 2) {
        return true;
    } else {
        return false;
    }
}
while (true) {
    // 只有当shouldRun()返回True时才移动到X.  true
    var enemy = hero.findNearestEnemy();
    if (shouldRun()) {
        hero.moveXY(75, 37);    // 否则,攻击!
    } else {
    }
}

 

第46关:医疗护理

// 当你的生命值少于一半时,请求治疗师的帮助。
while (true) {
    var currentHealth = hero.health;
    var healingThreshold = hero.maxHealth / 2;
    // 如果你当前的生命值低于界限值,
    // 转移到治疗点并说, "heal me".
    // 否则的话,攻击。你需要奋战!
    var enemy = hero.findNearestEnemy();
    if (currentHealth < healingThreshold) {
        hero.moveXY(65, 46);
        hero.say("heal me");
    } else if (enemy) {
        hero.attack(enemy);
    }
}

 

第47关:守时

// 使用你的新技能来选择你要做什么: hero.time
while (true) {
    // 如果是前十秒,攻击。
    if (hero.time < 10) {
        var aa = hero.findNearestEnemy();
        if (aa) {
            hero.attack(aa);
        }
    }    // 否则,如果是前35秒,收集硬币。
    else if (hero.time < 35) {
        var coin = hero.findNearestItem();
        if (coin) {
            hero.moveXY(coin.pos.x, coin.pos.y);
        }
    }    // 35秒后,再次发起攻击!
    else {
        var bb = hero.findNearestEnemy();
        if (bb) {
            hero.attack(bb);
            if (hero.health < hero.maxHealth / 2) {
                hero.moveXY(16, 12);
            }
        }
    }
}

 

第48关:沙漠十字

// 弄清食人魔来自哪个方向。
while (true) {
    var enemy = hero.findNearestEnemy();
    if (enemy) {
        // 左边:enemy.pos.x小于hero.pos.x
        var isLeft = hero.pos.x > enemy.pos.x;
        // 上方:enemy.pos.y大于hero.pos.y
        var isAbove = hero.pos.y < enemy.pos.y;
        // 右边:enemy.pos.x大于hero.pos.x
        var isRight = enemy.pos.x > hero.pos.x;
        // 下方:enemy.pos.y小于hero.pos.y
        var isBelow = enemy.pos.y < hero.pos.y;
        // 如果敌人在上方 (isAbove) 且 在左边 (isLeft):
        // 使用buildXY()在X标记处建造一个"fire-trap"。
        if (isLeft && isAbove) {
            hero.buildXY("fire-trap", 20, 51);
        }
        // 如果敌人在上方 (isAbove) 且 在右边 (isRight):
        // 使用buildXY()在X标记处建造一个"fire-trap"。
        if (isAbove && isRight) {
            hero.buildXY("fire-trap", 60, 51);
        }
        // 如果敌人在下方 (isBelow) 且 在左边 (isLeft):
        // 使用buildXY()在X标记处建造一个"fire-trap"。
        if (isBelow && isLeft) {
            hero.buildXY("fire-trap", 20, 17);
        }
        // 如果敌人在下方 (isBelow) 且 在右边 (isRight):
        // 使用buildXY()在X标记处建造一个"fire-trap"。
        if (isBelow && isRight) {
            hero.buildXY("fire-trap", 60, 17);
        }
        hero.moveXY(40, 34);
    } else {
        hero.moveXY(40, 34);
    }
}

 

第49关:囤积黄金

// 收集25金,然后告诉 Naria 总数。
// 当totalGold >= 25,使用 break 来停止收集。
var totalGold = 0;
while (true) {
    var coin = hero.findNearestItem();
    if (coin) {
        // 捡起硬币。
        hero.moveXY(coin.pos.x, coin.pos.y);
        // 将硬币的价值加到totalGold。
        // 使用以下方法得到它的价值::  coin.value
        totalGold += coin.value;
    }
    if (totalGold >= 25) {
        // 这会中断跳出循环并执行循环下面的语句。
        // 循环结束后,运行循环后的代码。
        break;
    }
}
// 完成收集黄金!
hero.moveXY(58, 33);
// 去告诉 Naria 你收集了多少黄金。
hero.say("你好Naria,我收集了" + totalGold + "金");

 

第50关:诱饵演习

// 我们在测试一个新的建造类型:诱饵(decoy)。
// 建造4个诱饵,然后汇报总数给Naria。
var decoysBuilt = 0;
while (true) {
    var coin = hero.findNearestItem();
    if (coin) {
        // 收集硬币!
        hero.moveXY(coin.pos.x, coin.pos.y);
    }
    // 每个诱饵消费25金。
    // 如果hero.gold大于或等于25:
    if (hero.gold >= 25) {
        // 用buildXY建造一个"decoy"
        hero.buildXY("decoy", hero.pos.x, hero.pos.y);
        // 为decoysBuilt计数值加1。
        decoysBuilt += 1;
    }
    if (decoysBuilt == 4) {
        // 建造了4个诱饵后跳出循环。
        break;
    }
}
hero.say("完成诱饵建造!");
hero.moveXY(14, 36);
// 说出你建造了多少诱饵。
hero.say("我建造了" + decoysBuilt + "个诱饵");

 

第51关:炼金术传承

// 和食人魔矮人抢Omarn Brewstone提取出的水!
// 使用`continue`语句避开毒药。
while (true) {
    var enemy = hero.findNearestEnemy();
    var item = hero.findNearestItem();
    // 如果没有敌人,使用continue跳出此轮循环继续运行。
    if (!enemy) {
        continue;
    }
    // 如果没有物品,要一瓶药水,然后continue。
    if (!item) {
        hero.say("给我点喝的!");
        continue;
    }
    // 如果item.type是"poison",使用continue跳出此轮循环继续运行。
    if (item.type == "poison") {
        continue;
    }
    // 此时,药水一定是一瓶水
    // 使用moveXY移到药水,然后回到起点!
    if (item.type !== "position") {
        hero.moveXY(44, 35);
        hero.moveXY(34, 47);
    }
}

 

第52关:快速赛跑

// 使用事件处理器,这样宠物和英雄都会跑起来!
function petMove(event) {
    pet.moveXY(50, 21);
}
// 使用pet.on("spawn", petMove)替换petMove()
// 这样你的英雄和宠物就会同时跑起来。
// Δ把这个用pet.on("spawn", petMove)替换
pet.on("spawn", petMove);
hero.moveXY(50, 12);

 

第53关:沙漠蘑菇

// 收集9个蘑菇。
// 这个函数让宠物给你取回药水。
function onSpawn(event) {
    while (true) {
        // 宠物可以根据类型找到最近的物品。
        var potion = pet.findNearestByType("potion");
        // 如果存在药水则让宠物取回:
        if (potion) {
            pet.fetch(potion);
        }
    }
}
pet.on("spawn", onSpawn);
// 蘑菇有毒,不要太快收集。
while (true) {
    var someItem = hero.findNearestItem();
    if (someItem && hero.health > hero.maxHealth / 3) {
        // 收集someItem:
        hero.moveXY(someItem.pos.x, someItem.pos.y);
    }
}

 

第54关:蘑菇之声

// 打败骷髅并打开宝箱。
function onSpawn(event) {
    // 宠物要找到生命药水(类型是 "potion"):
    var potion = pet.findNearestByType("potion");
    // 并将它取回:
    pet.fetch(potion);
    // 宠物要找到金钥匙(类型是"gold-key"):
    var key = pet.findNearestByType("gold-key");
    // 并将它取回:
    pet.fetch(key);
}
// 宠物可以发现的不仅仅是物品:
var skeleton = pet.findNearestByType("skeleton");
pet.on("spawn", onSpawn);
while (true) {
    if (skeleton.health > 0) {
        hero.attack(skeleton);
    } else {
        hero.moveXY(31, 38);
    }
}

 

第55关:钥匙陷阱

// 获得三把钥匙并释放圣骑士。
function onSpawn(event) {
    // 宠物需要找到并拿回3把钥匙。
    // 你需要后续类型的物品:
    // "bronze-key"、"silver-key"和"gold-key"。
    var key1 = pet.findNearestByType("bronze-key");
    pet.fetch(key1);
    var key2 = pet.findNearestByType("silver-key");
    pet.fetch(key2);
    var key3 = pet.findNearestByType("gold-key");
    pet.fetch(key3);
}
pet.on("spawn", onSpawn);
while (true) {
    var enemy = hero.findNearestEnemy();
    if (enemy && enemy.team == "ogres") {
        hero.attack(enemy);
    }
    if (hero.health < 300) {
        // 你也可以在主线程中使用宠物。
        var potion = pet.findNearestByType("potion");
        if (potion) {
            hero.moveXY(potion.pos.x, potion.pos.y);
        }
    }
}

 

第56关:命令链

// 只有你的宠物可以唤醒巫师。
function onHear(event) {
    // "hear"事件设置event.speaker属性。
    // 检查宠物是否听到了英雄的话:
    if (event.speaker == hero) {
        pet.say("WOOF");
    }
}
// 为"hear"事件指派事件处理器。
pet.on("hear", onHear);
while (true) {
    var enemy = hero.findNearestEnemy();
    // 如果有敌人:
    if (enemy) {
        // 使用hero.say()提醒你的宠物
        hero.say("这里有敌人!");
        // 移动到营地内的X处。
        hero.moveXY(30, 26);
        // 然后返回营地外的X处。
        hero.moveXY(30, 16);
    }
}

 

第57关:宠物工程师

// 根据需要将宠物移到左或右按钮。
function onHear(event) {
    // 找到门卫
    var archer = pet.findNearestByType("archer");
    var soldier = pet.findNearestByType("soldier");
    // 如果"event.speaker"参数是 `archer`:
    if (event.speaker == archer) {
        // 移动到左边的按钮。
        pet.moveXY(32, 30);
    }
    // 如果"event.speaker"参数是`soldier`:
    if (event.speaker == soldier) {
        // 移动到右边的按钮。
        pet.moveXY(48, 30);
    }
}
pet.on("hear", onHear);
// 您不必更改下面的代码。
// 你的英雄应该保护右下角的通道。
while (true) {
    var enemy = hero.findNearestEnemy();
    if (enemy) {
        hero.attack(enemy);
    }
}

 

第58关:宠物翻译家

// 你的宠物应该翻译命令。
function onHear(event) {
    // 宠物听到的消息在event.message中
    var message = event.message;
    // 如果消息是 "North":
    if (message == "North") {
        // 宠物说 "Htron"。
        pet.say("Htron");
    }
    // 如果消息是 "South":
    if (message == "South") {
        // 宠物说 "Htuos"。
        pet.say("Htuos");
    }
    // 如果消息是 "East":
    if (message == "East") {
        // 宠物说 "Tsae"。
        pet.say("Tsae");
    }
}
// 分配事件处理程序。
pet.on("hear", onHear);
while (true) {
    var enemy = hero.findNearestEnemy();
    // 不要攻击Brawlers。
    if (enemy && enemy.type != "brawler") {
        hero.attack(enemy);
    }
}

 

第59关:宠物副官

// 你的宠物可以帮助你活下来,直到你可以逃脱。
function onHear(event) {
    // event.message包含所听到的文本。
    // 如果有人说 "Fire"
    if (event.message == "Fire") {
        // 用pet.moveXY()移动到底部的X标记
        pet.moveXY(64, 16);
        // 使用pet.say()说点什么
        pet.say("我是最厉害的");
    }    // 如果有人说 "Heal"
    else if (event.message == "Heal") {
        // 用pet.moveXY()移动到顶部的X标记
        pet.moveXY(64, 52);
        // 使用pet.say()说点什么
        pet.say("我是最厉害的");
    }
}
pet.on("hear", onHear);
// 您不必更改下面的代码。
while (true) {
    var enemy = hero.findNearestEnemy();
    if (enemy) {
        // 如果敌人太强大。
        if (enemy.type == "brawler") {
            hero.say("Fire");
        } else {
            hero.attack(enemy);
        }
    } else {
        // 如果你的英雄需要治疗。
        if (hero.health < hero.maxHealth / 2) {
            hero.say("Heal");
        }
    }
}

 

第60关:炼金术

// 等着炼金师的命令去拿药水。
// 宠物事件的事件处理程序 "hear"。
function onHear(event) {
    // 找到最近的药水。
    var potion = pet.findNearestByType("potion");
    var message = event.message;
    var item = hero.findNearestItem();
    // 如果事件的消息是 "Fetch"
    if (event.message == "Fetch") {
        // 让宠物拿取药水。
        pet.fetch(item);
    }    // 其他(对于任何其他消息):
    else {
        // 用pet.moveXY 让宠物回到红色标记。
        pet.moveXY(54, 34);
    }
}
pet.on("hear", onHear);
// 您不必更改下面的代码。
while (true) {
    var enemy = hero.findNearest(hero.findEnemies());
    if (enemy) {
        hero.attack(enemy);
    } else {
        hero.moveXY(40, 34);
    }
}

 

第61关:危险钥匙

// 听圣骑士的,取回正确的钥匙。
function onHear(event) {
    // 宠物可以找到圣骑士和钥匙。
    var paladinUnit = pet.findNearestByType("paladin");
    var goldKey = pet.findNearestByType("gold-key");
    var silverKey = pet.findNearestByType("silver-key");
    var bronzeKey = pet.findNearestByType("bronze-key");
    // 如果event.speaker是paladinUnit:
    if (event.speaker == paladinUnit) {
        // 如果event.message是"Gold":
        if (event.message == "Gold") {
            // 宠物需要取金钥匙。
            pet.fetch(goldKey);
        }    // 如果event.message是 "Silver":
        else if (event.message == "Silver") {
            // 宠物需要取银钥匙。
            pet.fetch(silverKey);
        }    // 如果event.message是"Bronze":
        else if (event.message == "Bronze") {
            // 宠物需要取青铜钥匙。
            pet.fetch(bronzeKey);
        }
    }
}
pet.on("hear", onHear);

 

第62关:奥林匹克比赛

// 宠物必须赢得比赛。
// 运动员需要触碰队伍标记,然后往回跑。
function onHear(event) {
    var referee = pet.findNearestByType("wizard");
    // 如果说话的人是裁判员referee并且说的是"Start":
    if (event.speaker == referee && event.message == "Start") {
        // 让宠物跑到红色标记。
        pet.moveXY(53, 27);
        // 然后跑回来。
        pet.moveXY(6, 27);
    }
}
// 指派onHear函数来处理"hear"事件。
pet.on("hear", onHear);

 

posted @ 2019-10-17 01:25  石海莹  阅读(1678)  评论(2编辑  收藏  举报