Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Não itera o número necessário

#include <iostream>
#include <string>
#include <vector>
using namespace std;

string palavraSecreta = "MELANCIA";
vector<char> chutes;
vector<char>chutesErrados;

bool letraExiste(char chute);
bool jaChutouLetra(char letra);
void mostraJutesFeitos();
bool naoAcertou();
bool naoEnforcou();

int main() {
    setlocale(LC_ALL, ""); // ativa o uso de acentos

    char chute = ' ';

    cout << "*********************************\n";
    cout << "***BEM-VINDO AO JOGO DA FORCA!***\n";
    cout << "*********************************\n";


    do {

        mostraJutesFeitos();

        // mostra a palavra com letras acertadas ou "_"
        for (char letra : palavraSecreta) {
            if (jaChutouLetra(letra)) {
                cout << letra << " ";
            }
            else {
                cout << "_ ";
            }
        }

        cout << "\nInforme uma letra, sempre use letras maiúsculas: ";
        cin >> chute;
        cout << "\n";

        chutes.push_back(chute); // adiciona o chute ao histórico

        if (letraExiste(chute)) {
            cout << "Você acertou! Seu chute está na palavra.\n";
        }
        else {
            cout << "Você errou! Seu chute não está na palavra.\n";
            chutesErrados.push_back(chute);
        }

    } while (!naoAcertou() && !naoEnforcou());

    if (naoAcertou) {
        cout << "Parabéns! Você acertou a palavra secreta: " << palavraSecreta << "\n";
    }
}

bool letraExiste(char chute) {
    for (char letra : palavraSecreta) {
        if (chute == letra) {
            return true;
        }
    }
    return false;
}

bool jaChutouLetra(char letra) {
    for (char chute : chutes) {
        if (chute == letra) {
            return true;
        }
    }
    return false;
}

void mostraJutesFeitos() {
    cout << "ESSES FORAM OS CHUTES ERRADOS JÁ FEITOS: ";
    for (char letra : chutesErrados) {
        cout << letra << " "; // Exibe cada letra chutada separada por um espaço
    }
    cout << "\n";
}

bool naoAcertou() {
    for (char letra : palavraSecreta) {
        if (!jaChutouLetra(letra)) {
          
            return true;
        }
    }
    return false;
}

bool naoEnforcou() {
    return chutesErrados.size() < 5;
}

Após o primeiro chute o jogo acaba

1 resposta
solução!

Oi Pedro,

O problema que você está enfrentando ocorre porque a condição de final de jogo na sua estrutura de repetição está incorreta. Ao verificar se o jogo deve continuar, você está usando !naoAcertou() e !naoEnforcou(), mas a função naoAcertou deve retornar um valor booleano que indica se o jogador ainda não acertou todas as letras.

Além disso, no bloco que imprime a mensagem de vitória, você está referenciando a função naoAcertou em vez de chamar a função. Para corrigir isso, você deve alterar if (naoAcertou) para if (naoAcertou()).

Aqui está a parte corrigida do seu código:

do {
    mostraJutesFeitos();

    // Mostra a palavra com letras acertadas ou "_"
    for (char letra : palavraSecreta) {
        if (jaChutouLetra(letra)) {
            cout << letra << " ";
        } else {
            cout << "_ ";
        }
    }

    cout << "\nInforme uma letra, sempre use letras maiúsculas: ";
    cin >> chute;
    cout << "\n";

    chutes.push_back(chute); // Adiciona o chute ao histórico

    if (letraExiste(chute)) {
        cout << "Você acertou! Seu chute está na palavra.\n";
    } else {
        cout << "Você errou! Seu chute não está na palavra.\n";
        chutesErrados.push_back(chute);
    }

} while (naoAcertou() && naoEnforcou()); // Alterar a condição para não parar o jogo

if (!naoAcertou()) { // Alterar para chamar a função
    cout << "Parabéns! Você acertou a palavra secreta: " << palavraSecreta << "\n";
}

Verifique essas alterações e teste novamente. Isso deve resolver o problema de o jogo terminar prematuramente após o primeiro chute.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!