Estoy atascado en cómo hacer que este bucle while funcione correctamente. Quiero que el programa pregunte al usuario "¿Piedra, papel o tijera?" a lo que pueden ingresar correctamente 'piedra', 'papel', 'tijeras' o 'bomba' (código de trucos para ganar automáticamente ... lol). Si escriben algo que no sean esas 4 entradas aceptables, debería aparecer una alerta. Luego, se les debe solicitar la misma pregunta nuevamente. Esto debería repetirse hasta que ingresen una de esas 4 entradas aceptables.
Hasta ahora, funciona si escriben su elección correctamente la primera vez que aparece el aviso. Sin embargo, si escriben algo diferente a las 4 entradas aceptables anteriores, activando la alerta y el mensaje en el ciclo while, el programa no se ejecuta correctamente incluso si ingresan una de las 4 entradas la próxima vez que se les solicite. Se atasca alternando entre la alerta y el mensaje de la eternidad.
Entonces, ¿cómo puedo hacer que este ciclo while funcione?
function playGame () { var input = prompt ('Rock, paper, or scissors?').toLowerCase(); // testing 123 // console.log (input); var jkl = 0; if (input === 'rock' || input === 'paper' || input === 'scissors' || input === 'bomb') { jkl++ }; while (jkl === 0) { alert ('ErRoR eRrOr 3rR0r!!!!11'); prompt ('Rock, paper, or scissors?').toLowerCase(); if (input === 'rock' || input === 'paper' || input === 'scissors' || input === 'bomb') { jkl++ }; } console.log (input); var userChoice = getUserChoice (input); var computerChoice = getComputerChoice (); console.log (`You: ${userChoice}`); console.log (`Computer: ${computerChoice}`); console.log (determineWinner (userChoice, computerChoice)); }; playGame ();Después del bucle while intentado, hay más código que pertenece a las funciones que aparecen anteriormente en el programa. Ignorar eso supongo. A menos que alguien crea que es relevante, en cuyo caso también puedo publicarlo. Simplemente no quería pegar un enorme muro de código aquí.
Debe actualizar la variable de input en el ciclo.
const options = ['rock', 'paper', 'scissors', 'bomb'] const getOptionPrompt = () => prompt('Rock, paper, or scissors?').toLowerCase(); const checkOption = (input, options) => options.includes(input) function playGame() { let input = getOptionPrompt(); // testing 123 // console.log (input); var jkl = 0; if (checkOption(input, options)) { jkl++ }; while (jkl === 0) { alert('ErRoR eRrOr 3rR0r!!!!11'); input = getOptionPrompt(); if (checkOption(input, options)) { jkl++ }; } console.log(input); // the functions after this are not defined in the example /* var userChoice = getUserChoice(input); var computerChoice = getComputerChoice(); console.log(`You: ${userChoice}`); console.log(`Computer: ${computerChoice}`); console.log(determineWinner(userChoice, computerChoice)); */ }; playGame();Pero definitivamente actualizaría un poco la lógica:
const options = ['rock', 'paper', 'scissors', 'bomb'] const getOptionPrompt = () => prompt('Rock, paper, or scissors?')?.toLowerCase() || null; const checkOption = (input, options) => options.includes(input) function playGame(options) { const input = getOptionPrompt(); if (!checkOption(input, options) && input != null) { alert('ErRoR eRrOr 3rR0r!!!!11'); playGame(options) } else if (input == null) { console.log("game canceled") } else { console.log("result:", input) } }; playGame(options); De esta manera, no necesita la variable jkl , no necesita el bucle while : si se escribe una respuesta que no es aceptable, aparece una alerta de error y el juego comienza de nuevo.
Puedes cambiar esta línea
prompt ('Rock, paper, or scissors?').toLowerCase();a
input = prompt ('Rock, paper, or scissors?').toLowerCase();Su código está verificando la variable de entrada sin actualizarla.