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;
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]);
}
}
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;
}
Pergunta
eusouthalles
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
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.