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 :)