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

[Dúvida] Está apresentando todo o array

int main()
{
    setlocale(LC_ALL,"");  // Ativa o uso de acentos
    // -------------------------------
    char palavraSecreta[8], chutes[26];
    bool acertou = false, enforcou = false, achou = false;
    char chute;
    int i, j, tentativas = 0;
            
    sprintf(palavraSecreta, "MELANCIA");
    
    do
    {
         for(i = 0; i < strlen(palavraSecreta); i++)
         {
             for(j = 0; j < tentativas; j++)
            {
                if(chutes[j] == palavraSecreta[i]) 
                {
                    achou = true;
                    
                    break;
                } 
            }
            if(achou)
            {
               cout << " " << palavraSecreta[i] << " ";
            }else{
                cout << " _ ";
            }
            
         }
         cout << "Informe seu chute: ";
         cin >> chute;
         chutes[tentativas] = chute;
         tentativas++;
        
    }while(!acertou &&  !enforcou);
   
    // -------------------------------
    system("pause");
    return 0;
}
6 respostas

Oi Pedro! Tudo bem?

Primeiro, percebi que você está usando cout para exibir as letras e underscores, mas o resto do código está em C. Vamos manter a consistência e usar printf para todas as saídas.

Aqui está uma versão ajustada do seu código:

#include <stdio.h>
#include <locale.h>
#include <stdbool.h>
#include <string.h>

int main() {
    setlocale(LC_ALL,"");  // Ativa o uso de acentos
    // -------------------------------
    char palavraSecreta[8], chutes[26];
    bool acertou = false, enforcou = false;
    char chute;
    int i, j, tentativas = 0;
    
    sprintf(palavraSecreta, "MELANCIA");
    
    do {
        bool achou = false;
        
        for(i = 0; i < strlen(palavraSecreta); i++) {
            achou = false;
            for(j = 0; j < tentativas; j++) {
                if(chutes[j] == palavraSecreta[i]) {
                    achou = true;
                    break;
                }
            }
            if(achou) {
                printf(" %c ", palavraSecreta[i]);
            } else {
                printf(" _ ");
            }
        }
        printf("\nInforme seu chute: ");
        scanf(" %c", &chute); // Note o espaço antes de %c para ignorar espaços em branco e newline
        
        chutes[tentativas] = chute;
        tentativas++;
        
    } while(!acertou && !enforcou);
    
    // -------------------------------
    return 0;
}

Algumas observações importantes:

  1. Consistência na saída: Substituí cout por printf para manter a consistência com o resto do código em C.
  2. Espaço no scanf: Adicionei um espaço antes de %c no scanf para ignorar qualquer caractere de nova linha que possa estar no buffer de entrada.
  3. Variável achou: Movi a declaração e inicialização da variável achou para dentro do loop externo, para garantir que ela seja redefinida a cada iteração.

Espero ter ajudado e bons estudos!

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

Eu havia feito algo parecido, consegui ajustar o erro. Mas, continuando a aula surgiu outro problema. Eu postei no fórum, mas você poderia dar uma olhada?

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

int imprimePalavraSecreta(int tentativas);
void abertura();
char capturaChute();
bool testaChute(char palavraSecreta, char chutes, int tentativas);

int main()
{
    setlocale(LC_ALL,"");  // Ativa o uso de acentos
    // -------------------------------
    
    int tentativas = 0;
    
    abertura();
    tentativas += imprimePalavraSecreta(tentativas);
    
    // -------------------------------
    system("pause");
    return 0;
}

int imprimePalavraSecreta(int tentativas)
{
    bool acertou = false, enforcou = false, achou = false;
    
    int i, j;
    
    char chutes[26], chute, palavraSecreta[8];
   
    sprintf(palavraSecreta, "MELANCIA");
    do
        {
            chute = capturaChute();
            chutes[tentativas] = chute;
            tentativas++; 
            
            achou = testaChute(char palavraSecreta, char chutes, int tentativas);
                   
            if(achou) {
                printf("%c ", palavraSecreta[i]);
                achou = false;
            } else {
                printf("_ ");
            }
        }while(!acertou &&  !enforcou);
        return tentativas;
}

void abertura()
{
    cout << "************************\n";
    cout << "*    JOGO DE FORCA     *\n";
    cout << "************************\n\n";
}

char capturaChute()
{
     char chute;
        
     cout << "Informe seu chute: ";
     cin >> chute;
     
     return chute;
}

Bom dia, Pedro! Tudo joia?

