Olá, Guilherme! Tudo bem?
Desculpe a demora em dar um retorno.
Isso está acontecendo porque quando o usuário erra o chute ele perde ponto duas vezes.
Dentro do loop for temos o código abaixo fora da condição if / else if / else. Logo após, temos o trecho novamente, quando o usuário chuta um número maior ou menor do que o número secreto.
double pontos_perdidos = abs(chute - NUMEROSECRETO) / 2.0;
pontos -= pontos_perdidos;
Ou seja, precisamos utilizar esse código de forma que ele não altere o número de pontos mais de uma vez a cada chute.
Tem algumas opções para evitar isso. Por exemplo, remover o trecho fora das condições if / else if / else e adicionar no if (acertou)
uma linha para mostrar o valor da pontuação.
Ou, uma outra maneira:
while(nao_acertou){
tentativas++;
int chute;
cout << "Tentativa " << tentativas << endl;
cout << "Qual seu chute? ";
cin >> chute;
double pontos_perdidos = abs(chute - NUMERO_SECRETO)/2.0;
pontos -= pontos_perdidos;
cout << "O valor do seu chute é: " << chute << endl;
bool acertou = chute == NUMERO_SECRETO;
bool maior = chute > NUMERO_SECRETO;
if (acertou)
{
cout << "Parabéns! Você acertou o número secreto!" << endl;
nao_acertou = false;
}
else if (maior)
{
cout << "Seu chute foi maior que o número secreto!" << endl;
}
else
{
cout << "Seu chute foi menor que o número secreto!" << endl;
}
}
cout << "Fim de jogo!" << endl;
cout << "Você acertou o número secreto em " << tentativas << " tentativas" << endl;
cout.precision(2);
cout << fixed;
cout << "Sua pontuação foi de " << pontos << " pontos." << endl;
}
Dessa forma não precisamos reescrever todo o código de cálculo de pontos, visto que independente da condição, a pontuação é sempre mostrada. Ainda conseguimos reduzir algumas linhas de código.
Caso eu não tenha conseguido deixar claro com essa explicação, estou à disposição para qualquer dúvida.
Bons estudos e abraços :)
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!