Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

[Proyecto] Desafio final

Hola, comparto la forma en que yo lo interprete y la parte que modifique.

desafioPrimero pensé en establecer los limites mínimos y máximos, de esta forma poder modificar el número secreto de acuerdo al gusto del usuario, posteriormente me encontré con la necesidad de modificar el número de intentos para que fueran acordes al nivel de dificultad y probándolo me di cuenta que si colocaban un número diferente a los establecidos para el nivel de dificultad me daba un error, por lo tanto coloque la alerta y de nuevo la variable numeroMax.

Quedo atenta a comentarios y sugerencias. Desde ya gracias.

2 respuestas

En la línea 4 y 20 me parece que el resultado de Math.random() solo se debe multiplicar por numeroMax ya que de lo contrario el valor máximo seria 9, 99 y 999 correspondientemente. De tal forma que quedaría como se muestra a continuación:

let numeroSecreto = Math.floor(Math.random() * numeroMax)) + 1;

Otra recomendación es que no olvides los punto y coma ; al final de los alert.

Por último, veo que vuelves a solicitar el valor si no se ingresa el número de dificultad correcto, pero solo lo haces una vez, eso lo podrías mejorar con un ciclo para obligar al usuario a ingresar un número correcto y no repetir el código de la línea 3 y 19 de tu código.

Hasta abajo pongo el código, pero para la explicación usaré la siguiente imagen (porque esta numerado).

Como podemos ver añadimos dos variables, la primera en la línea 8 que será una bandera del tipo de dato "boolean" (solo puede ser verdadera o falsa), es todo lo que necesitamos para salir del ciclo. En la línea 9 tenemos el string de dificultad que usaremos dependiendo de la palabra.

De la línea 13 a la 38 he encerrado todo en un ciclo while, ya que es lo que preguntaremos al usuario hasta que lo ingrese de forma correcta. Cada una de estas opciones cambia nuestra variable de tipo string "dificultad" y cambia la bandera booleana "banderaDificultad" a verdadero para poder salir del ciclo.

Como puedes ver en la línea 18, 24 y 30 he comentado el máximo de intentos porque ya no es necesario asignarle un valor directo (incluso se pueden borrar) gracias a la línea 39 que lo que hace es lo siguiente:

  1. Cambia numeroMax de lo que era un entero a un string por medio de la función String(numeroMax)
  2. Ya que es un string, podemos utilizar un método de los strings que hace que calculemos su tamaño, todos los datos string lo tienen y accedemos a él a través del punto (.) y en este caso el método se llama length, en otras palabras, nos devuelve el número de caracteres que tiene dicho string.
  • 10 -> tamaño 2
  • 100 -> tamaño 3
  • 1000 -> tamaño 4
  1. Finalmente se aplica una operación booleana, que pasa la unidad y lo recorre ese bit en binario a la derecha, cada recorrimiento es una potencia de 2.
BooleanoDecimal
0 00011
0 00104
0 01008
0 100010
1 000016

Igual se podría hacer con una función matemática que estuviera relacionada a numeroMax, pero esto fue lo primero que se me ocurrió, a estas operaciones les llaman "bitwise operations" u "operaciones bit a bit". Te dejo un artículo relacionado, a veces son útiles. https://www.w3schools.com/js/js_bitwise.asp

En la línea 40 se encuentra el alert que ya tenías, ahora con la dificultad y en la 41 el cálculo del numeroSecreto, que es mejor hacerlo al final debido a que al inicio no sabemos la dificultad.

Después ya seguiría tu ciclo que ya habias realizado para el juego. Espero te sirva la info y no olvides responder como resuelto si te sirvió de algo.

Mejoras de la solución propuesta

let numeroMin = 1;
let numeroMax = 0;
let numeroSecreto = 0;
let numeroUsuario = 0;
let intentos = 1;
let maximosIntentos = 0;
// Variables extras
let banderaDificultad = false;
let dificultad;

//alert(`La bandera tiene valor de ${banderaDificultad} y es ${typeof(banderaDificultad)}`);

while (banderaDificultad == false)
{
    numeroMax = parseInt(prompt("Bienvenido! Escribe el nivel de dificultad: Fácil 10, Medio 100, Difícil 1000 y adivina el número: "));
    if (numeroMax == 10)
    {
        //maximosIntentos = 4;
        dificultad = "Fácil";
        banderaDificultad = true;
    }
    else if (numeroMax == 100)
    {
        //maximosIntentos = 8;
        dificultad = "Medio";
        banderaDificultad = true;
    }
    else if (numeroMax == 1000)
    {
        //maximosIntentos = 12;
        dificultad = "Difícil";
        banderaDificultad = true;
    }
    else
    {
        alert("El número seleccionado para la dificultad, no es válido");
    }
}
maximosIntentos = 1 << String(numeroMax).length;   
alert(`Has seleccionado el nivel ${dificultad} tienes ${maximosIntentos} intentos`);
numeroSecreto = Math.floor(Math.random()*(numeroMax)) + 1;

Hola Felix, muchas gracias por tu tiempo y recomendaciones las he tomado en cuenta y las tendré en cuenta para futuros proyectos. Resuelto.