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

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


zion33

Pergunta

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

 

 

 

Editado por zion33
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 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");
}

 

 

 

 

 

Editado por zion33
para corrigir alguns erros semanticos
Link para o comentário
Compartilhar em outros 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

 

 

 

 

 

Editado por zion33
para corrigir alguns erros semanticos
Link para o comentário
Compartilhar em outros sites

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
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...