4
respostas

Porquê o WHILE não respeita a qtde máxima estipulada?

Escrevi este código para ser análogo ao do capítulo 15 "Interrompendo uma repetição", porém o WHILE não parece respeitar o parâmetro máximo de repetições - 3, exibindo SEMPRE pela 4ª vez o prompt para o usuário informar outro nº.

<meta charset="UTF-8">
<script>

    function breakLine(){
        document.write("<br>");
        document.write("<br>");
    }

    function showThis(isso){
        document.write(isso);   
        breakLine();
    }


    function sorteia(num){
        var gambling = Math.round(Math.random() * num);
        return gambling;
    }

    //var numeroPensado = Math.round(Math.random() * 100);
    var numeroPensado = sorteia(10);
    console.log(numeroPensado);

    var chute      = parseInt(prompt("Chuta aeh:"));
    var tentativas = 1;

    while (tentativas <= 3) {

        if(chute == numeroPensado) {
            showThis("WOW! You're fucking Clairvoyant...here is the number: " + numeroPensado);
            break;
            }

        else {
            showThis("Você errou a "+tentativas+"ª tentativa! Eu tinha pensado no " + numeroPensado);
            if(chute > numeroPensado) {
                showThis("Você pensou em um número MAIOR que o pensado: " + chute);
                }
            else {
                showThis("Você pensou em um número MENOR que o pensado: " + chute);
                }
            tentativas++;
            var chute = parseInt(prompt("Chuta aeh de novo:")); 
            }
    }

</script>
4 respostas

Sua duvida na verdade foi uma pequena desatenção, o código esta certo, vc que estava esperando outro resultado... Na linha 24 vc fez a chamada do prompt 1x(uma vez) , seu laço se repete 3 vezes, dentro do seu laço existe uma chamada ao prompt, sendo assim o prompt é chamado mais 3x (três vezes), totalizando assim 4x (quatro vezes)

Obrigado Pablo...

Alguma sugestão de workaround?

Valew!

Creio que um "do while" seja a solução mais fácil e correta pra vc implementar, mas nada impede vc também de colocar o prompt antes do if, logo a baixo da tag while

Boa tarde Pablo, Posicionei o PROMPT antes do IF (em um novo IF pois queria alterar o texto da pergunta caso não fosse a 1ª tentativa), e funcionou perfeitamente! Entendi que tudo que queremos repetir SOMENTE conforme a regra de controle do laço, deve ser posicionado DENTRO do mesmo. Tentar controlar de forma diferente torna bem mais difícil evitar comportamentos anômalos.

Muito obrigado pela dica!

Segue abaixo o código corrigido:

<meta charset="UTF-8">
<script>

    function breakLine(){
        document.write("<br>");
        document.write("<br>");
    }

    function showThis(isso){
        document.write(isso);   
        breakLine();
    }


    function sorteia(num){
        var gambling = Math.round(Math.random() * num);
        return gambling;
    }

    //var numeroPensado = Math.round(Math.random() * 100);
    var numeroPensado = sorteia(10);
    console.log(numeroPensado);

    //var chute      = parseInt(prompt("Chuta aeh:"));
    var tentativas = 1;

    while (tentativas <= 3) {

        if (tentativas == 1) {
            var chute = parseInt(prompt("Chuta aeh:"));
        }
        else {
            var chute = parseInt(prompt("Chuta aeh de novo:"));
        }

        if(chute == numeroPensado) {
            showThis("WOW! You're fucking Clairvoyant...here is the number: " + numeroPensado);
            break;
            }

        else {
            showThis("Você errou a "+tentativas+"ª tentativa! Eu tinha pensado no " + numeroPensado);
            if(chute > numeroPensado) {
                showThis("Você pensou em um número MAIOR que o pensado: " + chute);
                }
            else {
                showThis("Você pensou em um número MENOR que o pensado: " + chute);
                }
            tentativas++;
            //var chute = parseInt(prompt("Chuta aeh de novo:")); 
            }
    }

</script>