Ore Droids
Ore Droids

Reputation: 53

Why does my program skip the game part?

i wrote a very basic hangman game but it skips the actual hangman part. It will show the alert for how long the word is you press ok then it show the finish message no game part and i can't find out why please tell me what is wrong Hangman

<body>
    <h1>Hangman!</h1>


    <script>
    var words = [
        "javascript",
        "monkey",
        "amazing",
        "pancake",
      ];
      var word = words[Math.floor(Math.random() * words.length)];
      var answerArray = [];
      for (var i = 0; i < word.length; i++) {
        answerArray[i] = "_"
      }

      var remainingLetters = word.length

      while (remainingLetters < 0) {

      alert(answerArray.join(" "));

      var guess = prompt("Guess a letter, or click Cancel to stop playing>");
      if (guess === null) {
            break;
      } else if (guess.length !== 1) {
      alert("Please enter a single letter.");    
      } else {
            //update the game state with a guess
      for (var j = 0; j < word.length; j++) {
        if (word[j] === guess) { 
          answerArray[j] = guess;
          remainingLetters--;
         } 
        }
       }
      }
      alert(answerArray.join(" "));
      alert("Good Job! The answer was " + word);
    </script>
</body>
</html>

Upvotes: 0

Views: 148

Answers (1)

blex
blex

Reputation: 25659

while (remainingLetters < 0) { should be while (remainingLetters > 0) {.

Also, as Pluto mentioned it (good catch!), you can cheat by entering the same letter over and over. To solve that, you could store the guessed letters in a string and check if it was guessed before (and not increment the score).

Another adjustment, if the user hits cancel (wants to quit), I added an if statement at the end so that no more alerts are displayed.

var words = ["javascript", "monkey", "amazing", "pancake"];
var word = words[Math.floor(Math.random() * words.length)];
var answerArray = [];
// Storing the letters already guessed
var guessedLetters = "";
for (var i = 0; i < word.length; i++) {
    answerArray[i] = "_"
}

var remainingLetters = word.length;

while (remainingLetters > 0) {

    alert(answerArray.join(" "));

    var guess = prompt("Guess a letter, or click Cancel to stop playing>");
    if (guess === null) {
        break;
    } else if (guess.length !== 1) {
        alert("Please enter a single letter.");
    } else {
        // if the letter was already guessed
        if (guessedLetters.indexOf(guess) > -1) {
            // skip
            continue;
        }
        //update the game state with a guess
        for (var j = 0; j < word.length; j++) {
            if (word[j] === guess) {
                answerArray[j] = guess;
                // add the letter to the guessed letters
                guessedLetters += guess;
                remainingLetters--;
            }
        }
    }
}
// if there are no remaining letters (if the user cancelled,
// no need to show these).
if( !remainingLetters) {
    alert(answerArray.join(" "));
    alert("Good Job! The answer was " + word);
}

JS Fiddle Demo

Upvotes: 1

Related Questions