Jump to content
Fórum Script Brasil
  • 0

Falha de Segmentação (Trabalho Pokemon Go)


Question

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 to post
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Cloud Computing


  • Forum Statistics

    • Total Topics
      148680
    • Total Posts
      644502
×
×
  • Create New...