1
resposta

O meu programa não está considerando a divisão por 2 no cálculo da pontuação. Peço ajuda, por favor. Já fiz várias revisões com os tópicos existentes daqui e nada.

#include <iostream>
#include<iomanip>
#include<stdlib.h>
#include <cstdlib>
#include <ctime>
#include<ctype.h>
using namespace std;

int main () {
    cout <<"*************************************"<< endl;
    cout <<"* Bem-vindos ao jogo da adivinhação *"<< endl;
    cout <<"*************************************"<< endl;

    cout <<"Favor informar o nível de jogo."<< endl;
    cout <<"Para um jogo fácil digite F, para um jogo médio digite M e para um jogo difícil digite D."<< endl;

    char nivel;
    cin >> nivel;

    int numero_de_tentativas;

    if(nivel == 'F'){
        numero_de_tentativas = 15; 
    }
    else if(nivel == 'M'){
        numero_de_tentativas = 10;
    }
    else {
        numero_de_tentativas = 5;
    }

    srand(time(NULL));
    const int NUMEROSECRETO = rand() % 100;

    bool nao_acertou = true;
    int tentativas = 0;

    double pontos = 1000.0;

    for(tentativas = 1;tentativas <= numero_de_tentativas;tentativas++){
        int chute;
        cout <<"Tentativa "<< tentativas <<endl;
        cout <<"Qual o seu chute?";
        cin >> chute;

        double pontos_perdidos = abs(chute - NUMEROSECRETO) / 2.0;
        pontos -= pontos_perdidos;

        cout <<"O valor do seu chute é: "<< chute << endl;
        bool acertou = chute == NUMEROSECRETO;
        bool maior = chute > NUMEROSECRETO;

        if (acertou){
            cout <<"Parabéns! Você acertou o número secreto!"<< endl;               
            nao_acertou = false;
            break;
        }
        else if (maior){
            cout <<"O seu chute é maior que o número secreto!"<< endl;
            double pontos_perdidos = abs(NUMEROSECRETO - chute)/2.0;
            pontos -= pontos_perdidos;
            cout.precision(2);
            cout << fixed;
            cout <<"A sua pontuação atual é: "<< pontos << " pontos."<< endl;
        }
        else{
            cout <<"O seu chute é menor que o número secreto!"<< endl;
            double pontos_perdidos = abs(NUMEROSECRETO - chute)/2.0;
            pontos -= pontos_perdidos;
            cout.precision(2);
            cout << fixed;
            cout <<"A sua pontuação atual é: "<< pontos << " pontos."<< endl;
        }
    }

    cout <<"Fim de jogo!" << endl; 

    if(nao_acertou){
        cout <<"Game Over"<< endl;
    }
    else{
        cout <<"Você acertou o número secreto em " << tentativas << " tentativas! O número secreto é: "<< NUMEROSECRETO <<"."<< endl;
        cout.precision(2);
        cout << fixed;
        cout <<"A sua pontuação final é: "<< pontos << " pontos."<< endl;
    }
}   
1 resposta

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!