2016-11-12 7 views
2

Попытка завершить игру Hangman от JS for Kids challenge # 3. Он просит ограничить количество догадок для игрока.Hangman Game пытается ограничить количество угадок - JavaScript

Я думал, что мне нужно сбросить все догадки в новый массив, а затем завершить игру, как только новая длина массива станет больше, чем количество догадок, но не будет работать. Подсказка в книге состоит в том, чтобы использовать & &, но на самом деле не вижу, где это будет происходить с другими условиями.

Цените любые мысли о том, куда я пошел wrong-

//create an array of words 
    var words =["java","monkey","amazing","pankcake"]; 

    //pick a random words 
    var word= words[Math.floor(Math.random() * words.length)]; 

//set up the answer array 
    var answerArray=[]; 
    for(var i=0; i< word.length; i++){ 
    answerArray[i]="_"; 
    } 
    var remainingLetters=word.length; 

    //The game loop 
    while(remainingLetters >= 0) { 

    //show the player their progress 
    alert(answerArray.join(" ")); 

    //Get a guess from the player 
    var guess=prompt("guess a letter, or click cancel to stop playing"); 

    **//add guesses to an answerArray 
    var guessAll=""; 
     guessAll+=guess;** 

//convert toLowerCase 
    var guessLower=guess.toLowerCase(); 
    if(guessLower===null){ 
    break; 

    **} else if(guessAll.length >4) { 
    break;** 

} else if(guessLower.length !== 1){ 
    alert("Please pick single character"); 

    }else{ 
    //update the game state with the guess 
    for(var j=0; j<word.length; j++){ 
    if(word[j] ===guessLower){ 
     answerArray[j]= guessLower; 
     remainingLetters--; 
    } 
    } 
    } 
} 

// конец игры петля предупреждения (answerArray.join (»«)); alert («Вы хороший гейзер! Ответ был« + слово »;

+0

позволяет сказать, что слово выбрано «java». Вы только хотите дать пользователю 4 пытается угадать слово, и если пользователь не угадает его в 4 попытках, тогда просто скажите: «Мне жаль, что вы не могли догадаться о слове ??? – HenryDev

ответ

1

Ну, в вашем коде есть несколько вещей, которые можно указать, смотрите ли вы. Проверьте ниже фрагмент кода:

//The game loop 
while(remainingLetters >= 0) { 

    //show the player their progress, Get a guess from the player, etc. 

    //add guesses to an answerArray 
    var guessAll=""; 
    guessAll+=guess; 

    // all other stuff 
} 

Обратите внимание, как var guessAll=""; является внутри петля? Это означает, что при каждом взаимодействии (каждый раз, когда цикл проходит), вы используете , переопределяяguessAll как пустое, так что вы удаляете догадки, о которых вы должны были отслеживать. Теперь, если вы перемещаете эту декларацию вне цикл, как это:

// This is your answers array 
var guessAll=""; 

//The game loop 
while(remainingLetters >= 0) { 

    //show the player their progress, Get a guess from the player, etc. 

    //add guesses to an answerArray 
    guessAll+=guess; 

    // all other stuff 
} 

Теперь переменная guessAll только инициализирован один раз. С каждым циклом новое предположение добавляется к ранее существовавшему значению, которое сохраняется между циклами, потому что вы больше не стираете его.

Я считаю, что намек использовать && (что означает, AND) будет применяться к while проверки:

while(remainingLetters >= 0 && guessAll.length < 4) { 
    ... 
} 

Таким образом, он проверяет как remaningLetters unguessed и количество догадок игрок пытался. Оба условия должны быть верны: количество оставшихся неоткрытых букв должно быть больше или равно нулю И игрок должен был пробовать менее четырех раз. Это также приводит к тому, что эта проверка else if(guessAll.length > 4) break; не нужна, потому что цикл будет прерван при достижении предела.

Однако, поскольку у вас есть более длинные слова («удивительные», «обезьяна»), игрок никогда не сможет завершить слово только в 4 попытках, поэтому этот лимит должен быть поднят. Очень хорошая практика превращения его в параметр, как это:

var maximumTries = 10; 

(...) 

while (remainingLetters >= 0 && guessAll.length < maximumTries) { 
... 

Это улучшает читаемость кода, и это намного проще в обслуживании. Предположим, что позже вы обнаружите, что 10 попыток слишком сложны, и вы хотите сделать это 15: вам просто нужно будет изменить значение в первой строке вашего кода, без необходимости погружаться в логику программирования и точно анализировать, где вы должны изменить внутри цикла, тестирование на последствия и т.д. Так что мой Рекомендованное исправление для вашего кода:

// set the maximum number of tries 
var maximumTries = 10; 

// create an array of words 
var words =["java","monkey","amazing","pancake"]; 

// pick a random word 
var word = words[Math.floor(Math.random() * words.length)]; 

// set up the answer array 
var answerArray=[]; 
for(var i=0; i< word.length; i++){ 
    answerArray[i]="_"; 
} 
var remainingLetters=word.length; 

// this will hold all the letters tried 
var guessAll=""; 

// The game loop 
while(remainingLetters >= 0 && guessAll.length < maximumTries) { 

    // show the player their progress 
    alert(answerArray.join(" ")); 

    // Get a guess from the player 
    var guess = prompt("guess a letter, or click cancel to stop playing."); 

    // add guesses to an answerArray 
    guessAll += guess; 

    //convert toLowerCase 
    var guessLower = guess.toLowerCase(); 
    if (guessLower === null) { 
     break; 
    } else if(guessLower.length !== 1){ 
     alert("Please pick single character"); 
    } else { 

     //update the game state with the guess 
     for(var j=0; j<word.length; j++){ 
      if(word[j] === guessLower){ 
       answerArray[j] = guessLower; 
       remainingLetters--; 
      } 
     } 
    } 
} 

Вы можете увидеть его в действии на JS Fiddle. Имейте в виду, что в программировании почти всегда существует более одного способа достижения одного и того же результата, это лишь один из них.