Как избежать ошибки при поиске цели, если цель вне видимости?[help pls]


#1

Помогите плз. Чет не хватает у меня фантазии как сделать нормальный поиск противника.

Пытаюсь написать код для задания “драка в темнолесье”.
Использую JavaScript
Герой не имеет покупных предметов.

Мои команды

shield()
attack(target)
cleave(target)
distanceTo(target)
findNearestEnemy()
findNearestItem()
isReady(action)
moveXY(x, y)
else
if/else
while-true loop
say(message)

Первым делом пытаюсь обнаружить ближайшего противника(переменная “enemy”), и найти дистанцию до него.
Т.к. в радиусе обзора нет противника мы получаем enemy = null, а поиск дистанции выдает ошибку.

Как сделать поиск противника и дистанции ?(Так что бы не приходилось при атаке или другом действии каждый раз проверять наличие противника и его дистанцию)

Как эти данные занести в функцию типа " f_enemy(obj,dis)" Где obj - идентично переменной “enemy”, а dis - дистанция между героем и “enemy”


#2

Если не ошибаюсь это было в раних уровнях

var enemy = hero.findNearestEnemy();
if (enemy) {
    // Do something about enemies
    ...
}

Или можно совмещать несколько условий (не помню навскидку где, но это будет представлено в Лесу)

var enemy = hero.findNearestEnemy();
if (enemy && hero.distanceTo(enemy) < 10) {
    // Do something about enemies
    ...
}

В данном случае вторая часть условия проверяется только если первая НЕ-ЛОЖЬ (особенность логического И)


#3

Так и есть. Это было в ранних уровнях.

Но меня интересует что-то такое:
var enemy,distance;
while(true) {
    while(enemy===null) {
        enemy = hero.findNearestEnemy();
        if(enemy!==null){
            distance = hero.distanceTo(enemy);
        }
    }
    hero.say(enemy);
}

Вместо hero.say(enemy) атака,проверка умений и т.д.

Есть ли в этом смысл ?
Или просто весь код (кроме while true и Find) поместить в if (enemy) и не выносить людям мозг ? =)


#4
Рабочий вариант
while(true) {
    var enemy = hero.findNearestEnemy();
    if (enemy) {
        var distance = hero.distanceTo(enemy);
        //----------------
        hero.attack(enemy);
    }
    else {
        hero.moveXY(60, 51);
    }
}

Так все работает. Спасибо. Но все равно не понятно почему первоначальный вариант был нерабочим.


#5

Первый вариант выглядит странно и переусложненым. Второй лучше.

Кстати в первом варианте enemy изначально не null. Изначально enemy === undefined. Вообще, со строгими проверками на существование надо быть аккуратней и точно знать что прилетит


#6

Это точно. Спасибо огромное. Я сам не знаю чего меня так переклинело.

Тут я опять не догоняю…
Команда hero.say(enemy);
При выводе ошибки пишет

say's argument message should have type string, but got null.
Say what?


#7

findNearestEnemy() при отстутствии врага вернет null. Но в варианте

var enemy,distance;
while(true) {
    while(enemy===null) {

enemy будет undefined изначально. Поэтому я и сказал что не если не уверены наверняка что должно быть, да и не часто надо разделять случаи undefined и null, то используйте более простой вариант if (!enemy) для примера.

Случаи типа enemy === null это когда вам точно надо знать что нул, а не ноль или фолс или андефайнед.


#8

Основной вопрос решен так что тему, при желании, можно закрыть. Но есть еще непонятные для меня моменты.
1)Как понять if (!enemy) ? (Я понял так: Если переменная отсутствует то…)
2)Можно ли писать !enemy до объявления переменной?
3)

непонятка с ошибкой
var enemy,distance;
while(true) {
    while(enemy===null) {                     -+
        enemy = hero.findNearestEnemy();       | enemy=== undefined  => Цикл пропускается.
    }                                         -+
    hero.say(enemy);                          -- В ошибке указано  say s argument message should have type string, but got null.
}

upd

Так вообще ничего не происходит
var enemy,distance;
while(true) {
    while(enemy===undefined || enemy===null) {   // while(!enemy) такой же результат
        enemy = hero.findNearestEnemy();
    } 
    hero.say(enemy);
}

#9
  1. Джаваскрипт язык динамический и !value -> происходит динамическое предобразование типа в булево, в итоге null undefined 0 false итп становятся false и соответственно с ! проверка на НЕ.
  2. Не стоит
  3. Надо смотреть как там вызов ошибки устроен, возможно там null зашит в тексте и отрабатывается и на андефайнед.
    на второй случай не вылетает ошибка на вечную петлю случаем?

#10
  1. value равнозначно value===true; !value равнозначно value!==true?
  2. Наткнулся на другом сайте на оператор typeof. Судя по результату null действительно зашит в текст.

Да…по окончании задания появляется ошибка на вечную петлю или медленный код.
Игра автоматически прерывает выполнение вечного цикла или медленного кода(до того как выделенное время на миссию закончится) ?
В встроенном редакторе выполнение кода останавливается на hero.say(enemy),
но ничего не происходит. А после миссии появляется ошибка.


#11
  1. Я бы сказал value == false но не совсем. В джаваскрипт есть строгое и не строгое равенство.

Вечная петля потому что долго в цикле не происходит ничего и он крутится без изменений и команд. Для while(true) прописано исключение.


#12

Чем больше ты мне объясняешь, тем больше у меня вопросов XD
Но с этим, думаю, я смогу сам разобраться.
Спасибо за помощь. Удачи.


#13

Это нормально и правильно, как говорил мой преподаватель (давненько это было) “если нет вопросов, то вам либо не интересно, либо вы не слушали”.