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;
}
}