Play Home Contribute Github Join Us! Discourse Staff Members Github Contribution Guides Team

Испытания. Пустыня Сарвен. JavaScript

Не могу пройти уровень “Испытание” в пустыне Сарвен. Пишет, что проблема либо в слишком медленном коде или в бесконечном цикле. Не смог найти ошибок или бесконечный цикл. Поэтому прошу помощи

Извиняюсь, если напортачил с оформлением кода. Создаю тему в первые

Код:

Summary

// Этот уровень предназначен для продвинутых игроков. Решение получится довольно сложным с большим количеством передвижений. Для его прохождения понадобится много ручной работы и креативных приёмов.
// Проложи дорогу к первому испытанию (Оазис Марра), убивая врагов на своём пути. Достигнув его, собери все грибы, и начнётся испытание. Если переживёшь сражение, держи путь к следующему оазису за вторым испытанием, а затем - в Храм. Когда пройдёшь все испытания, то сразишься с главным боссом. Удачи!
// Совет: очки с высокой дальностью очень помогут на этом уровне, поэтому выбирай лучшее из того, что имеется.
// Совет: тип (‘type’) охранников оазиса равен ‘oasis-guardian’

Код:
function flagMove(flag){
hero.moveXY(flag.pos.x, flag.pos.y);
hero.pickUpFlag(flag);
}

// поднять все найденные предметы
// @param array массив найденный предметов
function giveItem(items){
var i = 0;
while (i < items.length) {
var item = items[i];
hero.moveXY(item.pos.x, item.pos.y);
i++;
}

}

// убить всех найденных противников
// @param array массив найденных противников
function bashAndAttack(enemies){
var i = 0;
while (i < enemies.length) {
// проверка на дистанцию из-за того, что однажды герой
// побежал к противнику, который находился через 50 метров
if(enemies[i] && hero.distanceTo(enemies[i]) < 30){
var target = enemies[i];
while (target.health > 0) {
if (target.health > 100 && hero.isReady(“bash”)) {
hero.bash(target);
} else if (target.health > 0) {
hero.attack(target);
}
}
i++;
}
}
}

// это единственный бесконечный цикл. Но ведь подобные циклы
// использовались до этого
while(true) {
var items = hero.findItems();
var enemies = hero.findEnemies();
var flag = hero.findFlag();

// Я был не уверен, что можно давать на проверку (if’у) массив (enemies || items),
// поэтому создал эти переменные
var kostilEnemy = hero.findNearestEnemy();
var kostilItem = hero.findNearestItem();

if (flag) {
    flagMove(flag);
} else if (kostilEnemy){
    bashAndAttack(enemies);
} else if (kostilItem){
    giveItem(items);
}

}

Бесконечными могут оказаться циклы, которые по логике должны обрываться, а не только где явно в условии указано true. При сообщении о бесконечных циклах нужно тщательно проверять логику работы всех циклов. Вначале лучше их поочерёдно поотключать чтобы выяснить проблемный цикл, а потом его разбирать. У вас проблема в этой функции:

bashAndAttack()
function bashAndAttack(enemies){
    var i = 0;
    while (i < enemies.length) {
        // проверка на дистанцию из-за того, что однажды герой
        // побежал к противнику, который находился через 50 метров
        if(enemies[i] && hero.distanceTo(enemies[i]) < 30){
            var target = enemies[i];
            while (target.health > 0) {
                if (target.health > 100 && hero.isReady('bash')) {
                    hero.bash(target);
                } else if (target.health > 0) {
                    hero.attack(target);
                }
            }
            i++;
        }
    }
}

в неверном месте стоит приращение индекса i. Он оказался в блоке условного оператора, нужно его разместить за следующей закрывающейся фигурной скобкой и бесконечный цикл исчезает. Вот так:

bashAndAttack()
function bashAndAttack(enemies){
    var i = 0;
    while (i < enemies.length) {
        // проверка на дистанцию из-за того, что однажды герой
        // побежал к противнику, который находился через 50 метров
        if(enemies[i] && hero.distanceTo(enemies[i]) < 30){
            var target = enemies[i];
            while (target.health > 0) {
                if (target.health > 100 && hero.isReady('bash')) {
                    hero.bash(target);
                } else if (target.health > 0) {
                    hero.attack(target);
                }
            }
        }
        i++;
    }
}

Да, для добавления кода есть кнопочка </>. Ато потом нудно приходится табуляции в код добавлять чтоб в нём разобраться. Выделить код и нажать кнопку.