Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

Desafío + Resolviendo la Recursividad

Buenas, lo primero que hice fue manejar el máximo de intento y numero, mi idea era que modifica el html desde funciones, entonces esto fe lo que hice:
Tuve que usar algunas cosas que no vimos en el curso, ¿Por que? Me gusta estudiar y ponerme mejores desafíos, use cosas como conts, ya que lo veía algo mas fijo, y no seria correcto usar let, ya que esto se usa cuando una variable suele cambiar, y el create elements, es algo sencillo, ya habia visto algo de html, llegue un poco mas de controladores para cargar una tabla usando thymeleaf. También iba hacer lo mismo con lo de numero máximo, pero me tomaría mas tiempo, y ya me tomo tiempo estudiar esto, así que lo hice simple.

let numeromax=Number (prompt(`Ingrese maximo número`));
//1let numeromax=Number (0);
let listaNumerosSorteado = [];
let nrosecreto= 0;
let cont = Number (1);
let max_intento = Number (0);


function establecer_juego() {
    AsignatTextoElemento('p', 'Indica maximo de intento');

    const valorUsuario = parseInt(document.getElementById('Usuario').value);
    if (valorUsuario > 0) {
        nrosecreto=generarNumeroSecreto();
        console.log (nrosecreto);
        max_intento = valorUsuario;
        AsignatTextoElemento('p', `Indica un número del 1 al ${numeromax}.  ${cont}/${max_intento}`);
        return true;
    } else {
        AsignatTextoElemento('p', 'Por favor, ingresa un número mayor que 0');
        return false;
    }
};


function inicio() {
    const juegoValido = establecer_juego();

    if (!juegoValido) return; // Si no se ingresó bien, no continúa

    const contenedorBotones = document.querySelector('.chute');
    document.getElementById('btn_confirmar_intento').remove();

    const btnIntentar = document.createElement('button');
    btnIntentar.textContent = 'Intentar';
    btnIntentar.classList.add('container__boton');
    btnIntentar.setAttribute('onclick', 'verificar_Intento();');
    btnIntentar.id = 'intentar';
    contenedorBotones.appendChild(btnIntentar);

    const btnReiniciar = document.createElement('button');
    btnReiniciar.textContent = 'Nuevo juego';
    btnReiniciar.classList.add('container__boton');
    btnReiniciar.setAttribute('onclick', 'reiniciar_juego();');
    btnReiniciar.id = 'reiniciar';
    btnReiniciar.disabled = true; // Se activará cuando se termine el juego
    contenedorBotones.appendChild(btnReiniciar);

    const btnMax = document.createElement('button');
    btnMax.textContent = 'Nuevo Maximo';
    btnMax.classList.add('container__boton');
    btnMax.setAttribute('onclick', 'NuevoMax ();');
    btnMax.id = 'maximo';
    contenedorBotones.appendChild(btnMax);
    limpiarCaja ();
    AsignatTextoElemento('h1',`Juego del numero secreto`);
};

//Funcionalidades omitidas... 
function reiniciar_juego() {
    nrosecreto= generarNumeroSecreto ();
    cont = Number (1);
    max_intento = Number (0);

    console.log (nrosecreto);

    AsignatTextoElemento('p', 'Ingresa el número máximo de intentos para comenzar');
    AsignatTextoElemento('h1', `Juego del número secreto`);
    limpiarCaja();

    const contenedorBotones = document.querySelector('.chute');

    const btnIntentar = document.getElementById('intentar');
    const btnReiniciar= document.getElementById('reiniciar');
    if (btnReiniciar) btnIntentar.remove();
    if (btnReiniciar) btnReiniciar.remove();

    contenedorBotones.innerHTML = '';

    const btnConfirmar = document.createElement('button');
    btnConfirmar.textContent = 'Confirmar intentos';
    btnConfirmar.classList.add('container__boton');
    btnConfirmar.id = 'btn_confirmar_intento';
    btnConfirmar.setAttribute('onclick', 'inicio();');
    contenedorBotones.appendChild(btnConfirmar);
};

function NuevoMax () {
    numeromax=Number (prompt(`Ingrese maximo número`));
    alert ("Se ha actualizado el maximo")
    reiniciar_juego();
};

Respecto a la recursividad lo hice asi:

//Recursividad 
function generarNumeroSecreto () {
    let nrosecreto2 = Math.floor(Math.random()*numeromax)+1;
    if (listaNumerosSorteado.length>=numeromax) {
        listaNumerosSorteado = []; 
        listaNumerosSorteado.push(nrosecreto2); 
        console.log(listaNumerosSorteado);
        return nrosecreto2
    } else {
        if (listaNumerosSorteado.includes(nrosecreto2)) {
            console.log(listaNumerosSorteado);
            return generarNumeroSecreto ();
        } else {      
            listaNumerosSorteado.push(nrosecreto2);
            console.log(listaNumerosSorteado);
            return nrosecreto2;
        }
    }
};

El mayor y igual, el motivo de esto fue porque al momento de hacer el cambio de numero max, esto generaba un bug cuando el numero max era mas grande que el largo de lista, por ejemplo: hago el cambio a 10, cuando ya la lista tengo 20, no serviría el == y generaría un bucle.

1 respuesta

Hola, Sebastián.

¡Qué bueno que te estés desafiando a ti mismo y explorando más allá del contenido del curso! Tu código muestra un enfoque interesante para manejar la recursividad y los intentos en el juego del número secreto. Veo que estás utilizando la recursividad para generar un número secreto que no se repita, lo cual es una buena práctica para este tipo de juegos.

En cuanto a tu implementación, parece que ya has considerado la condición de salida para evitar un bucle infinito, que es uno de los problemas más comunes al trabajar con recursividad. Al verificar si la lista de números sorteados ha alcanzado el tamaño máximo, te aseguras de que el juego se detenga correctamente cuando todos los números posibles han sido sorteados.

Aquí hay un par de sugerencias que podrías considerar para mejorar tu código:

  1. Mensaje de Fin del Juego: Podrías agregar un mensaje claro para el usuario cuando todos los números han sido sorteados, indicando que el juego ha terminado y que deben reiniciarlo si quieren jugar de nuevo.

  2. Optimización de la Recursividad: Aunque tu implementación actual funciona, podrías considerar optimizar la función generarNumeroSecreto para que sea más eficiente. Por ejemplo, podrías utilizar un enfoque iterativo en lugar de recursivo si el conjunto de números es grande, para evitar problemas de rendimiento.

  3. Manejo de Estados: Asegúrate de que los botones y elementos de la interfaz de usuario se actualicen adecuadamente cuando el juego termina, para mejorar la experiencia del usuario.

  4. Pruebas Extensas: Realiza pruebas con diferentes valores de numeromax para asegurarte de que tu lógica funciona en todos los casos posibles.

Espero que estas sugerencias te sean útiles y te ayuden a seguir mejorando tu proyecto. ¡Sigue explorando y aprendiendo!

Espero haber ayudado y buenos estudios!