Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Não entendo o que há de errado com meu código.

Fui explorar um pouco e quando eu carrego a página já aparece direto que "Cliquei no botao!" e que "Você perdeu". Por favor, me ajudem.

'''

'''

7 respostas
<meta charset="UTF-8">

<input type="text" id="numero" />
<input type="submit" id="adivinhar" value="Compare com o meu segredo!"/>

<script>

var checarNumero = function(){
    alert("Cliquei no botao!")
    var numero = document.getElementById("numero").value;
    for(var i =0; i < segredos.length; i++){
        if (parseInt(numero.value) == segredos[0]){
            alert("Você acertou, parabéns!")
        };
    };
    alert("Você perdeu")
};

var segredos = [10,23,45,67,85]

var botao = document.getElementById("adivinhar");
botao.onclick = checarNumero();

</script>

Olá Marcus, identifiquei alguns erros no seu código, corrigi o código e fiz alguns comentários explicando mais ou menos o porque de cada erro. Espero ter ajudado.

<meta charset="UTF-8">

<input type="text" id="numero" />
<input type="submit" id="adivinhar" value="Compare com o meu segredo!"/>

<script>

// O array precisa ser declarado antes de vc chama-lo na função.
var segredos = [10,23,45,67,85]; 

/*Essa variável fica fora da função, e não precisa de ".value" aqui,
pelo menos não neste caso. */
var numero = document.getElementById("numero");

/*foi necessario criar essa variavel para tirar os "alerts" de dentro do 
loop, corrigindo assim o problema de repetição involuntária das mensagens*/
var check = false;

var checarNumero = function(){

    for(var i =0; i < segredos.length; i++){
        /*O array segredos precisa ser declarado aqui na posição [i]
        isso indica que vc esta pedindo verificação em todas as posições do
        array. Se vc colocar segredos [0], vai estar solicitando verificação
        apenas na posição 0 do array, ou seja, o programa compararia o
        numero inserido pelo usuario apenas com o primeiro numero do array 
        */
        if (segredos[i] == numero.value){
            check = true;

        } 
    }

    if(check == true){
        alert("Parabéns! Você ganhou.")
    } else{
          alert("Você perdeu");
          } 

}


var botao = document.getElementById("adivinhar");
botao.onclick = checarNumero; // Nao se utiliza parenteses nesse caso, apenas quando for chamar a função.

</script>

Eu já havia conseguido fazer. A minha dúvida é mais pq isso não funciona e não de que outra forma eu poderia fazer para funcionar. De qualquer forma Livia. Muito obrigado, suas respostas foram muito bem elaboradas.

Bom, minhas reais dúvidas então seriam: Eu realmente declarei o array depois da chamada da função? Porque foi necessário tirar o alert("acertou") de dentro do loop? Por que o programa executa a função antes de eu clicar o botão?

Eu entendo o pq da função já dizer que eu errei. Isso ocorria pq a função checarNumero() era executada antes de o usuário digitar e ser atribuído um valor pra o input do tipo "text".

Ok, vamos por partes:

  1. quanto ao lance de declarar o array, eu consultei meu marido (que já trabalha com programação a tempos) e ele me esclareceu que na vdd, o importante é declara-lo antes de chamar a função...e, como vc só chama a função de fato na última linha, então está tudo certo, desculpe pela confusão, rs.

    1. Bom, eu tirei o alert ("acertou") de dentro do "loop" pelo seguinte motivo: para que essa lógica dê certo, é necessário que as mensagens de acerto (alert "acertou") e erro (alert "errou) sejam vinculadas a suas respectivas condições de execução, ou seja, quando vc fez o if (segredos[i] == numero.value), vc estabeleceu que, quando essa condição fosse verdadeira, o alert ("acertou") deveria ser executado. Para vincluar a mensagem de erro a uma condição usamos o else, que faria o programa executar o alert("errou") sempre que a condição do if fosse falsa. Até ai tudo bem, o problema, é que, se vc colocar o else dentro do loop junto com o if, o programa gera um erro, eu não sei dizer pq isso acontece exatamente (depois faz o teste para vc ver). Por isso tirei o alert ("acertou") do loop, pq esse if que executa o alert ("acertou") precisa estar junto do else que executa o alert ("errou") para que a coisa toda funcione corretamente. Ai usei a estratégia da variável "check" para vinclular o if e o else de baixo com o if (segredos[i] == numero.value), que por sua vez precisa estar dentro do loop.

    2. quanto ao lance de a função já dizer que vc errou de primeira, não sei se a minha resposta é a melhor, mas acredito que o seu problema na vdd ocorreu porque vc colocou o "alert", que indicava o resultado negativo, dentro da função mas solto, ou seja, analisando seu código, o que aconteceria quando vc chamasse a função? Primeiro o código ia entrar no "loop" verificando a se a condição do "if" é verdadeira...se fosse verdadeira, o bloco de código do "if" seria executado, e o alert ("Vc perdeu") também seria executado, pq vc não estabeleceu nenhuma condição para a execução dele, logo o programa não tem um parâmetro de para saber quando deve ou não utiliza-lo, sendo assim, ele seria executado todas as vezes que a função fosse chamada, já que ele pertence a função, mas não há condição para a execução dele, entendeu?

solução!

Galera todo mundo devia ler essa resposta, é um erro comum e bastante interessante para se aprender...

Havia me esquecido desse tópico, já tem 2 dias que solucionei minha pergunta. Então, o problema da função está na seguinte parte:

     for(var i =0; i < segredos.length; i++){
        if (parseInt(numero.value) == segredos[0]){
            alert("Você acertou, parabéns!")
        };

Esse loop nunca será executado... Não há como comparar o "i" com o "segredos.length", pois os dois tem valor zero. Não é possível argumentar a condição do for "0 < 0". Portanto, na seguinte função se encontra a SOLUÇÃO que encontrei para esse problema:

var cliqueAdicionar = function(){
    var numDig = parseInt( document.getElementById("numero").value );
    console.log("cliquei botão adicionar!!!!");
    if(bingo.length == 0){
        bingo.push(numDig)
        alert("O primeiro número do seu bingo, " + numDig + ", foi adicionado ao bingo.")
    }else{
        var jaAdd= false
        for(i = 0; i < bingo.length; i++){
            //alert("for for");
            if(bingo[i] == numDig){
                //alert("tou dentro do if")
                jaAdd = true
                //alert("break")
                break;
            };
        };
        //alert("after for")
        if(jaAdd){
            //alert("teste if")
            alert("Este número já foi adicionado, tente outro.");
        }else{
            //alert("teste else")
            bingo.push(numDig);
            alert("O número " + numDig + " foi adicionado ao bingo.");
        };
    };
};

Obrigado pela ajuda Lívia. Espero que meus colegas também possam aprender com esse interessante erro...

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