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

[Dúvida] Novo Jogo não funciona - Erro console Uncaught ReferenceError: limparCampo is not defined

Bom dia pessoal!

Quando eu clico no botão "Novo Jogo" aparece o seguinte erro no console e a função reiniciarJogo(); não é executada. Já tem umas 2 horas que eu to tentando encontrar o erro porém até agora nada.

Segue como está o meu HTML e JS caso alguém queira da uma olhada pra me ajudar :) Agradeço desde já!

<!DOCTYPE html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://code.responsivevoice.org/responsivevoice.js"></script>
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Chakra+Petch:wght@700&family=Inter:wght@400;700&display=swap"
        rel="stylesheet">
    <link rel="stylesheet" href="style.css">
    <title>JS Game</title>
</head>

<body>

    <div class="container">
        <div class="container__conteudo">
            <div class="container__informacoes">
                <div class="container__texto">
                    <h1></h1>
                    <p class="texto__paragrafo"></p>
                </div>
                <input type="number" min="1" max="10" class="container__input">
                <div class="chute container__botoes">
                    <button onclick="verificarChute()" class="container__botao">Chutar</button>
                    <button onclick="reiniciarJogo()" id="reiniciar" class="container__botao" disabled>Novo jogo</button>
                </div>
            </div>
            <img src="./img/ia.png" alt="Uma pessoa olhando para a esquerda" class="container__imagem-pessoa" />
        </div>
    </div>




    <script src="app.js" defer></script>
</body>

</html>
//let titulo = document.querySelector("h1");
//titulo.innerHTML = "Jogo do numero secreto";

//let paragrafo = document.querySelector("p");
//paragrafo.innerHTML = "Escolha um númer entre 1 e 10";

let numeroSecreto = gerarNumeroAleatorio();
console.log(numeroSecreto);
let tentativas = 1;

function exibirTextoNaTela(tag, texto) {
  //Aqui temos uma função que exibe coisas e que possui parametros, o primeiro é a tag HTML que queremos exibir e o segundo é o texto que queremos exibir.
  //A função recebe esses parametros e executa uma ação, que é exibir o texto
  let campo = document.querySelector(tag);
  campo.innerHTML = texto;
}

exibirTextoNaTela("h1", "Jogo do numero secreto");
exibirTextoNaTela("p", "Escolha um número entre 1 e 10");

function gerarNumeroAleatorio() {
  // Aqui temos uma função que não tem paramentro, porem tem um retorno, o retorno é a geração de um número aleatório entre 1 e 10.
  return parseInt(Math.random() * 10 + 1);
}

// function verificarChute() {
// Aqui temos uma função que não tem paramentro e não tem retorno, mas executa uma ação, a ação de verificar o chute do usuário no console.
//   console.log("O botao esta sendo clicado!");
// }

function verificarChute() {
  //Aqui temos uma função que não tem paramentro e não tem retorno, mas executa uma ação, a ação de verificar o chute do usuário no console.
  let chute = document.querySelector("input").value;
  // console.log(chute == numeroSecreto);
  if (chute == numeroSecreto) {
    let palavraTentativa = tentativas > 1 ? "tentativas" : "tentativa";
    let mensagemTentativas = `Você acertou o número secreto com ${tentativas} ${palavraTentativa} parabéns!`;
    exibirTextoNaTela("h1", "Você acertou!");
    // exibirTextoNaTela("p", "Você descobriu o numero secreto, parabéns!");
    exibirTextoNaTela("p", mensagemTentativas);
    document.getElementById("reiniciar").removeAttribute("disabled");
  } else {
    if (chute > numeroSecreto) {
      exibirTextoNaTela("p", "O número secreto é menor!");
    } else {
      exibirTextoNaTela("p", "O número secreto é maior!");
    }
    tentativas++;
    limparCampo();
  }

  function limparCampo() {
    chute = document.querySelector("input");
    chute.value = "";
  }
}
function reiniciarJogo() {
  numeroSecreto = gerarNumeroAleatorio();
  limparCampo();
  tentativas = 1;
  exibirTextoNaTela("h1", "Jogo do numero secreto");
  exibirTextoNaTela("p", "Escolha um número entre 1 e 10");
}

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
2 respostas
solução!

