1
resposta

[Dúvida] Meu programa fecha do nada

No meu código eu queria fazer com que ao invés de apenas 1 arquivo com nomes de frutas também tivesse outras coisas, mas agora meu código é compilado normalmente, mas não funciona! Ele está assim:

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <string.h>
#include "jogodaforca.h"

int main() {
    abertura();

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

    escolheapalavra(palavrasecreta);

    do {

        escreverletra(palavrasecreta, chutes, chutesdados);
        chuta(chutes, &chutesdados);

    }while (!enforcou(chutesdados, chutes, palavrasecreta));

    mensagemdederrota(palavrasecreta);
    jogardenovo();
    
}

void jogardenovo() {
    char novojogo;
    printf("\n");
    printf("Quer tentar denovo? (S) ou (N)");
    scanf(" %c", &novojogo);
    printf("\n");
    if (novojogo == 'S') {
        printf("Entao vamos la! :)");
        Sleep(3000);
        system("cls");
        main();
    }
    else {
        printf("Que pena! :(");
        Sleep(3000);
        system("cls");
        exit(0);
    }
}

void abertura() {
    system("cls");

    printf("\n");
    printf("********************************\n");
    printf("*  Bem vindo ao jogo da forca  *\n");
    printf("********************************\n\n");
    printf("Tente adivinhar a palavra secreta! Lembre-se de sempre usar letra MAIUSCULA e nao dar espaco!\n\n");
}

void escolheapalavra(char palavrasecreta[20]) {
    
    FILE* arquivos[15];
    printf("Escolha o tipo da palavra que voce ira adivinhar\n\n");
    FILE* arquivoescolhido = pegararquivos(arquivos);

    int qtdepalavras;
    fscanf(arquivoescolhido, "%d", &qtdepalavras);
    srand(time(0));
    int randomico = rand() % qtdepalavras;

    for (int j = 0; j <= randomico; j++) {
        fscanf(arquivoescolhido, "%s", palavrasecreta);
    }
    
    for (int i = 0; i < 14; i++) {
        fclose(arquivos[i]);
    }
}

void ganhou() {
    printf("\n\n");
    printf("Ha essa era a palavra parabens voce ganhou!!! :)\n");
    Sleep(1000);
    jogardenovo();
}

void mensagemdederrota(char palavrasecreta[20]) {
    printf("\n");
    printf("Voce perdeu, a palavra era %s\n", palavrasecreta);

}

bool enforcou(int chutesdados, char chutes[26], char palavrasecreta[20]) {
    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;
}

void chuta(char chutes[26], int* chutesdados) {
    char chute;
    printf("\n");
    printf("Chute uma letra ");
    scanf(" %1c", &chute);
    printf("\n");

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

int jachutou(char palavrasecreta, char chutes[26], int chutesdados) {
    bool achou = 0;
    for (int j = 0; j < chutesdados; j++) {
        if (chutes[j] == palavrasecreta) {
            achou = 1;
            break;
        }
    }
    return achou;
}

void escreverletra(char palavrasecreta[20], char chutes[26], int chutesdados) {
    int acertou = 1;
    for (int i = 0; i < strlen(palavrasecreta); i++) {

        char espaco = '-';
        bool achou = jachutou(palavrasecreta[i], chutes, chutesdados);

        if (achou) {
            printf("%c ", palavrasecreta[i]);
        }
        else if (palavrasecreta[i] == espaco) {
            printf("- ");
        }
        else {
            printf("_ ");
            acertou = 0;
        }
    }
    if (acertou) {
        ganhou();
    }
}

FILE* pegararquivos(FILE* arquivos[15]) {
    
    int tipodapalavra;
    arquivos[0] = fopen("palavrasfrutas.txt", "r");
    arquivos[1] = fopen("palavrasanimais.txt", "r");
    printf("(1) Frutas\n");
    printf("(2) Animais\n");
    printf("\n");
    printf("Escolha ");
    scanf("%d", tipodapalavra);
    tipodapalavra += -1;
    printf("%d", tipodapalavra);
    if (tipodapalavra > 0|| tipodapalavra <= 1) {
        tipodapalavra = 0;
    }
    return arquivos[tipodapalavra];
}

Mas quando eu rodo ele isso acontece: Insira aqui a descrição dessa imagem para ajudar na acessibilidade , Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Olá, Pedro.

Tudo bem?

Pelo que você descreveu e pelas imagens fornecidas, parece que o programa está encerrando inesperadamente após a seleção do tipo de palavra. Isso pode estar ocorrendo por alguns motivos. Vou destacar um ponto que pode ser a causa do problema e sugerir uma correção.

Na função pegararquivos, você está lendo o valor da escolha do usuário com scanf("%d", tipodapalavra);, mas você deveria passar o endereço da variável tipodapalavra para a função scanf, assim: scanf("%d", &tipodapalavra);. Sem o &, você está tentando escrever o valor lido diretamente no local de memória que corresponde ao valor da variável, o que é incorreto e pode causar um comportamento indefinido, como o fechamento do programa.

Além disso, outro ponto de atenção é a chamada recursiva para main() na função jogardenovo(). Isso não é uma boa prática e pode levar a um estouro de pilha se o jogador decidir jogar muitas vezes seguidas. Uma solução melhor seria usar um loop na função main() para repetir o jogo.

Aqui está um exemplo de como você poderia reestruturar a função main() para evitar chamadas recursivas:

int main() {
    bool jogar_novamente = true;
    
    while (jogar_novamente) {
        abertura();

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

        escolheapalavra(palavrasecreta);

        do {
            escreverletra(palavrasecreta, chutes, chutesdados);
            chuta(chutes, &chutesdados);
        } while (!enforcou(chutesdados, chutes, palavrasecreta));

        mensagemdederrota(palavrasecreta);
        jogar_novamente = jogardenovo();
    }
    
    return 0;
}

bool jogardenovo() {
    char novojogo;
    printf("\n");
    printf("Quer tentar denovo? (S) ou (N)");
    scanf(" %c", &novojogo);
    printf("\n");
    if (novojogo == 'S') {
        printf("Entao vamos la! :)");
        Sleep(3000);
        system("cls");
        return true;
    } else {
        printf("Que pena! :(");
        Sleep(3000);
        system("cls");
        return false;
    }
}

Faça essas alterações e veja se o problema persiste. Se o erro continuar, recomendo que você verifique também se os arquivos de texto estão sendo abertos corretamente e se o conteúdo deles está no formato esperado pelo seu programa.

Espero ter ajudado e bons estudos!