Ir para conteúdo
Fórum Script Brasil
  • 0

Falha de Segmentação (Trabalho Pokemon Go)


eusouthalles

Pergunta

Bom Dia Companheiros.

Estou fazendo um trabalho para a faculdade cujo o objetivo é simular o jogo pokemon Go em C.

 No desenvolvimento do código eu criei uma função transfere dados que tem como objetivo ler do arquivo um numero inteiro que corresponde ao golpe desse pokémon em outro arquivo.

Porém essa função esta me gerando problemas pois ela esta dando erro de segmentação, save me pls.

Segue o código:

#include <stdio.h>
#include <math.h>
#define numPokemon 151 // 151 Pokemons, criada para o ler os status dos respectivos Pokemons no laço for

void asterisco()
{
    printf("\n");
    for (int i = 0; i < 50 ; i++)
        printf("*");
    printf("\n");
}
typedef struct{
    int t_golpe[16];  // tipo de golpe (fire, grass...)
    float g_energia; // ganho de energia
    char nomeGolpe[210], modoGolpe[210]; // modo: rápido ou carregado
    float f_golpe;
    int numGolpe[206];
}Golpes; //struct criada para armazenar os dados dos Golpes: força, tipo, ganho de energia, nome do golpe e modo do Golpe (rápido ou carregado)

typedef struct {
    float lvl;
    char nome[51];
    int num,speed,tipo1[20],tipo2[20];
    float ataque, defesa, stamina,hp;
    int numAtk[6];
    Golpes fGolpe[2];
}Pokemon;

typedef struct {
    Pokemon poke[3];
    Golpes TmodoGolpe;
}treinador;

Pokemon monstro[numPokemon];
Golpes  ataque[207];

void Read_Data()
{ //função para ler os dados dos pokèmons
    FILE *status; // arquivo "Pokemon.txt" com os dados dos pokèmons
    status = fopen("pokemon.txt", "r");
    if (status == NULL) {
        printf("Erro na abertura de Pokemóns\n");
    }
        for (int i = 1 ; i < numPokemon ; i++) { // loop para pegar os dados dos 151 pokèmons %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            fscanf(status, "%d %s %f %f %f %d %d", &monstro.num, monstro.nome, &monstro.stamina, &monstro.ataque, &monstro.defesa, monstro.tipo1, monstro.tipo2);
        }
    fclose(status);
}

void Battle(Pokemon p1[], Pokemon p2[]) // não terminado
{
    int i = 0, j = 0;
    while (i < 3 && j < 3) {
        int bate = (p1.speed > p2[j].speed) ? 0 : 1;
        while (p1.hp > 0 && p2[j].hp > 0) {
            if (bate == 0) { // P2[j] sofre dano
               p2.hp -= ((2 * p1.lvl / 5 + 2) * p1.fGolpe.f_golpe * (p1.ataque / p2[j].defesa)) / 50 + 2;
                bate = 1;
                } else { // P1 sofre dano
                p1.hp -= ((2 * p2[j].lvl / 5 + 2) * p2[j].fGolpe.f_golpe * (p2[j].ataque / p1.defesa)) / 50 + 2;
                bate = 0;
                }
          }
            if (p1.hp > 0) { // p1 sobreviveu
              printf("Pokemon %d (Player %d) ganhou de %d com %f de hp restante\n", p1.num, 1, p2[j].num, p1.hp);
              j++;
            } else { // p2[j] sobreviveu
              printf("Pokemon %d (Player %d) ganhou de %d com %f de hp restante\n", p2[j].num, 2,  p1.num, p2[j].hp);
              i++;
            }
      }
}

void LerGolpe()
{
    FILE *polgues; // arquivo Golpes
    polgues = fopen("ataques.txt", "r"); //recebe os dados do golpe
    if(polgues == NULL) {
        printf("Erro na abertura do arquivo\n");
    }
    for(int i = 0 ; i < 207 ; i++) {
        fscanf(polgues, "%d", ataque.t_golpe);
        fscanf(polgues,"%c",ataque.modoGolpe);
        fgets(ataque.nomeGolpe, 23, polgues);
        fscanf(polgues, "%f %f", &ataque.f_golpe, &ataque.g_energia);
        fscanf(polgues,"%d",ataque.numGolpe);
    }
    fclose(polgues);
}

Pokemon EscolhePokemon()  
{   
    Pokemon p;
    int num;
       scanf("%d", &num); //  numero correspondente ao pokèmon escolhido e lvl do pokèmon
       if (num < 0 || num > 151) // para controlar a escolha de pokèmon
        {
            printf("Pokemon invalido\n");
        }
        scanf ("%f", &monstro[num].lvl);
        monstro[num].hp = (monstro[num].stamina * 2 * monstro[num].lvl)/100 + monstro[num].lvl + 10; // cálculo do hp
        p=monstro[num];
        return p;
}

void TransfereDados()
{
    FILE *dadosPoke;
    dadosPoke = fopen("ataque_cada_Pokemon_1", "r");
    if(dadosPoke == NULL){
        printf("Erro na abertura dos dados de cada pokémon");
        }
    for(int i = 0 ; i < 151 ; i++) { // 150 pois o meu é diferente dos demais
    fscanf(dadosPoke, "%d %d %d %d %d %d %d", &monstro.numAtk[0], &monstro.numAtk[1], &monstro.numAtk[2], &monstro.numAtk[3], &monstro.numAtk[4], &monstro.numAtk[5], &monstro.numAtk[6]);     
    }
}

void EscolheGolpe(Pokemon escolhido)
{
    Golpes GolpesPossiveis[7];
    printf("Escolha o Golpe: \n");
    for(int i=0; i<7;i++){
            for(int j=0; j<207;j++){            
                if(escolhido.numAtk == *ataque[j].numGolpe){
                    GolpesPossiveis = ataque[j];
                    }
                }
              printf("%s\n",GolpesPossiveis.nomeGolpe);
             }
    
}       


int main () {
    Pokemon A[3];
    Read_Data();
    LerGolpe();
    TransfereDados();
    printf("Escolha 3 pokemons\n");
    printf("Digite o valor correspondente ao Pokemon e o seu nivel: ");
    for(int i=0;i<3;i++){
        A = EscolhePokemon();
        EscolheGolpe(A);
    }
    return 0;
}

 

 

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...