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

erro ao mostrar chutes errados

por algum motivo na parte de mostrar os chutes errado, as letras depois da primeira letra da palavra secreta aparecem na parte dos chutes errado.

caso eu não tenha conseguido explicar direito o problema aqui esta um exemplo:


palavra secreta: "melancia"

chuto: 'm'

chutes errados:

m _ _ _ _ _ _ _

chuto: 'a'

chutes errados: a

m _ _ a _ _ _ a


aqui esta meu codigo:

#include <iostream>
#include <cstdlib>
#include <string>
#include <map>
#include <vector>

using namespace std;

const string PALAVRA_SECRETA = "melancia";
map<char, bool> ja_chutou;
vector<char> chutes_errados;

bool letra_existe(char chute){

    for(char letra : PALAVRA_SECRETA){

        if(chute == letra){

            return true;
        }    
        else{
            
            return false;
        }    
    }
}

int main(){

    cout << "*****************" << endl;
    cout << "* jogo da forca *" << endl;
    cout << "*****************" << endl;
    cout << endl;

    bool ganhou = false;
    bool enforcou = false;

    do{

        cout << "letras erradas: ";
        for(char letra : chutes_errados){

           cout << letra << " ";
        }
        cout << endl;

        for(char letra : PALAVRA_SECRETA){

            if(ja_chutou[letra]){

                cout << letra << " ";
            }    
            else{

                cout << "_ ";
            }    
        }
        cout << endl;    

        cout << "seu chute: ";
        char chute;
        cin >> chute;

        ja_chutou[chute] = chute;
        
        if(letra_existe(chute)){

            cout << "a letra | " << chute << " | existe na palavra secreta" << endl;
        }
        else{

            cout << "a letra | " << chute << " | nao existe na palavra secreta" << endl;
            chutes_errados.push_back(chute);
        }
        cout << endl;

    }while(!ganhou && !enforcou);
}
1 resposta
solução!

Olá Kelvyn! td bem? espero q sim!

O problema está na implementação da função "letra_existe"

segue a função atual:

bool letra_existe(char chute){

    for(char letra : PALAVRA_SECRETA){
    
    //se a primeira letra for igual ao chute retorna "true"
    //mas se ela for diferente de chute vai retornar "false"
    //assim o loop não verifica o restante das letras, se a primeira letra
    //for diferente de chute ele já retorna falso;
    
        if(chute == letra){
            return true;
        }    
        else{  
            return false;
        }    
    }
}

uma correção para isso seria deixar o loop iterar a palavra inteira e logo após isso, caso ele não ache a letra, retorne falso:

bool letra_existe(char chute){

//primeiramente é verificado todas as letras
    for(char letra : PALAVRA_SECRETA)
    {
        if(chute == letra){ return true; }   //se o loop achar vai retornar verdadeiro
    }
    
    //se o loop não achou vai retornar false
    return false; 
}

foi só remover o "else" do if e do loop, o deixando no fim do escopo da função, assim se o loop não achar o chute na palavra vai retorna falso, e caso ache retorna verdadeiro.

por isso a primeira letra "m" não aparecia no chutes errados, pois ela era a única q era avaliada corretamente pela função, já da segunda letra em diante ocorria esse problema.

Espero ter ajudado! se sim não esqueça de marcar o post como solução!

Bons estudos :)