Existe um problema na chamada da função testaChute, onde você faz a passagem dos parâmetros, você está definido o tipo dos parâmetros, mas isso não é necessário, então pode ajustar a chamada na linha 40 para ficar assim:

achou = testaChute(palavraSecreta, chutes, tentativas);

Mas o seu problema não está localizado apenas nesse parte, já que você tá fazendo a chamada do testaChute, mas ele não está definido em nenhum lugar no trecho que código em que você compartilhou, então imagino que você definiu em outro arquivo ou esqueceu de compartilhar.

Então peço que compartilhe também a função testaChute para entender como ela está funcionando e o impacto que ela causa no código.

#include <stdio.h>
#include <string.h>
#include <locale.h>

void abertura() {
  printf("*****************************\n");
  printf("*   Jogo de Forca           *\n");
  printf("*****************************\n\n");
}

void chuta(char chutes[26], int* tentativas){
    char chute;
    scanf(" %c", &chute);

    chutes[(*tentativas)] = chute;
    (*tentativas)++;
}

int jachutou(char letra, char chutes[26], int tentativas){
    int achou = 0;

    for (int j = 0; j < tentativas; j++) {
        if (chutes[j] == letra) {
            achou = 1;
            break;
        }
    }

    return achou;
}

int main() {
    setlocale(LC_ALL, "Portuguese");
    char palavrasecreta[20];
    sprintf(palavrasecreta, "MELANCIA");

    int acertou = 0;
    int enforcou = 0;

    char chutes[26];
    int tentativas = 0;

    abertura();

    do {
        // Imprime a palavra secreta
        for (int i = 0; i < strlen(palavrasecreta); i++) {
            int achou = jachutou(palavrasecreta[i], chutes, tentativas);

            if (achou) {
                printf("%c ", palavrasecreta[i]);
            } else {
                printf("_ ");
            }
        }
        printf("\n");

        chuta(chutes, &tentativas);

    } while (!acertou && !enforcou);

    return 0;
}

Eu realmente esqueci de criar a função..., aqui está o código com a função criada.

solução!

Olá, Pedro!

Agora o seu código está funcionando corretamente, no quesito de mostrar cada palavra acertada em sequência. O que eu indicaria é que você adicionasse uma condição de parada para quando a palavra é acertada.

Segue um exemplo:

#include <stdio.h>
#include <string.h>
#include <locale.h>

void abertura() {
    printf("*****************************\n");
    printf("*   Jogo de Forca           *\n");
    printf("*****************************\n\n");
}

void chuta(char chutes[26], int* tentativas){
    char chute;
    scanf(" %c", &chute);

    chutes[(*tentativas)] = chute;
    (*tentativas)++;
}

int jachutou(char letra, char chutes[26], int tentativas){
    int achou = 0;

    for (int j = 0; j < tentativas; j++) {
        if (chutes[j] == letra) {
            achou = 1;
            break;
        }
    }

    return achou;
}

int ganhou(char palavrasecreta[20], char chutes[26], int tentativas) {
    for (int i = 0; i < strlen(palavrasecreta); i++) {
        if (!jachutou(palavrasecreta[i], chutes, tentativas)) {
            return 0;
        }
    }
    return 1;
}

int main() {
    setlocale(LC_ALL, "Portuguese");
    char palavrasecreta[20];
    sprintf(palavrasecreta, "MELANCIA");

    int acertou = 0;
    int enforcou = 0;

    char chutes[26];
    int tentativas = 0;
    int maxTentativas = 10; // Pode ajustar conforme necessário

    abertura();

    do {
        // Imprime a palavra secreta
        for (int i = 0; i < strlen(palavrasecreta); i++) {
            int achou = jachutou(palavrasecreta[i], chutes, tentativas);

            if (achou) {
                printf("%c ", palavrasecreta[i]);
            } else {
                printf("_ ");
            }
        }
        printf("\n");

        chuta(chutes, &tentativas);

        acertou = ganhou(palavrasecreta, chutes, tentativas);
        enforcou = (tentativas >= maxTentativas);

    } while (!acertou && !enforcou);

    if (acertou) {
        printf("Parabéns, você ganhou!\n");
    } else if (enforcou) {
        printf("Você foi enforcado!\n");
    }

    return 0;
}

Essa condição é aplicada na comparação da palavra secreta com a palavra gerada ao fim das tentativas, e quando elas forem iguais o jogo acaba.

Bons estudos!

Entendi, muito obrigado!