1
resposta

Eu to fazendo o programa um pouco diferente, pois ja sei um pouco de C, mas aqui o codigo n ta funcionando o valor nao atualiza.

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

void clear();
int tinfinita();
int tfinita();
int pontuacao();

int nsecreto = 42;
int chute;  

int main()
{
    int opcao;
   

    do{

    printf("**********************************\n");
    printf("Bem vindo ao  jogo de adivinhacao");
    printf("\n********************************\n");
    printf("1 - Tentativas infinitas\n");
    printf("2 - Escolher numero de tentativas\n");
    printf("Escolha uma opcao: ");
    scanf("%d", &opcao);
    system("cls");

    switch(opcao)
    {
        case 1:
        {
            tinfinita();  
        }
        break;

       case 2:
       {
            tfinita();
       }
       break;

        default:{
            printf("Opcao invalida, tente novamente\n\n");  
        }   
    }
  }while(opcao != 1 && opcao != 2); 
} 

//limpeza do buffer do teclado
void clear()
{
    char carac;
    
    while((carac = fgetc(stdin)) != EOF && carac != '\n'){}
}

int tinfinita()
{
    int tentativas = 1;
   // int nsecreto = 42;
   // int chute;

     while(chute != nsecreto){

              

           printf("Digite seu chute: ");
        scanf("%d", &chute);  

            if(chute < 1){
             printf("Nao chute numeros negativos\n");
                continue;
            }
            printf("Seu chute foi %d\n\n", chute);
            pontuacao();

            if(chute == nsecreto)
                printf("Parabens, voce acertou o numero secreto!\n");
            else if(chute > nsecreto)
                printf("Seu numero foi maior que o numero secreto\n");
            else 
                printf("Seu numero foi menor que o numero secreto\n");

            if(chute == nsecreto){
                printf("Voce acertou em %d tentativa(s)\n", tentativas);
                //pontuacao();
                break;
            }
            tentativas++;
          }
    return 0;
}

int tfinita()
{
    int qtd;
    int tentativas = 1;
   // int nsecreto = 42;
    do{
            printf("Quantas tentativas voce quer (Entre 1 e 20)?\n");
            clear(); 
            scanf("%d", &qtd);

            if(qtd < 1 || qtd > 20)
            printf("Quantidade de tentativas invalidas, digite novamente\n");
            clear(); 
        }while(qtd < 1 || qtd > 20);

        do { 
        printf("\nTentativa %d de %d\n", tentativas, qtd);

        printf("Digite seu chute: ");
        scanf("%d", &chute);  
        if(chute < 1){
            printf("Nao chute numeros negativos\n");
            continue;
        }
        printf("Seu chute foi %d\n", chute);
        pontuacao();

        if(chute == nsecreto){ 
            printf("Parabens, voce acertou o numero secreto!\n");
            
            }
        else if(chute > nsecreto)
            printf("Seu numero foi maior que o numero secreto\n");
        else 
            printf("Seu numero foi menor que o numero secreto\n");
         
         tentativas++;

        if(tentativas > qtd && chute != nsecreto)
          printf("Fim de jogo, acabaram suas tentativas\n\n");

        }while(tentativas <= qtd && chute != nsecreto);
    return 0;
} 

int pontuacao()
{
    int pontos = 1000;
    int pontosperdidos; 
    //int nsecreto = 42;

    pontosperdidos = (chute - nsecreto) / 2;
    pontos = pontos - pontosperdidos;

    printf("Total de pontos %d\n", pontos);

    return 0;
}
1 resposta

Olá, segue a refatoração do código:

Main

  • Reduzi o laço de repetição "do while()", agora ele se limita apenas em escolher se o jogo vai ser "tentativas limitadas" ou "infinitas".

funções

  • não há mais duas funções, apenas uma, "jogar(int opcao)", que recebe um parâmetro, caso 1 as tentativas ficam infinitas e caso 2 elas ficam limitadas.

Há diversas vantagens em fazer isso, por exemplo, agora o código tem metade das linhas, pois está reaproveitando o código. Não deixar código repetido é uma boa prática.

para limpar o buffer

  • exclui a função de limpar buffer e deixei um espaço no scanf.
scanf(" %c",&chute); //o espaço antes do %c consegue limpar o buffer nessa ocasião 

pontuação

  • os pontos foram declarados como "static" para MANTER o valor alterado a cada iteração
  • foi criada uma condição "if()", pois errar com numeros menores que nsecreto fazia a pontuação aumentar
  • foi deletada a variável "pontosperdidos", pois não havia a necessidade dela.

teve outras mudanças, mas segue o código que eu refatorei:

#include <stdio.h>
#include <stdlib.h>
#define LIMPARTELA "clear"

void jogar(const int opcao);
int pontuacao(int chute);
int escolheTentativas();

int nsecreto = 42;

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

    do{
        printf("\nselecione o modo de jogo:\n");
        printf("1 - Tentativas infinitas\n");
        printf("2 - Escolher numero de tentativas\n");
        printf("Escolha uma opcao: ");
        scanf("%d", &opcao);
        system("cls");
        printf("Opcao invalida, tente novamente\n\n");
    }while(opcao != 1 && opcao != 2);

    //se o loop "do while" foi concluido, a opção vale ou 1 ou 2"
    jogar(opcao);

    return 0;
} 

void jogar(const int opcao){

    int tentativas = 1; //é uma boa prática inicializar variáveis

    if(opcao==2){
       tentativas = escolheTentativas();
    }

    system(LIMPARTELA);
    int chute;

    do{
        printf("seu chute: ");
        scanf(" %d",&chute);

        if(opcao == 2){ // se a opção for 1 ele não vai alterar as tentativas.
            --tentativas;
        }

        if(chute > nsecreto)
        printf("chute MAIOR que numero secreto!");
        
        if(chute < nsecreto)
        printf("chute MENOR que numero secreto!");

        printf("\npontuacao : %d\n", pontuacao(chute));

    }while(tentativas >= 1 && chute != nsecreto);

    system(LIMPARTELA);
    if(tentativas == 0){printf("voce perdeu, acabou as tentativas... o numro secreto era %d\n tente novamente!",nsecreto);}

    if(chute == nsecreto){ printf("parabens!!!\n vc ganhou, o numero secreto era %d", nsecreto);}

    printf("\nsua pontuacao foi: %d\n", pontuacao(nsecreto)); //nao irá alterar a pontuação
}

int escolheTentativas()
{
    system(LIMPARTELA);

    int qtd;
    do{
        printf("Quantas tentativas voce quer (Entre 1 e 20)?\n");
        scanf(" %d", &qtd);

        if(qtd < 1 || qtd > 20)
        printf("Quantidade de tentativas invalidas, digite novamente\n");

    }while(qtd < 1 || qtd > 20);

    return qtd;
}

int pontuacao(int chute)
{
    static int pontos = 200; 

    if (chute > nsecreto)
    pontos = (pontos - (chute - nsecreto) / 2);
    
    if(chute<nsecreto)
    pontos = (pontos - (nsecreto - chute) / 2);

    if(pontos <= 0){ pontos = 0; }//para não ter pontos negativos

    return pontos;
}

  • substitua em "LIMPARTELA" por "cls" em windows ou "clear" em linux

Poderia refatorar muito mais, separando em funções menores e em arquivos, mas eu tô meio sem tempo kkkkkk

espero ter ajudado :)

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