2016-08-29 2 views
0

Я практикую циклы в javascript, но, написав его, получил бесконечный цикл, который я не могу решить. Я уверен, что его задним числом является проблема 20/20, но Я не вижу этого. Цикл в meleeChoiceНе могу понять, почему возникает бесконечный цикл

/*var meleeValues = function() {*/ 
 
    var userDmg = Math.floor(Math.random()* 5 + 10); 
 
    var ghoulDmg = Math.floor(Math.random()* 4 + 8); 
 
    var ghoulHealth = 100; 
 
    var userHealth = 110 ; 
 
    var userTotalDmg = 0 ; 
 
    var ghoulTotalDmg = 0; 
 

 

 
var firstAtk = function() { 
 
    firstStrike = Math.floor(Math.random()* 2 + 1); 
 
    if(firstStrike === 1) { 
 
     ghoulHealth = 100 - userTotalDmg; 
 
     console.log("You hit the ghoul for " + userDmg + " damage"); 
 
     console.log("The ghoul has " + ghoulHealth + " health left"); 
 
     userHealth = 110 - ghoulTotalDmg; 
 
     console.log("Ghoul hits you for " + userDmg + " damage"); 
 
     console.log("You have " + userHealth + " health left"); 
 
    } else { 
 
     userHealth = 110 - ghoulTotalDmg; 
 
     console.log("Ghoul hits you for " + userDmg + " damage"); 
 
     console.log("You have " + userHealth + " health left"); 
 
     ghoulHealth = 100 - userTotalDmg; 
 
     console.log("You hit the ghoul for " + userDmg + " damage"); 
 
     console.log("The ghoul has " + ghoulHealth + " health left"); 
 
    } 
 
} 
 

 

 
var meleeChoice = function() { 
 
    while(ghoulHealth > 0 && userHealth > 0) { 
 
    userTotalDmg += userDmg; 
 
    ghoulTotalDmg += ghoulDmg; 
 
    firstAtk; 
 
    userDmg = Math.floor(Math.random()* 5 + 10); 
 
    ghoulDmg = Math.floor(Math.random()* 4 + 8); 
 
    if (ghoulHealth < 0 && userHealth > 0) { 
 
     console.log("Congratulations, you have defeated the ghoul and gained 20xp"); 
 
    } else if (ghoulHealth > 0 && userHealth < 0) { 
 
     console.log("You have been slain by the ghoul, may your corpse serve as a warning to future explorers"); 
 
    } else { 
 
     console.log("It's not over yet"); 
 
    } 
 
    } 
 
} 
 

 
meleeChoice() 
 

 

 
/*var user = prompt("You run into a ghoul whilst exploring a dungeon, what do you choose to do?", "Fight | Sneak | Run").toLowerCase(); 
 

 
switch(user) { 
 
    case "fight": 
 
     var fight = prompt("Do you use melee or magic").toLowerCase() 
 
     if(fight === "melee") { 
 
      meleeChoice 
 
     } 
 
}*/ 
 

 
Thanks

+0

вы вызываете 'firstAtk' без скобок и так далее' meleeChoice' позже. в основном вы ничего не делаете с этим, просто нажимая ссылку на пустоту. –

+0

Обратите внимание: в firstAtk вы, в основном, дважды используете тот же код - рассмотрите отдельные функции userAttack() и ghoulAttack(), которые вы меняете в порядке, в зависимости от того, кто первым ударит. –

ответ

2

Если вы посмотрите на предиката в то время цикла, вы видите, что это зависит от того, как ghoulHealth, а также userHealth. Но внутри цикла вы никогда не изменяете значения ни одного из них. Это означает, что если этот предикат является истинным в начале, цикл начнется, и предикат навсегда останется верным.

Как указано в комментариях, похоже, это связано с тем, как вы используете функцию firstAtk. Вы должны называть это как firstAtk(), обратите внимание на круглые скобки. И есть некоторые ошибки в вашей логике для этого метода, как кажется. UserHealth и ghoulHealth всегда начинаются со 100/110 соответственно, поэтому здоровье может никогда не упасть достаточно низко, чтобы предикат был ложным.

+2

firstAtk всегда выводит урон от 100 или 110, поэтому, если урон от атаки меньше этого, цикл никогда не закончится. – Shark

+0

@ Действительно, я изменил свой ответ, чтобы включить это :-) –

0

В принципе, вы вызываете firstAtk без скобок и т. Д. meleeChoice позже. Вы ничего не делаете с этим, просто нажимая ссылку на пустоту.

1

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

userHealth = 110 - ghoulTotalDmg; 

и

ghoulHealth = 100 - userTotalDmg; 

с

userHealth = userHealth - ghoulTotalDmg; 

и

ghoulHealth = ghoulHealth - userTotalDmg; 
1

я заметил, что FirstStrike в не определено и LeeChoice не имеет полуколонной в конце строки. Эти элементы не вызовут бесконечного цикла. Я новичок в публикации ответов, и я надеюсь, что мой комментарий будет полезен.

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