3
respostas

As letras acertadas não aparecem mais no jogo

Depois de ter criado um arquivo externo para adicionar os protótipos das funções e também o banco de dados das palavras, o meu jogo parou de adicionar as letras na tela quando eu acerto o chute.

Alguém pode me dar um help, por favor?! Grato desde já :D

PS: aqui está os arquivos completos (https://drive.google.com/drive/folders/1dMKCUT5nqC0eEm4WpLMnzgrlk5UKwO3G?usp=sharing).

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

//Variáveis globais
char palavraSecreta[20];
char chutes[30];
int chutesDados = 0;

int main() {

    aberturaJogo();
    escolhaPalavra();

    do {
        desenhaForca();
        chuteUsuario();

    } while(!acertou() && !enforcou());

    adicionaPalavra();
}

void aberturaJogo() {
    printf("******************\n");
    printf("* Jogo da Forca *\n");
    printf("******************\n\n");
} //Função desenvolvida para exibir uma mensagem de abertura do jogo

void chuteUsuario() {
    char chute;
    printf("Qual letra? ");
    scanf(" %c", &chute);

    chutes[chutesDados] = chute;
    chutesDados++;
} //Função desenvolvida para capturar o chute do usuário

int jaChutou(char letra) {
    int achou = 0;

    for(int j = 0; j < chutesDados; j++) {
        if(chutes[j] == letra) {
            achou = 1;
            break;
        }
    }
    return achou;
} //Função desenvolvida para verificar a letra chutada e se ela está na palavra secreta

void desenhaForca() {
    printf("Voce ja deu %i chutes.\n", chutesDados);

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

            if(jaChutou(palavraSecreta[i])) {
                printf("%c ", palavraSecreta[i]);
            }
            else {
                printf("_ ");
            }
        }
        printf("\n");
} //Função desenvolvida para criar a forca

void escolhaPalavra() {
    FILE* palavras;
    palavras = fopen("palavras.txt", "r");

    if(palavras == 0) {
        printf("\nDesculpe, banco de dados nao disponivel!\n\n");
        exit(1);
    }

    int qtdPalavras;
    fscanf(palavras, "%i", &qtdPalavras);
    srand(time(0));
    int randomico = (rand() % qtdPalavras);

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

    fclose(palavras);
} //Função desenvolvida para escolher a palavra secreta da rodada no jogo

void adicionaPalavra() {
    char resposta;

    printf("Deseja adicionar uma nova palavra ao jogo?\n");
    printf("Responda com S para SIM ou N para NAO.\n");
    scanf(" %c", &resposta);

    resposta = toupper(resposta); //Converte a letra digitada em maiúscula

    if(resposta == 'S') {
        char novaPalavra[20];

        printf("Qual eh a nova palavra? ");
        scanf("%s", novaPalavra);

        strupr(novaPalavra); //Converte a string toda para letras maiúsculas

        FILE* palavras;
        palavras = fopen("palavras.txt", "r+"); //r+ significa "leitura e escrita"

        if(palavras == 0) {
            printf("\nDesculpe, banco de dados nao disponivel!\n\n");
            exit(1);
        }

        int qtdPalavras;
        fscanf(palavras, "%i", &qtdPalavras);
        qtdPalavras++;

        fseek(palavras, 0, SEEK_SET);
        fprintf(palavras, "%i", qtdPalavras);

        fseek(palavras, 0, SEEK_END);
        fprintf(palavras, "\n%s", novaPalavra);

        fclose(palavras);
    }
}

int enforcou() {
    int erros = 0;

    for(int i = 0; i < chutesDados; i++) {
        int existe = 0;

        for(int j = 0; j < strlen(palavraSecreta); j++) {
            if(chutes[i] == palavraSecreta[j]) {
                existe = 1;
                break;
            }
        }
        if(!existe) erros++;
    }

    return erros >= 5;
} //Função desenvolvida para verificar se o usuário foi enforcado ou não

int acertou() {
    for(int i = 0; i < strlen(palavraSecreta); i++) {
        if(!jaChutou(palavraSecreta[i])) {
            return 0;
        }
    }

    return 1;
} //Função desenvolvida para verificar se o usuário acertou ou não a letra
3 respostas

Olá Kássio Silveira.

Baixei o seu código e ele está funcionando, a unica coisa que notei é que não está sendo feita a conversão das letras que o usuário chuta para maiúsculo.

Sugiro usar a própria função toupper para fazer isso. Eu inclui ela na função chuteUsuario.

void chuteUsuario() {
    char chute;
    printf("Qual letra? ");
    scanf(" %c", &chute);

    chutes[chutesDados] = toupper(chute);
    chutesDados++;
} //Função desenvolvida para capturar o chute do usuário

Dessa maneira independente se o usuário digitar maiúsculo ou minusculo seu código vai aceitar.

Me avisa se a minha proposta resolve o seu problema.

Bons estudos :)

Opa, eu testei e essa parte deu certo.

Mas ele está apresentando outros erros também que agora estou tentando entender para ver se corrijo eles.

Olá Kássio.

Legal que consegui ajudar um pouco e muito bom que está tentando buscar a solução sozinho, é algo bem importante também.

Mas caso não consiga não hesite em trazer sua duvida para nós que estamos aqui para te dar o suporte necessário.

Bons Estudos.