1
resposta

Var achou e var numeroAleatorio fora do while

Meu código não estava funcionando, e eu não sabio o motivo. Então quando coloquei as variações achou e numeroAleatorio dentro do while funcionou.

Pode me explicar o motivo?

<meta charset="UTF-8">

<input/>
<button> Verifique aqui</button>

<script>

function sorteia(){

return Math.round(Math.random() * 10)
}

function sorteiaNumeros (quantidade){

    var segredos = []
    var contador = 1
    var numeroAleatorio = sorteia() // Quando coloquei dentro do while funcionou.
    var achou = false // // Quando coloquei dentro do while funcionou.

    while(contador<=quantidade){



    for(posicao=0;posicao<segredos.length;posicao++){
        if(numeroAleatorio==segredos[posicao]){
            achou = true
              break;
        }    
    }



    if(achou==false){
    segredos.push(numeroAleatorio)
    contador++
    }
  }
    return segredos    
}



var segredos = sorteiaNumeros(3)
console.log(segredos)

var input = document.querySelector("input")
    input.focus()

 function verifica(){

     var achou = false

     for(posicao = 0;posicao<segredos.length;posicao++){

     if(input.value==segredos[posicao]){

         alert("ACERTOU")
         achou = true
         break;
         }
       }
         if(achou==false){
         alert(" ERROU")
        }

         input.focus()
         input.value = ""
    }



var button = document.querySelector("button")
button.onclick = verifica

</script>
1 resposta

Opa Thales, tudo certo?

Para que você tenha uma lista de números sorteados, é necessário que você chame a função sorteia() a cada vez que o laço de repetição ocorra. Se a função sorteia() for chamada apenas no começo da função, você só terá um número sorteado.

Vou deixar aqui algumas dicas que podem te ajudar na solução desse problema e que também vão servir para situações futuras quando estiver desenvolvendo outros códigos:

Enquanto escrevemos um código, temos que pensar que iremos esquecer a forma como um bloco de código funciona, ou teremos que explicar para um colega uma parte do projeto. Sendo assim, é uma boa ficar atento à questão da legibilidade do código. Eu já notei que você utiliza nomes muito significativos no projeto, que já é uma ótima forma de conseguir um código legível. Mas a prática que vou recomendar é ficar atento à identação dos blocos de código, ou seja:

Se você tem uma condicional dentro de um laço de repetição desse tipo

while ( x < y){
if( x.ehPar() ){
x.multiplica()
}
}

dá para notar que fica difícil de entender ao olhar rapidamente, e ficaria pior ainda para cada instrução ou bloco que adicionarmos no meio. Uma forma mais adequada seria

while ( x < y){
    if( x.ehPar() ){
        x.multiplica()
    }
}

adicionar um espaçamento padrão cada vez que entrarmos em um outro bloco de código. No final da resposta vou inserir parte do seu projeto e gostaria que você desse uma olhada. Também existem ferramentas que te ajudam com isso, recomendo buscar pelo conceito de linter.

Outra coisa: quando fazemos funções menores e que realizam menos tarefas, podemos testá-las individualmente e achar erros mais facilmente. Também é importante utilizar os parâmetros das funções para comunicar o que queremos enviar e receber de cada função. Por exemplo, no seu projeto, é utilizado a variável input dentro da função verifica(), o que não é interessante pois impede que possamos testar a função independente de outro código da página e também dificulta poder reutilizar essa função para um outro botão, por exemplo.

Mas não se preocupe, muitos desses padrões vão se tornando algo instintivo, e só conseguimos começar a perceber com facilidade praticando. Você já está num ótimo caminho, pois conseguiu comunicar muito bem qual foi o problema e seu código usava nomes que facilitavam o entendimento de qual é a sua intenção em cada trecho. Aqui vai o código que fiz com algumas alterações, eu recomendo observar as mudanças com atenção e tentar justificá-las:

<meta charset="UTF-8">

<input/>
<button> Verifique aqui</button>


<script>

function sorteia(){
    return Math.round(Math.random() * 10)
}

function sorteiaNumeros (quantidade){ 
    var segredos = []
    var contador

    for ( contador = 0 ; contador < quantidade ; contador++ ) {
        var numeroDaVez = sorteia()

        while ( segredos.includes(numeroDaVez) ) { // Cuidado pois a função sorteia() só pode retornar cerca de 10 valores diferentes
            numeroDaVez = sorteia()
        }
        segredos.push(numeroDaVez)    
    }
    return segredos    
}


function verifica(segredos, numero){
    if ( segredos.includes( Number(numero) ) ) {
        return true
    }

    else {
        return false
    }
}

var segredos = sorteiaNumeros(3)
console.log(segredos)

var input = document.querySelector("input")
input.focus()

var button = document.querySelector("button")

button.onclick = function () {
    if ( verifica(segredos, input.value) ){
        console.log("Parabéns, você acertou!");
    }
    else {
        console.log("Infelizmente, não foi dessa vez");
    }
}

</script>

Qualquer outra dúvida não hesite em perguntar aqui. Continue assim e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software