Jump to content
Fórum Script Brasil
  • 0

chamar função dentro de outra função e não corresponde em C


zion33
 Share

Question

Ola a todos, estou com uma duvida em chamar funções apartir de outras funções e não corresponde nada,

já vi todas as partes e não consigo decifrar o erro e alguma ideia, eu agradecia

ps: só foi postado alguma parte de codigo que tenho duvidas

 

#define MAX_NUM_JOGADOR       3//numero maximo de jogadores
#define MAX_NUM_BOLA       2//numero maximo de bolas para jogo

typedef struct BOLA BOLA; // tipo de dados estruturado BOLA que irá ser declarado
typedef struct JOGADOR JOGADOR; // tipo de dados estruturado JOGADOR que irá ser declarado
typedef struct CAMPO CAMPO; // tipo de dados estruturado CAMPO que irá ser declarado

struct BOLA {//cada bola
    int num_bola; // contem um numero de bola
}; // Declaração da estrutura que define a bola

struct JOGADOR {//cada jogador
    int num_jogador; // contem um numero de jogador
    BOLA bola[MAX_NUM_BOLA]; // existem várias bolas entre uma a duas bolas
}; // Declaração da estrutura que define o jogador

struct CAMPO {//O campo
    JOGADOR jogadores[MAX_NUM_JOGADOR]; // contem no maximo 5 jogadores
    BOLA bolas[MAX_NUM_BOLA]; // possui no maximo 3 bolas para cada jogo
}; // Declaração da estrutura que define o campo

JOGADOR novo_jogador; /*novo jogador*/
BOLA nova_bola; /*nova bola*/
CAMPO campo;

BOLA *ptr_bola; /*apontador para  nova bola*/
JOGADOR *ptr_jogador; /*apontador para  novo jogador*/
CAMPO *ptr_campo; /*apontador para  campo*/

void criar_jogador(void);
void criar_bola(void);
void bola_para_jogador(void);
void dar_bola_ao_jogador(int, int);
void chutar_bola_para_baliza(int, int);

// funçao para criar jogador e adicionar ao campo
void criar_jogador(void) {
    int i; //identificador para incrementar criação de jogador
    /* criar jogador*/
    for (i = 0; i < MAX_NUM_JOGADOR; i++) {
        *ptr_jogador = novo_jogador;
        novo_jogador.num_jogador++; //incrementa o numero de jogador
        campo.jogadores[i] = *ptr_jogador; //adicionar o jogador no campo
        *ptr_campo = campo;
        printf("Criando jogador %02d...\n\n", ptr_campo->jogadores[i].num_jogador + 1);
    }
}

/* função criar bola*/
void criar_bola(void) {
    int k; //identificador para incrementar criação de bola

    for (k = 0; k < MAX_NUM_BOLA; k++) {
        *ptr_bola = nova_bola;
        nova_bola.num_bola++; //incrementa o numero da bola
        campo.bolas[k] = *ptr_bola; //adicionar a bola no campo
        *ptr_campo = campo;
        printf("Criar bola %02d...\n\n", ptr_campo->bolas[k].num_bola + 1);
    }
}

/*função para dar bola ao jogador escolhido aleatoriamente*/
void dar_bola_ao_jogador(int num_bola, int num_jogador){

    *ptr_bola = nova_bola;
    *ptr_jogador = novo_jogador;
    *ptr_campo = campo;
    *ptr_estatistica = estatisticas;

        //se o jogador no campo que recebe a bola for igual ao jogador escolhido
        if (num_jogador == ptr_campo->jogadores[num_jogador].num_jogador) {//Duvida
            //a bola recebida é a mesma que está no campo
            ptr_campo->jogadores[num_jogador].t_posse_bola = time(NULL); //tempo de posse bola
            ptr_campo->jogadores[num_jogador].bola[num_bola].num_bola = ptr_campo->bolas[num_bola].num_bola;
            printf("\tA bola %02d foi para jogador %02d na baliza %02d...\n\n",
                    ptr_campo->bolas[num_bola].num_bola + 1,
                    ptr_campo->jogadores[num_jogador].num_jogador + 1,
                    ptr_campo->jogadores[num_jogador].baliza.num_baliza + 1);
            sleep(1);
            printf("\tO jogador %02d na baliza %02d tem a bola %02d...\n\n",
                    ptr_campo->jogadores[num_jogador].num_jogador + 1,
                    ptr_campo->jogadores[num_jogador].baliza.num_baliza + 1,
                    ptr_campo->jogadores[num_jogador].bola[num_bola].num_bola + 1);

        }

    }

