4
respostas

Problemas com o desenvolvimento do joguinho de adivinha

Bom dia pessoal, tentei criar um joguinho de adivinha misturando um pouco de tudo que foi visto no curso. A ideia é que ele tenha 1 número secreto, dê 3 tentativas e ao invés de Prompt, use um botão, mas surgiu alguns problemas e dúvidas:

Sei que aqui não aparece os números das linhas, mas vou colocar aqui caso alguém queira abrir no Sublime, pode ser que ajude a guiar ;)

1- Na linha 34, criei uma variável com números que deveriam ser desconsiderados, apliquei na linha 36, mas queria entender por que não funcionou, 0 e 10 continuam aparecendo.

2- Queria saber se é possível quando a pessoa acerta o número secreto, a pagina gerar automaticamente outro número, sem a necessidade do usuário ter que recarrega-la. Tentei na linha 79 com o "return sorteiaNumero;" mas pelo visto não é assim que funciona.

3- Estou tendo dificuldades com o incremento de tentativas, o programa não da chances de o usuário tentar novamente; Eu queria uma forma de mostrar o número de tentativas para o usuário, por isso coloquei tentativas na decrescente; Queria que a fosse executada a pagina da linha 87, quando o número de tentativas acabar.

<meta charset="utf-8">

<h1><big> Primeiro Joguinho 4!!!! </big></h1><br><br>

<h3><big>Este jogo continua sendo de adivinha!</big></h3><br>


<input/>
<button> Tente acertar o número secreto! </button>

