Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Dúvida] Função

Olá, boa tarde! Tudo bem? Eu criei essa função, mas ela não está funcionando corretamente, pode me ajudar?

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

bool letraExiste(char chute);
bool jaChutouLetra(char letra);

string palavraSecreta = "MELANCIA";
char chutes[8];

int main()
{
    setlocale(LC_ALL, "");  // Ativa o uso de acentos
    
    char chute = ' ';
    bool acertou = false, enforcou = false;

    for (int i = 0; i < palavraSecreta.size(); i++) {
        chutes[i] = 0;
    }

    do {
        for (char letra : palavraSecreta) {
            if (jaChutouLetra(letra)) {
                cout << letra << " ";
            }
            else {
                cout << "_ ";
            }
           
        }

        cout << "Informe uma letra, sempre use letras maiúsculas: ";
        cin >> chute;
        cout << "\n";
       
        if (letraExiste(chute)) {
           // cout << "Você acertou! Seu chute está na palavra\n";

        }
        else {
           // cout << "Você errou! Seu chute não está na palavra\n";
        }
       
    } while (!acertou && !enforcou);

}

bool letraExiste(char chute) {
    /*for (int i = 0; i < palavraSecreta.size(); i++)
    {
        if (chute == palavraSecreta[i]) {
            return true;
        }
    }
    return false;*/

    for (char letra : palavraSecreta) {
        if (chute == letra) {
            for (int i = 0; i < palavraSecreta.size(); i++) {
                if (chutes[i] != 0) {
                    chutes[i] = chute;
                }
            }
            return true;
        }
    }
    return false;
}

bool jaChutouLetra(char letra) {
    for (int i = 0; i < palavraSecreta.size(); i++) {
        if (palavraSecreta[i] == chutes[i]) {
            cout << "true";
            return true;
        }
        else {
            cout << "FALSE";
            return false;
        }
    }
}
3 respostas

Oii, Pedro.

A função tem um problema principal relacionado ao uso de variáveis e lógica dentro das funções letraExiste e jaChutouLetra. Vou apontar as melhorias e corrigir o código:

  1. Uso do array chutes: O array chutes deveria armazenar os caracteres chutados, mas a lógica atual sobrescreve os valores ou acessa índices de forma indevida.

Ajuste seu código para:

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

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

bool letraExiste(char chute);
bool jaChutouLetra(char letra);

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

    char chute = ' ';
    bool acertou = false, enforcou = false;

    do {
        // 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";
        }

        // condição de vitória
        acertou = true;
        for (char letra : palavraSecreta) {
            if (!jaChutouLetra(letra)) {
                acertou = false;
                break;
            }
        }

    } while (!acertou && !enforcou);

    if (acertou) {
        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;
}

Alterações feitas:

  1. Substituí o array fixo char chutes[8] por um vector<char> para facilitar a manipulação dos chutes.
  2. Ajustei a função jaChutouLetra para verificar apenas os chutes já feitos, sem comparar diretamente com a palavra secreta.
  3. Implementei a condição de vitória baseada no acerto de todas as letras.

Teste agora e veja como funciona.

print do console

Um abraço e bons estudos.

Boa tarde! vector. O que é essa expressão? chutes.push_back(chute). Envia o chute para a última possição disponível no array?

solução!

Boa tarde, Pedro!

Sim, você entendeu quase certo! A expressão chutes.push_back(chute) é usada em vetores dinâmicos (std::vector) em C++.

  1. O que é vector? Um vector é como um "array turbinado". Ele é capaz de aumentar ou diminuir de tamanho conforme necessário, ao contrário dos arrays fixos que têm um tamanho definido no momento da criação.

  2. Como funciona o push_back? O método push_back adiciona um elemento ao final do vetor. Então, se você tem um vetor vazio e chama chutes.push_back('A'), ele adiciona 'A' ao vetor. Se depois disso você chamar chutes.push_back('B'), o vetor terá dois elementos: ['A', 'B'].

  3. Por que isso é útil aqui? No seu jogo, o vetor chutes guarda as letras que o jogador já tentou. Como não sabemos quantas tentativas serão feitas, o vector é perfeito, pois ele se ajusta automaticamente ao tamanho necessário.

Exemplo básico:

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

int main() {
    vector<int> numeros; // Cria um vetor vazio

    numeros.push_back(10); // Adiciona o número 10 ao final
    numeros.push_back(20); // Adiciona o número 20 ao final
    numeros.push_back(30); // Adiciona o número 30 ao final

    // Mostra os elementos do vetor
    for (int num : numeros) {
        cout << num << " ";
    }

    return 0;
}

Saída:

10 20 30

Voltando ao seu código:

Ao usar chutes.push_back(chute), você está adicionando o chute atual ao histórico de chutes. Isso simplifica bastante o controle, pois não precisa gerenciar manualmente o tamanho de um array fixo ou lidar com índices.

Abraços.