1
resposta

Erro no While

Boa tarde!

Me encontro com um problema o qual não estou conseguindo resolver. Comecei importando a biblioteca dos booleanos para utilizar como controlador para o acerto ou não, critério do while.

Porém, ao utilizar o booleano ou, também, o int 0 ou 1 para não acerto/acerto, o programa apenas executa 1 vez e sai do loop.

Segue abaixo o meu código, caso alguém se disponha a solucionar:

#include <stdio.h>

int main() { // Imprimindo o cabecalho do jogo printf("****\n"); printf("* Bem-vindo ao jogo da adivinhacao \n"); printf("***\n");

int numerosecreto = 42;
int chute;
int pontuacao = 1000;
int adivinhou = 0;
int tentativa = 1;

// Tentativas até zerar a pontuação do jogo.

while (adivinhou == 0)
{
    printf("Tentativa %d: Digite um numero: ", tentativa);
    scanf("%d", &chute);

    if (chute == numerosecreto)
    {
        printf("O numero %d eh o número secreto! Parabéns!\n", chute);
        printf("Você fez %d pontos e acertou na %da tentativa.", pontuacao, tentativa);
        adivinhou = 1;
        printf("%d", tentativa);

        printf("Aperte qualquer botao para encerrar");
        getchar();
    }
    else
    {
        if (chute > numerosecreto)
        {
            printf("O numero %d eh maior que o numero secreto... Tente novamente:\n", chute);
            pontuacao -= 100;
            tentativa++;
        }
        else
        {
            printf("O numero %d eh menor que o numero secreto... Tente novamente:\n", chute);
            pontuacao -= 100;
            tentativa++;
        }
    }

    if (pontuacao == 0)
        printf("Você perdeu o jogo...");
    break;
}

}

1 resposta

Boa noite Gabriel. Analisei o seu código e achei um erro e um possível bug. O erro do loop esta no break, ele tem que estar dentro do if, pois, se ele estiver fora, como na sua situação, ele encerra o loop. O possível potencial de bug é getchar, muita das vezes ele reconhece lixo do teclado, sendo assim, é aconselhado a limpar o teclado antes de utilizar esse comando. O comando de limpar o teclado é: setbuf(stdin, NULL);. Lembre-se das bibliotecas para funcionar. Segue abaixo, o código corrigido, qualquer duvida mande mensagem.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{ 
    printf("****\n"); 
    printf("* Bem-vindo ao jogo da adivinhacao \n"); 
    printf("***\n");


    int numerosecreto = 42;
    int chute;
    int pontuacao = 1000;
    int adivinhou = 1;
    int tentativa = 1;

    while(adivinhou){

        printf("Tentativa %d: Digite um numero: ", tentativa);
        scanf("%d", &chute);

        if(chute == numerosecreto){
            printf("O numero %d eh o número secreto! Parabéns!\n", chute);
            printf("Você fez %d pontos e acertou na %da tentativa.", pontuacao, tentativa);
            adivinhou = 0;
            printf("Aperte enter para encerrar");
            setbuf(stdin, NULL); //serve para limpar o teclado, sem ele o getchar cosuma bugar
            getchar();
        }
        else{

            if (chute > numerosecreto)
            {
                printf("O numero %d eh maior que o numero secreto... Tente novamente:\n", chute);
                pontuacao -= 100;
                tentativa++;
            }
            else{
                printf("O numero %d eh menor que o numero secreto... Tente novamente:\n", chute);
                pontuacao -= 100;
                tentativa++;
            }

        }

        if (pontuacao == 0){
            printf("Você perdeu o jogo...");
            break;
        }

        }

    return 0;
}