2016-08-29 4 views
0

Ich praktiziere Schleifen in Javascript, aber während es schreiben eine bekam eine Endlosschleife, die ich nicht lösen kann Ich bin sicher, es ist ein Rückblick ist 20/20 Art von Problem aber Ich kann es nicht sehen. Die Schleife ist in meleeChoiceIch kann nicht herausfinden, warum Endlosschleife auftritt

/*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

nennen Sie 'firstAtk' ohne Klammern und so weiter' meleeChoice' später. im Grunde machst du nichts damit, nur den Verweis auf void zu schieben. –

+0

Beachten Sie, dass Sie in FirstAtk grundsätzlich den gleichen Code verwenden. Ziehen Sie in Betracht, separate userAttack() - und ghoulAttack() -Funktionen zu verwenden, bei denen Sie die Reihenfolge ändern, je nachdem, wer als erster auftritt. –

Antwort

2

Wenn Sie in der while-Schleife auf das Prädikat schauen, sehen Sie, dass es auf beiden ghoulHealth sowie userHealth abhängt. Innerhalb der Schleife ändern Sie niemals die Werte von beiden. Das bedeutet, dass, wenn dieses Prädikat am Anfang wahr ist, die Schleife beginnt und das Prädikat für immer wahr bleibt.

Wie in den Kommentaren auch darauf hingewiesen, scheint es aufgrund der Verwendung der Funktion FirstAtk zu sein. Sie sollten dies wie firstAtk() nennen, beachten Sie die Klammern. Und es gibt auch einige Fehler in Ihrer Logik für diese Methode. Die userHealth und ghoulHealth beginnen immer bei 100/110, so dass die Gesundheit nie tief genug fällt, um das Prädikat falsch zu machen.

+2

FirstAtk leitet immer Schaden von 100 oder 110 ab. Wenn also der Angriffsschaden geringer ist, wird die Schleife niemals enden. – Shark

+0

@Shark in der Tat änderte ich meine Antwort, um das zu enthalten :-) –

0

Grundsätzlich rufen Sie firstAtk ohne Klammer und so weiter meleeChoice später. Sie tun nichts damit, nur den Verweis auf void zu schieben.

1

Für Ihre firstAtk-Funktion sind die Integritätspunkte beider Zeichen fest codiert, sodass die aktuelle Iteration keine Auswirkung auf die zukünftige Iteration hat. Vielleicht möchten Sie ersetzen:

userHealth = 110 - ghoulTotalDmg; 

und

ghoulHealth = 100 - userTotalDmg; 

mit

userHealth = userHealth - ghoulTotalDmg; 

und

ghoulHealth = ghoulHealth - userTotalDmg; 
1

Ich bemerkte, dass Firststrike nicht definiert in und LeeChoice nicht über ein Semikolon am Ende der Linie. Diese Elemente würden keine Endlosschleife verursachen. Ich bin neu beim Posten von Antworten und ich hoffe, dass mein Kommentar hilfreich ist.

Verwandte Themen