Ну, в вашем коде есть несколько вещей, которые можно указать, смотрите ли вы. Проверьте ниже фрагмент кода:
//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. Имейте в виду, что в программировании почти всегда существует более одного способа достижения одного и того же результата, это лишь один из них.
позволяет сказать, что слово выбрано «java». Вы только хотите дать пользователю 4 пытается угадать слово, и если пользователь не угадает его в 4 попытках, тогда просто скажите: «Мне жаль, что вы не могли догадаться о слове ??? – HenryDev