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:
- Cambia numeroMax de lo que era un entero a un string por medio de la función String(numeroMax)
- 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
- 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.
Booleano | Decimal |
---|
0 0001 | 1 |
0 0010 | 4 |
0 0100 | 8 |
0 1000 | 10 |
1 0000 | 16 |
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.
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;