1
resposta

O jogo

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include "forca.h" 

char palavrasecreta[20];
char chutes[26];
int chutesdados = 0;

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

void chuta() {
        char chute;
        scanf(" %c", &chute); 
        
        chutes[chutesdados] = chute;
        chutesdados++;
}

void desenhaforca() {

    for (int i = 0; i < strlen(palavrasecreta); i++) {

    int achou = jachutou(palavrasecreta[i]);

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

void adicionarpalavra() {
    char quer;

    printf("Você deseja adicionar uma nova palavra no jogo ? (S/N)");
    scanf(" %c", &quer);

    if(quer == 'S') {

        char novapalavra[20];
        printf("Qual a nova palavra? ");
        scanf("%s", novapalavra);

        FILE* f;

        f = fopen("palavras.txt", "r+"); 
        if(f == 0) {
        printf("Desculpe, banco de dados não disponível\n\n");
        exit(1);
        }

        int qtd;
        fscanf(f, "%d", &qtd);
        qtd++;

        fseek(f, 0, SEEK_SET); 
        fprintf(f, "%d", qtd);

        fseek(f, 0, SEEK_END);
        fprintf(f, "\n%s", novapalavra); 

        fclose(f);
    }
}

void escolhepalavra() {

    FILE* f; 

    f = fopen("palavras.txt", "r");
    if(f == 0) {
        printf("Desculpe, banco de dados não disponível\n\n");
        exit(1);
    }

    int qtddepalavras;
    fscanf(f, "%d", &qtddepalavras);

    srand(time(0));
    int randomico = rand() % qtddepalavras;

    for(int i = 0; i <= randomico; i++) {
        fscanf(f,"%s", palavrasecreta);
    }

    fclose(f); 
}

int acertou() {
    for(int i = 0; i < strlen(palavrasecreta); i++) {
        if(!jachutou(palavrasecreta[i])) {
            return 0;
        }
    }
    return 1; 

int enforcou() {

    int erros = 0;

    for(int i = 0; i < chutesdados; i++) {

        int existe = 0;

    if(jachutou(palavrasecreta[i])) {

            existe = 1;
            break;
        }
    
        if(!existe) erros++;
    }
    return erros >= 5;
}

int jachutou(char letra) {

    int achou = 0; 

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

int main() {

    escolhepalavra();
    abertura();
    
    do {

        desenhaforca();
        chuta();

    } while (!acertou() && !enforcou()); 
    
    adicionarpalavra();
}
1 resposta

Oi, Guilherme! Como vai?

Gostei de como você lidou com arquivo (fopen, fseek, contador no topo) e do sorteio com rand() % qtddepalavras.

Do jeito que você explicou, o problema aqui é um } faltando ao final de acertou() (após return 1;) e a lógica de erros em enforcou(), que percorre chutesdados mas compara palavrasecreta[i] (índice não corresponde ao chute). Resolva fazendo o seguinte... feche acertou() corretamente e, em enforcou(), some erro quando um chutes[j] não existe na palavra. Exemplo de ideia para enforcou() sem acentos:
int enforcou(){ int erros=0; for(int j=0;j<chutesdados;j++){ int existe=0; for(size_t i=0;i<strlen(palavrasecreta);i++){ if(palavrasecreta[i]==chutes[j]){ existe=1; break; } } if(!existe) erros++; } return erros>=5; }

Uma dica interessante para o futuro é usar strchr para verificar se uma letra está na palavra, deixando o codigo mais simples. Veja este exemplo:


// usa <string.h>
int letra_existe(char c, const char* palavra){
    return strchr(palavra, c) != NULL;
}

Esse codigo procura o caractere na string e retorna diferente de zero quando encontra.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!