Estoy tratando de hacer un juego de palabras en el que el usuario obtiene una cadena de 8 letras y debe formar tantas palabras como pueda con ellas. Estoy tratando de hacerlo para que solo puedan escribir las letras de la cadena de 8 letras. Tengo problemas para bloquear las letras en función de la variable, que es la cadena de 8 letras.
Aquí está mi código:
// Choosing random letters for game (3 vowels, 5 consonants) function getRandomCharsFromString(str, length) { return Array.from({ length }, () => { return str[Math.floor(Math.random() * str.length)] }); } function shuffle(str) { var a = str.split(""), n = a.length; for (var i = n - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); [a[i], a[j]] = [a[j], a[i]]; } return a.join(""); } function getRandomString() { var vowels = 'aeiou'; var consonants = 'bcdfghjklmnpqrstvwxyz'; var randomVowels = getRandomCharsFromString(vowels, 3); var randomConsonants = getRandomCharsFromString(consonants, 5); var randomWord = [...randomVowels, ...randomConsonants].join('') return shuffle(randomWord) } //Setting the letter variable to nothing var letters = ""; //Showing letters generated in the gameplay interface function newGame() { words = 0; document.querySelector('.gameplay').style.display = 'flex'; letters = getRandomString(); document.querySelector('#wordcount').innerHTML = `${words} `; document.querySelector('#gameletters').innerHTML = `${letters}`; console.log(letters); } //Preventing player from using letters that aren't in the word function keyPressed(e) { console.log(e.key); if (e.key == `${letters}`) { return true; } else { return false; } }Aquí mismo
if (e.key == `${letters}`) { Esto prueba si la tecla presionada, en e.key es igual a las letters de la cadena, que nunca será.
Hay un par de otras formas en las que podría probar.
if (letters.indexOf(e.key) > -1) { return true; } else { return false; } // or if (letters.includes(e.key)) { return true; } else { return false; }Todo lo que devuelve verdadero, de lo contrario, devuelve falso, se puede acortar para devolver simplemente los resultados de la prueba:
return (letters.includes(e.key)); Otra forma sería convertir la cadena de letras en una matriz y usar .includes() , pero en realidad solo si tiene alguna otra razón para querer una matriz.
return letters.split('').includes(e.key);La propiedad del evento key será un solo carácter/letra. Su cadena de 8 caracteres no se equiparará a solo uno. Tiene varias opciones de implementación rápida. Aquí está mi actualización sugerida, asumiendo que está adjuntando keyPressed al controlador de eventos de keypress de tecla:
function keyPressed(e) { console.log(e.key); if (letters.includes(e.key)) { return true; } else { return false; } }O, una versión un poco más comprimida:
function keyPressed(e) { return letters.includes(e.key); }