1
resposta

Referente à o endereço de memória e parâmetros das funções;

Entendo o porque delas serem declaradas como VOID pois não precisamos utilizar o "valor" delas, somente interessa se é verdade ou não. mas já que elas não recebem parâmetros, como as funções fazem para saber qual a letra que o usuario entrou, se ele está declarado dentro da função chuta; e não foi passado como ponteiro;

Cheguei a uma conclusão que o CHUTOU de map<char, bool> chutou; armazenou ele, mas como?

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

const string PALAVRA_SECRETA = "MELANCIA"; 
map<char, bool> chutou;
vector<char> chutes_errados;

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

bool nao_acertou(){
    for(char letra : PALAVRA_SECRETA){
        if(!chutou[letra]){
            return true;
        }
    }
    return false;
}

bool nao_enforcou(){
    return chutes_errados.size() < 5;
}

void imprime_cabecalho(){
    cout << "*********************" << endl;
    cout << "*** Jogo da Forca ***" << endl;
    cout << "*********************" << endl;
    cout << endl;
}

void imprime_erros(){
    cout << "Chutes errados: ";
    for(char letra: chutes_errados){
        cout << letra << " ";
    }
    cout << endl;
}

void imprime_palavra(){
    for(char letra : PALAVRA_SECRETA){
        if(chutou[letra]){
            cout << letra << " ";
        }
        else{
            cout << "_ ";
        }
    }
    cout << endl;
}

void chuta(){
    cout << "Seu chute: ";
    char chute;
    cin >> chute;

    chutou[chute] = true;

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

int main () {
    imprime_cabecalho();

    while(nao_acertou() && nao_enforcou()){
        imprime_erros();

        imprime_palavra();

        chuta();
    }

    cout << "Fim de jogo!" << endl;
    cout << "A palavra secreta era: " << PALAVRA_SECRETA << endl;
    if(nao_acertou()){
        cout << "Você perdeu! Tente novamente!" << endl;
    }
    else{
        cout << "Parabéns! Você acertou a palavra secreta!" << endl;
    }
}
1 resposta

Oi, oi! Tudo bem?

Veja se entendi bem sua dúvida.

Na função chuta(), o valor digitado pelo usuário é armazenado na variável chute. Em seguida, o mapa chutou é atualizado para indicar que o usuário chutou a letra chute (ou seja, chutou[chute] = true). Dessa forma, a função nao_acertou() pode verificar se ainda há letras da palavra secreta que não foram chutadas pelo usuário, consultando o mapa chutou.

Não é necessário passar o parâmetro chute para outras funções, pois essa informação já foi armazenada no mapa chutou. As funções letra_existe() e nao_acertou() percorrem a string PALAVRA_SECRETA e verificam se cada letra já foi chutada ou não, utilizando o mapa chutou.

Então, resumindo, a variável chute é usada para armazenar temporariamente o valor digitado pelo usuário na função chuta(), e o mapa chutou é atualizado com essa informação. As outras funções usam o mapa chutou para verificar se a letra já foi chutada ou não.

Consegui te ajudar?

Aguardo retorno.

Abraços e ótimos estudos :)