Javascript 函数有时会将自身循环成无限循环

Javascript Function sometimes loops itself into an infinite loop

本文关键字:循环 无限循环 函数 Javascript      更新时间:2023-09-26

我做了一个while函数,大约一半的时间都可以正常工作。有时,尽管它根本不会加载函数,或者卡在加载函数的下一部分执行其循环之一。据我所知,语法没有任何问题,但我仍然是Javascript的新手。我在代码中看不到任何可能导致自己认为它陷入无限循环的地方。好吧,这是我的代码,如果你能提供帮助,那就太棒了。

var dragHunt = true; 
var hitOrMiss = Math.floor(Math.random() * 2); 
var dmgOnHit = 0;
var totalDmg = 0;
var playerHealth= 0;
var dragHitOrMiss = Math.floor(Math.random() * 1.5);
var dragDmg= 0;
while(dragHunt){
if(hitOrMiss){
    dmgOnHit = Math.floor(Math.random() * 5 + 1);
    alert("You hit the dragon, the luck is with you today. You did " + dmgOnHit + " damage!");
    totalDmg += dmgOnHit;
    if(totalDmg >= 20){
        alert("You did it! You have killed the dragon. The hunt was successful!");
        dragHunt=false;
    }
    else{
        hitOrMiss = Math.floor(Math.random() * 2);
    }
}
else{
    if(dragHitOrMiss){
        dragDmg = Math.floor(Math.random() * 5 + 1);
        alert("The Dragon hit you for " + dragDmg + " damage!");
        playerHealth += dragDmg;
        if(playerHealth >= 80){
            alert("The dragon has burnt you to a crisp. You stood no chance against the ferocious beast.");
            dragHunt=false;
        }
        else{
            hitOrMiss = Math.floor(Math.random() * 2);
        }
    }
}

}

我知道你的问题是什么。你创建了一个无限循环,因为hitOrMiss总是假的,拖着HitOrMiss也是假的。所以,基本上,dragHunt永远不会改变

如果 dragHitOrMiss 实际上是一个常量,则仅在顶部计算。 如果它是假的,并且命中或错过变成假,它们将永远不会被重新计算。当它们都是假的时,你有:

dragHunt = true;
while(dragHunt) {
  if (false) { 
     // not executed
  else if (false) {
     // not executed
  }
}

这是你的无限循环。

如果在顶部将 dragHitOrMiss 计算为 true,则在每次传递中都会重新计算 hitOrMiss,这就是为什么您有时只会有一个无限循环的原因。

编辑:您希望代码看起来更像这样:

while(dragHunt) {
    var hitOrMiss = Math.floor(Math.random() * 2);
    if (hitOrMiss) {
        // The player hit the dragon code here.
    } else {
        // The Player missed the dragon; it gets a chance to hit the player instead
        var dragHitOrMiss = Math.floor(Math.random() * 1.5);
        if (dragHitOrMiss) {
            // Dragon hit you code here.
        }
    }
}

每次检查玩家是否击中龙时,您都会计算命中/未命中值。 每次检查龙是否击中玩家时,您都会计算该命中/未命中值。 请注意,hitOrMiss 和 dragHitOrMiss 值不再在 dragHunt 循环之前声明,而是在使用之前实际声明和计算。