2015-07-01 4 views
1

начинающих здесь ...Для VS. петли в то время как цикл в JavaScript,

Работа через интернет-пример бессмысленной вероятности «игры», где пользователь убивает дракон или получает съеденную. Я знаю, что игра работает с использованием цикла while, поэтому я попытался реплицировать его с помощью цикла for, но не смог. Мне в первую очередь интересно, почему цикл for не работает, и если есть какая-то очевидная причина, это нужно выполнить, используя цикл while.

Ниже приведено описание пример с циклом while для контекста.

var slaying = true; 
var youHit = Math.floor(Math.random() * 2); 
var damageThisRound = Math.floor(Math.random() * 5 + 1); 
var totalDamage = 0; 

while (slaying) { 
    if (youHit) { 
    console.log("You hit the dragon and did " + damageThisRound + " damage!"); 
    totalDamage += damageThisRound; 

    if (totalDamage >= 4) { 
     console.log("You did it! You slew the dragon!"); 
     slaying = false; 
    } else { 
     youHit = Math.floor(Math.random() * 2); 
    } 
    } else { 
    console.log("The dragon burninates you! You're toast."); 
    slaying = false; 
    } 
} 

А вот не работает для цикла.

var youHit = Math.floor(Math.random() * 2); 
var damageThisRound = Math.floor(Math.random() * 5 + 1); 

for(totalDamage=0;totalDamage>3;totalDamage+=damageThisRound){ 
    if(youHit){ 
     console.log("You hit and did "+damageThisRound); 
     totalDamage += damageThisRound; 

     if(totalDamage>3){ 
      console.log("You did it! You slew the dragon!"); 
     } else { 
      youHit = Math.floor(Math.random() * 2); 
     } 
    } else { 
     console.log("The dragon kills you"); 
    } 
} 

Благодаря

+1

ваш цикл никогда не запускается. –

ответ

1

Ваше условие цикла является проблема

var youHit, damageThisRound; 
 
for (var totalDamage = 0; totalDamage < 4; totalDamage += damageThisRound) { 
 
    youHit = Math.floor(Math.random() * 2); 
 
    if (youHit) { 
 
    //need to calculare the damage in each loop 
 
    damageThisRound = Math.floor(Math.random() * 5 + 1); 
 
    snippet.log("You hit and did " + damageThisRound); 
 

 
    } else { 
 
    snippet.log("The dragon kills you"); 
 
    //you need to stop the loop here 
 
    break; 
 
    } 
 
} 
 
//need this outside of the loop since the increment is in the for loop block 
 
if (youHit) { 
 
    snippet.log("You did it! You slew the dragon!"); 
 
}
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+0

https://jsfiddle.net/arunpjohny/f5ks4rvv/ –

1

В вашем for цикле, вы установите totalDamage в 0, а затем вы звоните totalDamage > 3. Вместо этого, изменить цикл for к

for(totalDamage=0;totalDamage<3;totalDamage+=damageThisRound){ 

Другими словами, вы переключились знак вокруг, потому что вы устанавливаете переменную 0 и только тогда, когда идет переменная больше чем 3.

+0

Это исправляет основную ошибку, да, но по-прежнему возникают некоторые проблемы. Я также добавил 'totalDamage = 4;' к наивысшему уровню 'else', но сценарий по-прежнему не работает отлично. Возможно ли иметь цикл for, который не всегда выполняет оператор (в данном случае 'totalDamage + = damageThisRound')? В противном случае переменная 'totalDamage' будет увеличиваться, даже если' youHit' является 'false'. –

+0

Невозможно пропустить выполнение инструкции в цикле for. Возможно, это ответ на ваш второй вопрос: в этом случае цикл while лучше, потому что он делает код более понятным. С циклом for мы ожидаем простые условия и инструкцию в каждом повороте цикла, идеально подходящие для просмотра коллекции. С циклом while вы берете время, чтобы обеспечить очень четкий код. – tharibo

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