5
respuestas

cuando trato de usar la recursividad el codigo me genera dos numeros

Tengo el siguiente codigo:

let listaNumerosSorteados = []; let numeroSecreto = generarNumeroSecreto(); let intentos = 1;

function asignarTextoElemento(elemento, texto) { let elementoHTML = document.querySelector(elemento); elementoHTML.innerHTML = texto; return; }

function VerificarIntento() { let numeroDeUsuario = parseInt(document.getElementById('valorUsuario').value);

if (numeroDeUsuario === numeroSecreto)
{
    asignarTextoElemento('p', `Acertaste el numero secreto en ${intentos} ${(intentos === 1) ? 'intento': 'intentos'} `);
    document.getElementById('reiniciar').removeAttribute("disabled");
} else {
    //el usuario no acerto
    if (numeroDeUsuario > numeroSecreto)
    {
        asignarTextoElemento ('p', 'El numero secreto es menor'); 
    }else { (numeroDeUsuario < numeroSecreto)
        asignarTextoElemento('p', 'El numero secreto es mayor');
    }
    intentos++;
    limpiarCaja();  
}


return;

}

function condicionesIniciales() { asignarTextoElemento('h1', 'Juego del numero secreto'); asignarTextoElemento('p', 'Elige un numero de 1 a 10'); generarNumeroSecreto(); intentos=1; }

function reiniciarJuego(){ //limpiar la caja limpiarCaja(); // indicar mensaje de intervalo de numero // generar el numero aleatorio // inicializar numero de intentos condicionesIniciales(); // deshabilitar botoon nuevo juego document.querySelector('#reiniciar').setAttribute('disabled','true');

}

function generarNumeroSecreto() {

let numeroGenerado = Math.floor(Math.random()*10)+1;
console.log(numeroGenerado);
//console.log(listaNumerosSorteados);
// si el numero generado esta incluido en la lista.
if (listaNumerosSorteados.includes(numeroGenerado))
{
    return generarNumeroSecreto();
} 
else 
{
    listaNumerosSorteados.push(numeroGenerado);
   return numeroGenerado; 
}

}

function limpiarCaja(){ document.querySelector('#valorUsuario').value = ''; }

condicionesIniciales();

pero cuando intento empezar me da dos numero en la linea de numeroGenerado y no entiendo por que.

5 respuestas

Buenas noches tu problema se debe a que inicializas el numeroSecreto y eso hace que cree un numero y luego al hacer click se crea otro.

let listaNumerosSorteados = [];
 let numeroSecreto = generarNumeroSecreto(); //Aqui es donde llamas a generarNumeroSecreto() apenas empieza el programa
 let intentos = 1;

En la segunda linea llama a la funcion generarNumeroSecreto() que hace lo siguiente:

let numeroGenerado = Math.floor(Math.random()*10)+1; //Genera un numero
console.log(numeroGenerado); //Muestra el numero en consola
if (listaNumerosSorteados.includes(numeroGenerado))
{
   return generarNumeroSecreto();
} 
else 
{
   listaNumerosSorteados.push(numeroGenerado);
  return numeroGenerado; //Devuelve el numero generado
}

Luego de que hace esto, se va a la funcion condicionesIniciales() la cual tambien llama a generarNumeroSecreto() y vuelve a repetir el proceso descrito arriba, entonces en la consola se muestran dos numeros en la lista, ya que es los que tiene.

Para solucionarlo te recomiendo incializar numeroSecreto en 0 (cero).

Espero haya podido resolver tus dudas, que tengas un buen dia :)

Hola, me pasa algo parecido, pero las primes veces que se genera el numero secreto, todo bien, pero como a la 4ta vez en la consola salen hasta 3 números, ( el último número que sale siempre es el número secreto), pero es bastante extraño. Igual me permite jugar las 10 veces pero salen muchos números en la consola. Este es mi código.

let numeroSecreto = 0; let intentos = 0; let listaNumerosSorteados = []; let numeroMaximo = 10;

function asignarTextoElemento ( elemento, texto){ let elementoHTML = document.querySelector(elemento); elementoHTML.innerHTML = texto; return; }

function verificarIntento() { let numeroDeUsuario = parseInt(document.getElementById ('valorUsuario').value);

if (numeroDeUsuario === numeroSecreto){
    asignarTextoElemento('p', `Acertaste el número en ${intentos} ${(intentos === 1)? 'vez': 'veces' }`);
    document.getElementById("reiniciar").removeAttribute('disabled');
} else {
    // El usurio no acertó
    if (numeroDeUsuario > numeroSecreto){
        asignarTextoElemento ('p', 'El número secreto es menor');
    } else {
       asignarTextoElemento ('p', 'El número secreto es mayor'); 
    }
    intentos++;
    limpiarCaja(); 
}
return;

} function limpiarCaja() { document.querySelector('#valorUsuario').value ='';

}

function generarNumeroSecreto() { let numeroGenerado = Math.floor(Math.random()*numeroMaximo)+1;

console.log(numeroGenerado); console.log(listaNumerosSorteados); // Si ya sorteamos todos los números if(listaNumerosSorteados.length == numeroMaximo) { asignarTextoElemento ('p', ' Ya se sortearon todos los números posibles'); } else {

    // Si el número generado esta en la lista 
    if (listaNumerosSorteados.includes(numeroGenerado)) {
        return generarNumeroSecreto();

    } else {
        listaNumerosSorteados.push(numeroGenerado);
        return numeroGenerado;
    } 
} 

}

function condicionesIniciales() { asignarTextoElemento('h1','Juego del número secreto'); asignarTextoElemento ('p',Indica un número del 1 al ${numeroMaximo}); numeroSecreto = generarNumeroSecreto (); intentos = 1; }

function reiniciarJuego() { //Limpiar Caja limpiarCaja(); // Indicar mensaje de intervalo de números // Generar el número aleatorio // Inicializar al número de intentos condicionesIniciales (); // Deshabilitar el boton de nuevo juego document.querySelector('#reiniciar').setAttribute('disabled','true');

}

condicionesIniciales();

Buenas tardes Arlette, lo que te esta sucediendo es que muestras las siguientes cosas en la consola:

console.log(numeroGenerado); //Primero muestras el numero generado

console.log(listaNumerosSorteados); //Muestras la lista de todos los numeros que se fueron sorteando

Esto no cambia nada en el codigo, lo que si te puede llegar a confundir a la hora de verlo en consola pero no te preocupes no perjudicas nada en tu programa, prueba borrando la segunda linea, luego la primera o viceversa. Ir probando las distintas cosas que se pueden hacer y mostrar te va a brindar un panorama general de lo que hace cada linea de codigo.

Espero haber resuelto tu duda, que tengas un buen dia.

Por cierto, con respecto a mi primer post, me equivoque al explicar la parte de que se ejecutan ambos, en realidad se ejecuta condicionesIniciales() (el cual se encuentra al ultimo del codigo del compañero) y despues cada vez que se haga click en el boton se va a ejecutar la funcion que esta relacionada a dicho boton

Recuerda que dentro de la función 'condicionesIniciales();' se llama a la función 'generarNumero()' y como javascript lee el código de arriba hacia abajo, entonces primero genera el número en tu variable 'let numeroSecreto = generarNumeroSecreto();' del principio de tu documento y se repite cuando al final del documento se llama a 'condicionesIniciales();' ese es el motivo que se repita o aparezca dos veces.

Hola, Gerardo y Maximiliano, les gradezco mucho la explicación! Ahora lo entiendo. De nuevo, muchas gracias.