2015-01-23 3 views
1

В качестве упражнения я попытался установить монстра в огне с небольшой рекурсией. Отлично работает, однако я хотел бы добавить дополнительный урон кнопкой, пока рекурсия работает. Пока все функции, устанавливающие дополнительную переменную с помощью кнопки, не работают, поскольку я не могу найти способ повлиять на переменную extra во время работы рекурсии. В основном в нижеследующем примере я хочу, чтобы кнопка нажала, чтобы сделать то, что в настоящий момент используется «if (monster === 55) ...».Манипуляция переменной в рекурсии

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8"> 
     <script type="text/javascript"> 
     function print(text) { document.querySelector("#content").innerHTML += text + "\n"; } 
     </script> 
     <title>Monster</title> 
    </head> 
    <body> 
     <input type="button" id="btnPoke" value="Poke it" onclick="" /> 
     <pre id="content"></pre> 
     <script type="text/javascript"> 
      var monster = 100; 
      var extra = 10; 

      function setonfire(monster, extra) { 
       setTimeout(function() { 
        print("Monster: " + monster + ", Extra: " + extra); 
        if (monster > 0) { 
         if (monster === 55) { 
          monster = monster - extra; 
          print("Poke for an extra " + extra); 
         } 
         monster = monster - 5; 
         setonfire(monster, extra); 
        } 
       }, 200); 
      } 
      setonfire(monster, extra); 
     </script> 
    </body> 
</html> 

Надеюсь, это не слишком глупо, но я действительно в недоумении и, вероятно, застрял внутри мыслительной ошибки. Я бы хотел, чтобы какой-либо вклад подсказывал мне, где я понял, что понятия ошибочны. Мое подозрение - проблемы с охватом или рекурсия

+0

вместо монстра == 55, имеют флаг для дополнительного урона (т.е. extraDamage = true) и проверить его в цикле. При нажатии кнопки установите extraDamage = true, когда нажимается кнопка. –

+0

Спасибо за ответ, но с помощью этого метода я не могу заставить его работать. Я устанавливаю var extraDamage = false в начале функции setonfire, проверяется в цикле для if (extraDamage === true) и пишет функцию onClick doExtraDamage() {extraDamage = true; }. Тем не менее сам цикл во время его запуска не интересуется тем, что я делаю с помощью кнопки. Я что-то упускаю? – morph

+0

Я нашел его. Проблема заключалась в том, что я инициализировал extraDamage внутри функции, чего я не должен был иметь. Устанавливать его вне ложных работ. Еще раз спасибо. – morph

ответ

1

Javascript передает примитивы по значению. поэтому, когда вы вызываете setonfire(monster, extra);, вы передаете значение 100 методу, и оно никогда не будет влиять на внешнюю переменную monster.

Вы можете ссылаться на объект monster непосредственно в методе. Итак:

var monster = 100; 
var extra = 10; 

function setonfire(extra) { 
    setTimeout(function() { 
     print("Monster: " + monster + ", Extra: " + extra); 
     if (monster > 0) { 
      if (monster === 55) { 
       monster = monster - extra; 
       print("Poke for an extra " + extra); 
      } 
      monster = monster - 5; 
      setonfire(extra); 
     } 
    }, 200); 
} 
setonfire(extra); 

В противном случае сделать monster объект, такой как:

var monster = { health: 100 }; 
var extra = 10; 

function setonfire(monster, extra) { 
    setTimeout(function() { 
     print("Monster: " + monster.health + ", Extra: " + extra); 
     if (monster.health > 0) { 
      if (monster.health === 55) { 
       monster.health = monster.health - extra; 
       print("Poke for an extra " + extra); 
      } 
      monster.health = monster.health - 5; 
      setonfire(monster, extra); 
     } 
    }, 200); 
} 
setonfire(monster, extra); 

Edit: Variable корпус

+0

О, хорошо, спасибо. Я подумал, что, пройдя его прямо, я буду очень осторожен, но вместо этого получим обратное. Метод объекта - это то, что я буду использовать в будущем. Но, как и с моим ответом на Hattan выше, я все равно могу влиять только на значение здоровья после завершения цикла. Манипулирование monster.health, пока цикл работает, по-прежнему игнорируется :( – morph

+0

Я не уверен, что вы имеете в виду, проверьте эту скрипту: http://jsfiddle.net/Jarga/8fzfq64g/ она обновляется в каждом цикле. – Jarga

+0

Извините, мой язык вероятно, все еще слишком непросто. Код в скрипке ищет здоровье монстра, чтобы он упал до 55, а затем выполнил дополнительную субстрацию. То, что я ищу, заменяет эту проверку фиксированного числа кнопкой на некоторое время, когда цикл работает на простом английском языке: пока монстр горит, я хочу, чтобы он ударил его за дополнительный урон, когда я решил нажать кнопку (не точно в 55. Я пробовал это в ответе, который я дал Хаттану, но оценивая нажатие кнопки для установки чего-то типа extraDamage в true было просто проигнорировано циклом. – morph

Смежные вопросы