Soy totalmente nuevo en Javascript. Acabo de aprender sobre el bucle WHILE y estoy tratando de crear un juego simple de adivinanzas de números, pero parece que no funciona. Se supone que el programa funciona así: el jugador tiene 3 intentos para adivinar el número aleatorio del 1 al 5. Si se adivina mal, una alerta da una pista de si el número es mayor o menor. Si se acierta, el programa felicita al jugador y sale del bucle. Sin embargo, la condición " ( guessCounter < 3 || +guess !== randomNumber ) " no parece funcionar. Tal vez sea otra cosa. Se agradece cualquier ayuda para entender por qué no funciona. Gracias.
// Generate random number const randomNumber = Math.floor( Math.random() * 5 ) + 1; // Ask user for guess let guess = prompt( "Guess a number between 1-5." ); // Create guessCounter let guessCounter = 1; // Allow only 3 guesses. Each wrong guess will hint if the random number is higher or lower. If guessed correctly, congratulate player and exit loop. while ( guessCounter < 3 || +guess !== randomNumber ) { if ( +guess < randomNumber ) { alert(`You did not guess correctly. The number is higher.`); guessCounter+= 1; guess = prompt("Try again."); } else if ( +guess > randomNumber ) { alert(`You did not guess correctly. The number is lower.`); guessCounter+= 1; guess = prompt("Try again."); } else { alert(`You guessed the correct number. Congrats.`); } }; // Generate random number const randomNumber = Math.floor(Math.random() * 5) + 1; // Ask user for guess let guess = prompt("Guess a number between 1-5."); // Create guessCounter let guessCounter = 1; // Allow only 3 guesses. Each wrong guess will hint if the random number is higher or lower. If guessed correctly, congratulate player and exit loop. while (guessCounter < 3) { if (guess < randomNumber) { alert(`You did not guess correctly. The number is higher.`); ++guessCounter; guess = prompt("Try again."); } else if (guess > randomNumber) { alert(`You did not guess correctly. The number is lower.`); ++guessCounter; guess = prompt("Try again."); } else { guessCounter = 3; } } if (+guess === randomNumber) alert(`You guessed the correct number. Congrats.`); else alert(`You did not guess the correct number.`);Ok, veamos cómo podemos depurar este código.
Primero, debemos deshacernos de cualquier aleatoriedad porque la depuración es mucho más fácil cuando se trata de valores predecibles o constantes:
// Generate random number const randomNumber = 4;Bien, sabemos que el número aleatorio correcto en nuestra sesión de depuración siempre será 4.
Ingresemos el número correcto en la primera ejecución:
Comportamiento observado:
You guessed the correct number. Congrats.You guessed the correct number. Congrats.Vaya, esto parece un bucle infinito. ¿Porqué es eso?
Echemos un vistazo más de cerca a la expresión que finalmente decide si el bucle continúa o no:
while ( guessCounter < 3 || +guess !== randomNumber ) {Podemos evaluar esas condiciones a mano porque sabemos:
1.) guessCounter se inicializa a 1 y
2.) guess es "4" , lo que significa +guess es 4 y randomNumber se fija en 4 .
A continuación rellenamos los valores:
while ( 1 < 3 || 4 !== 4 ) { 1 < 3 nos da true y 4 !== 4 también nos da verdadero por lo que tenemos:
while ( true || true ) {Repitiendo lo mismo para el segundo "intento":
1.) el contador de guessCounter es 2
2.) guess es "4" , lo que significa +guess es 4 y randomNumber se fija en 4 .
Nos da:
while ( 2 < 3 || 4 !== 4 ) {Lo cual es equivalente a:
while ( true || true ) {Así que ya podemos señalar que la lógica no está funcionando según nuestras expectativas.
Sabemos que el bucle no debería continuar, pero lo hace.¹
Espero que esto le brinde un punto de partida sobre cómo depurar y corregir su código.
¹ Si se pregunta si puede "romper" un bucle en ejecución, sí puede hacerlo: vea romper para eso.