Boa tarde, Alexandra!

O erro apresentado é mais simples do que parece mas requer atenção. O erro diz que a função "limparCampo" não foi definida, ela é utilizada na linha 59 dentro da função "reiniciarJogo".

O que acontece é que a função "limparCampo" foi declarada dentro da função "verificarChute" (está dentro das chaves da função) e por conta disso ela só faz parte desse escopo.

Como a função reiniciarJogo não está no mesmo escopo, ele não reconhece que existe a função limparCampo. Para arrumar isso basta declarar a função "limparCampo" no escopo mais alto, que seria o mesmo escopo de verificarChute e reiniciarJogo, dessa forma ela pode ser invocada dentro dessas funções.

Quando uma função for utilizada em múltiplos lugares, o ideal é que ela seja declarada antes dos locais que será utilizada e em um escopo compartilhado com esses outros locais.

Tente o seguinte:

//... início do código

// função declarada no escopo superior
function limparCampo() {
  chute = document.querySelector("input");
  chute.value = "";
}

function verificarChute() {
  //Aqui temos uma função que não tem paramentro e não tem retorno, mas executa uma ação, a ação de verificar o chute do usuário no console.
  let chute = document.querySelector("input").value;
  // console.log(chute == numeroSecreto);
  if (chute == numeroSecreto) {
    let palavraTentativa = tentativas > 1 ? "tentativas" : "tentativa";
    let mensagemTentativas = `Você acertou o número secreto com ${tentativas} ${palavraTentativa} parabéns!`;
    exibirTextoNaTela("h1", "Você acertou!");
    // exibirTextoNaTela("p", "Você descobriu o numero secreto, parabéns!");
    exibirTextoNaTela("p", mensagemTentativas);
    document.getElementById("reiniciar").removeAttribute("disabled");
  } else {
    if (chute > numeroSecreto) {
      exibirTextoNaTela("p", "O número secreto é menor!");
    } else {
      exibirTextoNaTela("p", "O número secreto é maior!");
    }
    tentativas++;
    limparCampo();
  }
}

function reiniciarJogo() {
  numeroSecreto = gerarNumeroAleatorio();
  limparCampo();
  tentativas = 1;
  exibirTextoNaTela("h1", "Jogo do numero secreto");
  exibirTextoNaTela("p", "Escolha um número entre 1 e 10");
}

Boa tarde Rodrigo! Muito obrigada pela sua ajuda, mudei o local e agora está funcionando corretamente!

Pra quem é novata em programação, é complicado de seguir o passo a passo, e dar esse tipo de erro. Coloquei aqui uns prints dos momentos em que eles implementam a função limparCampo(); e ela não é colocada antes de ser utilizada na video aula.

Por que para os professores, colocar no final funciona e pra mim não funcionou?

Na aula 4 (que é onde eles falam da função de limpar o campo) eles colocam a função** limparCampo();** (antes de implementa-la) dentro da função verificarChute() - segue abaixo um print desse momento da aula 4.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Depois, na mesma aula, eles começam a implementar a função **limparCampo() **fora da função **verificarChute **(isso está em 01:08 da aula 4)

Insira aqui a descrição dessa imagem para ajudar na acessibilidade
Na aula 05, a função limparCampo(); ainda está dentro do else na função verificarChute(); e já temos a função limparCampo(); implementada.

Até o final da aula 05 eles mantiveram a função limparCampo() la embaixo, e acabei somente seguindo o passo a passo deles.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Acho que seria importante eles revisarem isso, pois muita gente está tendo esse mesmo problema no chat.
De qualquer forma muito obrigada!