1
resposta

Quantidade de palavras absurda

o codigo funciona normalmente mas na hora de atualizar a quantidade de palavras de 12 para 13 ele gera um numero aleatorio forca.c

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

int chutesDados = 0;
char chutes[26];
char palavraSecreta[26];

void adicionaPalavra() {
    char quer;
    printf("voce quer adicionar uma nova palavra?(S/N)");
    scanf(" %c", &quer);
    if (quer == 'S') {
        char novaPalavra[26];
        printf ("qual a nova Plavara?");
        scanf("%s", novaPalavra);

        FILE* f;
        
        f = fopen("palavras.txt", "r+");
        if (f == 0) {
        printf ("desculpe banco de dados não disponivel");
        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, "%s", novaPalavra);

        fprintf (f, "\n%s", novaPalavra);
        fclose(f);

    }
}

void escolhepalavra() {
    FILE* f;
    if (f == 0) {
        printf ("desculpe banco de dados não disponivel");
        exit(1);
    }

    f = fopen ("palavras.txt", "r");  
    
    int qtddeplavras;
    fscanf(f, "%d", &qtddeplavras);

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

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

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

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

        int achou = jachutou(palavraSecreta[i]);
        //imprime a letra ou _
        if (achou) {
            printf("%c", palavraSecreta[i]);
        } else {
            printf ("_ ");
        }
    }
    printf("\n");
}

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

void chuta() {
    char chute;
    scanf(" %c", &chute);

    chutes[(chutesDados)] = chute;
    (chutesDados)++;
}

int ganhou() {
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;
        for (int j = 0; j < strlen(palavraSecreta); j++) {
            if (chutes[i] == palavraSecreta[j]) {
                existe = 1;
                break;
            }
        }
        if (!existe) {
        erros++;
        }
    }
    
    return erros >= 5;

}

int main() {
    setlocale (LC_ALL, "portuguese");
    int acertou = 0;

    escolhepalavra();
    abertura();

    do
    {
        imprimirForca();
        chuta();
        
    } while (!ganhou() && !enforcou());

    if (!ganhou() == 1) {
        printf("Parabens Voce ganhou\n");
    }
    
    adicionaPalavra();
}

forca.txt

6422477AO
MORANGO
ABACAXI
PERA
BANANA
BATATA
LARANJA
MANGAARROZ
ARROZCAPIVARA
CAPIVARAPERNA
PERNA
1 resposta

Olá, Alexandre.

Tudo bem?

Pelo que você descreveu, parece que o problema está na forma como você está lendo e escrevendo a quantidade de palavras no arquivo. Vamos dar uma olhada no trecho do código que trata disso:

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

O problema aqui é que fscanf precisa de um ponteiro para armazenar o valor lido, então deveria ser &qtd em vez de qtd. Além disso, ao adicionar a nova palavra, você não precisa escrever a palavra duas vezes. Vamos corrigir isso.

Aqui está uma versão corrigida da função adicionaPalavra:

void adicionaPalavra() {
    char quer;
    printf("Você quer adicionar uma nova palavra? (S/N) ");
    scanf(" %c", &quer);
    if (quer == 'S') {
        char novaPalavra[26];
        printf("Qual a nova palavra? ");
        scanf("%s", novaPalavra);

        FILE* f = fopen("palavras.txt", "r+");
        if (f == 0) {
            printf("Desculpe, banco de dados não disponível\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);
    }
}

Certifique-se de que o arquivo palavras.txt começa com um número representando a quantidade de palavras, seguido das palavras, uma por linha. Por exemplo:

5
MORANGO
ABACAXI
PERA
BANANA
BATATA

Com essas correções, a quantidade de palavras deve ser atualizada corretamente de 12 para 13, em vez de gerar um número aleatório.

Veja se faz sentido e faça as mudanças.

Espero ter ajudado. Qualquer dúvida manda aqui. Bons estudos.