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

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

 

posted @ 2019-10-24 20:32  石海莹  阅读(2545)  评论(0编辑  收藏  举报