<script>

    function mostra(frase){

        document.write(frase + "<br>");
    }

    function sorteia(){

        var multiplicador = 10;
        return Math.round(Math.random() * multiplicador);
    }

    function sorteiaNumero(quantidade){

        var segredo = [];

        var numero = 1; 

        while(numero <= quantidade){

            var numeroAleatorio = sorteia();

            var desconcinderar = [0,10];

            if (numeroAleatorio !== desconcinderar){

                var achou = false;

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

                    if (segredo[posicao] == numeroAleatorio){

                        achou = true;
                        break;
                    }
                }

                if(achou == false){

                    segredo.push(numeroAleatorio);
                    numero++;
                }
            } 
        }

        return segredo;
    }

    function verifica(){

        var achou = false;

        var tentativas = 3;

        while(tentativas > 0){

            for(var i = 0; i < segredo.length; i++){

                if(segredo[i] == input.value){

                    achou = true;
                    break;
                }
            }    
                if(achou == true){

                    alert("Parabéns você acertou o número secreto!");
                    return sorteiaNumero;
                    break;
                }else{

                    alert("Errou! Você ainda tem " + tentativas + " tentativas.");

                }

                if(tentativas == 1){

                alert("O jogo acabou!");
                mostra("Por favor aperte F5 para recomeçar");
            }

            tentativas--;
        }

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

    var segredo = sorteiaNumero(1); 

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

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

    console.log(segredo);

    if (segredo.length > 1){

        mostra("<h5>Dica: São " + segredo.length + " números de 1 a 9." + "</h5>");
    }else{

        mostra("<h5>Dica: É um "+ segredo.length + " número de 1 a 9.</h5>");
    }


</script>

Agradeço a todos que poderem me ajudar.

4 respostas

Oi Heitor, tudo bom?

Então, respondendo algumas das suas perguntas: 1 - os números 0 e 10 continuam aparecendo porque a sua verificação está errada. Na linha 36 você faz a verificação (numeroAleatorio !== desconcinderar) acontece que desconsiderar é um array e não um número.

Ou seja, esse ifsempre irá passar pois qualquer número vai ser diferente de um array.

2 - Para gerar um novo número você não precisa utilizar o return só precisa chamar a função sorteiaNumero() utilizando parênteses e não o return.

O comando returno serve para devolver um valor para quem quer que tenha chamado essa função. Com isso podemos salvar o valor retornado em uma variável ou utilizar como parâmetro de outra função.

3- O problema aqui é o while na linha 66. O comando while vai executar 3 vezes seguidas. O que você quer fazer é verificar o número apenas quando clicamos no botão. Como você quer dar 3 tentativas para o jogador, você precisa deixar a variável tentativas como global e não local.

Assim cada vez que a função verifica for chamada você verifica a quantidade de tentativas restantes e se esse número for maior que 0 você diminui uma tentativa e faz a verificação do número escolhido.

Duvida, por que você está utilizando um array para o número sorteado? A ideia é sortear apenas um número ou vários

Opa Ricardo, obrigado por me ajudar! Respondendo sua pergunta, eu usei o array, pois me baseei no código do prof. Flávio Almeida, na aula 9 do curso, e acabei nem percebendo, mas teria algum problema se eu deixar o array? Acho que facilitaria caso eu queira adaptar o jogo para sortear mais de um número. E ainda estou com algumas dúvidas sobre o código:

1- Então a única forma de desconsiderar o 0 e 10, é sendo dessa forma:

f (numeroAleatorio !== 0 && numeroAleatorio !== 10){

certo?

2- Você pode me dar um exemplo? Pois tentei aqui de tudo que é forma, e ainda tenho que recarregar a página para gerar um novo número.

3- Ainda estou com dificuldade, fiz dessa forma, mas não deu certo:

var tentativas = 3;

    function verifica(){

        var achou = false;

        while(tentativas > 0){

            for(var i = 0; i < segredo.length; i++){

                if(segredo[i] == input.value){

                    achou = true;
                    break;
                }
            }    
                if(achou == true){

                    alert("Parabéns você acertou o número secreto!");
                    break;
                }else{

                    alert("Errou! Você ainda tem " + tentativas + " tentativas.");

                }

                if(tentativas == 1){

                alert("O jogo acabou!");
                mostra("Por favor aperte F5 para recomeçar");
            }

            tentativas--;
        }

Então Heitor, não tem problema você deixar o código utilizando o array. Mas como você não está utilizando ele de fato, só está usando o primeiro elemento, eu trocaria para uma variável int para deixar o código mais simples.

Com relação as suas duvidas:

1- Não, você pode utilizar o array, mas ai invés de fazer a verificação de um número inteiro com um array vc tem que fazer a verificação para cada número dentro desse array.

Ficaria algo do tipo


let desconcinderar = [0,10];
let valido;
while(valido  == false){ //enquanto não for valido
    let numeroAleatorio = sorteia(); //sorteia número
    valido = true; // a principio todo número sorteado é válido 
    for(let i=0 ; i<desconsiderar.Lenght ; i++){ //para cada elemento do array
        if (numeroAleatorio == desconcinderar[i]){ //esse elemento é igual ao número sorteado?
            valido = false; //se for eu não tenho um número válido e preciso sortear novamente
            break;
        }
    }
}

2- Para sortear o número e reiniciar o jogo, vc precisa voltar tudo para o estado inicial. Sortear um novo número e recomeçar a contar as tentativas

function reiniciar(){
    tentativa = 3;
    sorteiaNumero();
}

function verifica(){
    ...
    if(acertou || naoTemTentativas){
        reiniciar();
    }
}

3 - Você não pode ter o while. Lembre-se de que cada vez que você apertar o botão o método verifica vai ser chamado e você só precisa verificar o número atual uma vez e diminuir o número de tentativas em 1.

let tentativas = 3 //variável global

function verifica(){
    let achou = false;
    tentativas--;

    //se eu ainda tenho tentativas
    if(numeroAleatorio == input.value){
        alert("Parabéns você acertou o número secreto!");
        reiniciar();
    }else{
            alert("Errou! Você ainda tem " + tentativas + " tentativas.");
    }

    if(tentativas < 0){
                alert("O jogo acabou!");
        reiniciar()
    }
}

Muito bem pessoal!!