let lettersOfTheWord =["W",'H','A','T','E','V','E','R']; let guessedLetters = lettersOfTheWord.map(()=>'_'); var count=0; function guessLetter(letter){ for(let i=0; i<lettersOfTheWord.length;i++){ if (letter===lettersOfTheWord[i] && guessedLetters[i]==='_'){ guessedLetters[i]=letter; console.log("You entered:" + letter); console.log(`The current guessed letters: ${guessedLetters.toString()}`); console.log("Congradulations! You found a new letter."); count++; console.log(count); } if (letter!==lettersOfTheWord[i] && guessedLetters[i]!=='_'){ console.log("wrong letter"); } } if (count===lettersOfTheWord.length){ console.log("you win"); } } guessLetter("W"); guessLetter("H"); guessLetter("A"); guessLetter("T"); guessLetter("E"); guessLetter("H"); guessLetter("E"); guessLetter("R");Así que he cambiado mi código ahora. El nuevo problema es ¿qué pasa si me gustaría imprimir la información de la "letra incorrecta" si la función de llamada tiene un argumento incorrecto?
let lettersOfTheWord =['F','O','X',"X"]; let guessedLetters = []; let generateUnderScore = function(word){ for (let i =0; i<word.length; i++){ guessedLetters.push("_"); } //console.log(guessedLetters.toString()); return guessedLetters; } //to generate underscore. generateUnderScore(lettersOfTheWord); let guessLetter =function(letter){ for (let i=0; i<lettersOfTheWord.length;i++){ if (letter===lettersOfTheWord[i]){ let index=lettersOfTheWord.indexOf(letter); guessedLetters[index]=letter; console.log(guessedLetters); } } console.log("You entered:" + letter); console.log(`The current guessed letters: ${guessedLetters.toString()}`); console.log("Congradulations! You found a new letter.") } guessLetter("F"); guessLetter("O"); guessLetter("X"); guessLetter("X"); Así es como se ve mi código, para la última llamada de función guessLetter("X") , me gustaría que el resultado fuera algo como:
You entered:X The current guessed letters: F,O,X,X Congratulations! You found a new letter.Sin embargo, termina con:
You entered:X The current guessed letters: F,O,X,_ Congratulations! You found a new letter.Noté que el duplicado de la letra "X" no se reemplazó, pero ¿cómo soluciono este problema? ¡Muchas gracias!
Simplifiqué un poco tu código.
const UNKNOWN_LETTER = '_'; let lettersOfTheWord =['F','O','X',"X"]; let guessedLetters = lettersOfTheWord.map(() => UNKNOWN_LETTER); function guessLetter(letter){ lettersOfTheWord.forEach((_letter,i)=>{ if (letter===_letter && guessedLetters[i] === UNKNOWN_LETTER) { guessedLetters[i]=letter; console.log(guessedLetters); console.log("You entered:" + letter); console.log(`The current guessed letters: ${guessedLetters.toString()}`); console.log("Congradulations! You found a new letter.") } }); } guessLetter("F"); guessLetter("O"); guessLetter("X"); guessLetter("X"); El problema estaba en if debía agregar && guessedLetters[i]==='_' a su código. Y elimine let index=lettersOfTheWord.indexOf(letter); luego reemplace i en lugar de index
Además, puede usar el bucle for ... in . Para usar el descanso y omitir controles innecesarios
const UNKNOWN_LETTER = '_'; let lettersOfTheWord =['F','O','X',"X"]; let guessedLetters = lettersOfTheWord.map(() => UNKNOWN_LETTER); function guessLetter(letter){ for(const i in lettersOfTheWord){ if (letter===lettersOfTheWord[i] && guessedLetters[i]===UNKNOWN_LETTER) { guessedLetters[i]=letter; console.log(guessedLetters); console.log("You entered:" + letter); console.log(`The current guessed letters: ${guessedLetters.toString()}`); console.log("Congradulations! You found a new letter."); break; } } } guessLetter("F"); guessLetter("O"); guessLetter("X"); guessLetter("X");PUNTAS:
generateUnderScorelet . Simplemente cree el function name(..) {...} Creo que esto es más fácil de borrarTu problema:
Cuando intenta encontrar el índice de "X" de las letras de la lettersOfTheWord , siempre devolverá 2 , que es la primera aparición de "X" en lettersOfTheWord de la palabra.
Solucione su problema.
Array.prototype.indexOf() acepta fromIndex como un parámetro opcional. Puede usar el índice de la ejecución como fromIndex .
Tu violín fijo
let lettersOfTheWord = ['F', 'O', 'X', "X"]; let guessedLetters = []; let executionIndex = 0; let generateUnderScore = function (word) { for (let i = 0; i < word.length; i++) { guessedLetters.push("_"); } //console.log(guessedLetters.toString()); return guessedLetters; } //to generate underscore. generateUnderScore(lettersOfTheWord); let guessLetter = function (letter) { for (let i = 0; i < lettersOfTheWord.length; i++) { if (letter === lettersOfTheWord[i]) { let index = lettersOfTheWord.indexOf(letter, executionIndex); guessedLetters[index] = letter; // console.log(guessedLetters); } } console.log("You entered:" + letter); console.log(`The current guessed letters: ${guessedLetters.toString()}`); console.log("Congradulations! You found a new letter."); executionIndex++; } guessLetter("F"); guessLetter("O"); guessLetter("X"); guessLetter("X");Mejor solución
Puedes reescribir letras Array.map guessedLetters Para loop isirrelavent, puede usar Array.indexOf en sí mismo y puede verificar si el índice encontrado es mayor que -1, lo que significa que el elemento existe en la matriz.
violín de trabajo
let lettersOfTheWord = ['F', 'O', 'X', "X"]; let guessedLetters = lettersOfTheWord.map(item => '_'); let executionIndex = 0; let guessLetter = function (letter) { const index = lettersOfTheWord.indexOf(letter, executionIndex); index > -1 ? guessedLetters[index] = letter : {}; console.log("You entered:" + letter); console.log(`The current guessed letters: ${guessedLetters.toString()}`); console.log("Congradulations! You found a new letter."); executionIndex++; } guessLetter("F"); guessLetter("O"); guessLetter("X"); guessLetter("X");