/*função para jogador X chutar bola para baliza de outro jogador*/
void chutar_bola_para_baliza(int num_bola, int chuta_bola) {

    int trajetoria_bola;
    int recebe_bola_chutada;
     srand(time(NULL));

    *ptr_bola = nova_bola;
    *ptr_jogador = novo_jogador;
    *ptr_campo = campo;

    while (1) {//para teste

        //Duvida -> o jogador não chuta para sua baliza
        recebe_bola_chutada = rand() % MAX_NUM_JOGADOR + 1;

        //jogador X tem a bola e chuta para Jogador Y -> Duvida
        if (ptr_campo->jogadores[recebe_bola_chutada].num_jogador != ptr_campo->jogadores[chuta_bola].num_jogador) {
            ptr_campo->jogadores[recebe_bola_chutada].bola[num_bola] = ptr_campo->jogadores[chuta_bola].bola[num_bola];
            printf("\tO jogador %02d chutou a bola %02d para baliza %02d do jogador %02d...\n\n",
                    ptr_campo->jogadores[chuta_bola].num_jogador + 1,
                    ptr_campo->jogadores[chuta_bola].bola[num_bola].num_bola + 1,
                    ptr_campo->jogadores[recebe_bola_chutada].baliza.num_baliza + 1,
                    ptr_campo->jogadores[recebe_bola_chutada].num_jogador + 1);
    }
}


e a minha duvida é nesta parte em chamar as funções

 void dar_bola_ao_jogador(int num_bola, int num_jogador); 
e 
função void chutar_bola_para_baliza(int num_bola, int chuta_bola);

 

/* função dar bola ao jogador - aleatorio*/
void bola_para_jogador(void) {

    int m, n, p, q;
    int recebe_bola;
    srand(time(NULL));

    *ptr_bola = nova_bola;
    *ptr_jogador = novo_jogador;
    *ptr_campo = campo;

    printf("\n\n");
    printf("\t\t+====================================+\n");
    printf("\t\t|            INICIAR JOGO            |\n");
    printf("\t\t+====================================+\n\n");

    for (m = 0, p = 0; m < MAX_NUM_BOLA; m++) {
        recebe_bola = rand() % MAX_NUM_JOGADOR;
        for (q = 0; q < MAX_NUM_JOGADOR; q++) {
            if (recebe_bola == ptr_campo->jogadores[q].num_jogador) {
                dar_bola_ao_jogador(m, ptr_campo->jogadores[q].num_jogador);
            }
        }
        p++;
    }
    if (p == qt_bola) {
        chutar_bola_para_baliza(m, ptr_campo->jogadores[recebe_bola].num_jogador);

        printf("\n\n");
        printf("\t\t+====================================+\n");
        printf("\t\t|           JOGO TERMINOU            |\n");
        printf("\t\t+====================================+\n\n");
    }
}


eis a imagem da simulação...

3.thumb.jpeg.d355f9bb8d32934f613d32ad5b8

 

 

 

Edited by zion33
Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 0

o objectivo é mais ou menos assim

2.thumb.jpeg.75a88b77962f8e05cbb47a5fa01

de acordo com o este codigo em baixo..., mas o problema consiste em chamar as funções

void dar_bola_ao_jogador(int num_bola, int num_jogador);
e função void chutar_bola_para_baliza(int num_bola, int chuta_bola);
 
/* função dar bola ao jogador - aleatorio*/
void bola_para_jogador(void) {
    int m;
    int recebe_bola;
    srand(time(NULL));

    *ptr_bola = nova_bola;
    *ptr_jogador = novo_jogador;
    *ptr_campo = campo;
    *ptr_estatistica = estatisticas;

    printf("\n\n");
    printf("\t\t+====================================+\n");
    printf("\t\t|            INICIAR JOGO            |\n");
    printf("\t\t+====================================+\n\n");

    for (m = 0; m < qt_bola; m++) {
        printf("Bola %02d\n", m + 1);
        recebe_bola = rand() % qt_jogador + 1;
        printf("Jogador %02d recebe bola %02d\n", recebe_bola, m + 1);
    }
    printf("\n\n");
    printf("\t\t+====================================+\n");
    printf("\t\t|           JOGO TERMINOU            |\n");
    printf("\t\t+====================================+\n\n");
}

 

 

 

 

 

Edited by zion33
para corrigir alguns erros semanticos
Link to comment
Share on other sites

  • 0

Pronto já consegui resolver embora ainda existe alguns erros mas é normal, o que eu fiz foi juntar as duas funções em apenas uma função 

comecar_jogo(void);

que faz as duas operações, aqui vai o codigo

/* função comecar o jogo */
void comecar_jogo(void) {

    int m, p;
    int recebe_bola;
    int recebe_bola_chutada;
    int trajetoria_bola;
    srand(time(NULL));

    *ptr_bola = nova_bola;
    *ptr_jogador = novo_jogador;
    *ptr_campo = campo;

    printf("\n\n");
    printf("\t\t+====================================+\n");
    printf("\t\t|            INICIAR JOGO            |\n");
    printf("\t\t+====================================+\n\n");

    for (m = 0, p = 0; m < qt_bola; m++) {
        recebe_bola = rand() % qt_jogador + 1;
        printf("Jogador %02d recebe bola %02d...\n", recebe_bola, m + 1);
        //se o jogador no campo que recebe a bola for igual ao jogador escolhido
        if (recebe_bola == ptr_campo->jogadores[recebe_bola].num_jogador) {//Duvida
            //a bola recebida é a mesma que está no campo
            ptr_campo->jogadores[recebe_bola].t_posse_bola = time(NULL); //tempo de posse bola
            ptr_campo->jogadores[recebe_bola].bola[m].num_bola = ptr_campo->bolas[m].num_bola;

            printf("\tA bola %02d foi para jogador %02d na baliza %02d...\n",
                    ptr_campo->bolas[m].num_bola + 1,
                    ptr_campo->jogadores[recebe_bola].num_jogador,
                    ptr_campo->jogadores[recebe_bola].baliza.num_baliza + 1);
            sleep(1);
            printf("O jogador %02d na baliza %02d tem a bola %02d...\n\n",
                    ptr_campo->jogadores[recebe_bola].num_jogador,
                    ptr_campo->jogadores[recebe_bola].baliza.num_baliza + 1,
                    ptr_campo->jogadores[recebe_bola].bola[m].num_bola + 1);
            sleep(1);
        }
        p++;
    }

    if (p == qt_bola) {
        while (1) {//para teste
            //Duvida -> o jogador não chuta para sua baliza
            recebe_bola_chutada = rand() % qt_jogador + 1;
            //jogador X tem a bola e chuta para Jogador Y -> Duvida
            if (ptr_campo->jogadores[recebe_bola_chutada].num_jogador != ptr_campo->jogadores[recebe_bola].num_jogador) {
                ptr_campo->jogadores[recebe_bola_chutada].bola[m] = ptr_campo->jogadores[recebe_bola].bola[m];
                ptr_campo->jogadores[recebe_bola].estatistica.qt_remates++;
                printf("O jogador %02d chutou a bola %02d para baliza %02d do jogador %02d...\n",
                        ptr_campo->jogadores[recebe_bola].num_jogador + 1,
                        ptr_campo->jogadores[recebe_bola].bola[m].num_bola + 1,
                        ptr_campo->jogadores[recebe_bola_chutada].baliza.num_baliza + 1,
                        ptr_campo->jogadores[recebe_bola_chutada].num_jogador + 1);
                sleep(1);
                //Duvida -> o jogador não chuta para sua baliza
                trajetoria_bola = 1 + rand() % 5;

                ptr_campo->jogadores[recebe_bola].bola[m].tipo_trajetoria = obter_trajetoria_da_bola(trajetoria_bola); //meio da baliza

                if (trajetoria_bola == 5) {//para fora
                    printf("\tA bola %02d chutada pelo jogador %02d para baliza %02d do jogador %02d foi %s...\n",
                            ptr_campo->jogadores[recebe_bola].bola[m].num_bola + 1,
                            ptr_campo->jogadores[recebe_bola].num_jogador + 1,
                            ptr_campo->jogadores[recebe_bola_chutada].baliza.num_baliza + 1,
                            ptr_campo->jogadores[recebe_bola_chutada].num_jogador + 1,
                            ptr_campo->jogadores[recebe_bola].bola[m].tipo_trajetoria);
                } else {
                    printf("\tA bola %02d chutada pelo jogador %02d para baliza %02d do jogador %02d foi %s da baliza...\n",
                            ptr_campo->jogadores[recebe_bola].bola[m].num_bola + 1,
                            ptr_campo->jogadores[recebe_bola].num_jogador + 1,
                            ptr_campo->jogadores[recebe_bola_chutada].baliza.num_baliza + 1,
                            ptr_campo->jogadores[recebe_bola_chutada].num_jogador + 1,
                            ptr_campo->jogadores[recebe_bola].bola[m].tipo_trajetoria);
                }

                sleep(1);
                printf("O jogador %02d na baliza %02d tem a bola %02d...\n\n",
                        ptr_campo->jogadores[recebe_bola_chutada].num_jogador + 1,
                        ptr_campo->jogadores[recebe_bola_chutada].baliza.num_baliza + 1,
                        ptr_campo->jogadores[recebe_bola_chutada].bola[m].num_bola + 1);
            }
        }
    }
}

aqui o printscreen da simulação

nota: o projeto é em C usando tecnicas de sincronização, mas não achei necessario colocar os semaforos

1.thumb.jpeg.72a4a561159e179139d02ac6a77

ps: alguma sugestão, orientação ou ajuda para imprimir os valores corretos

eu agradecia

 

 

 

 

 

Edited by zion33
para corrigir alguns erros semanticos
Link to comment
Share on other sites

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.

 Share



  • Forum Statistics

    • Total Topics
      149.9k
    • Total Posts
      646.8k
×
×
  • Create New...