
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define MAX_JOGADOR       7//numero maximo de jogadores
#define MAX_BOLA_JOGADOR  2//numero maximo de bolas para cada jogador
#define MAX_BOLA          5//numero maximo de bolas para jogo

typedef struct BOLA BOLA;
typedef struct JOGADOR JOGADOR;
typedef struct CAMPO CAMPO;

struct BOLA {//cada bola
    int num_bola; //contem um numero de bola
};

struct JOGADOR {//cada jogador
    int num_jogador; //contem um numero de jogador
    struct BOLA bola[MAX_BOLA_JOGADOR]; //entre uma a duas bolas
    int qt_bola_jogador; //quantidade bola
};

struct CAMPO {
    struct JOGADOR jogadores[MAX_JOGADOR]; //contem no maximo 7 jogadores 
    struct BOLA bolas[MAX_BOLA]; //possui no maximo 5 bolas para cada jogo
};

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

void jogador_recebe_bola(void);
void criar_bola(void);
void criar_jogador(void);

//nesta função cria os jogadores e adiciona ao ponteiro_campo, 
//e está função funciona na perfeição

void criar_jogador(void) {

    int i, j; //identificador para incrementar criação de jogador

    //alocaçao de memoria para simular jogo
    ptr_campo = (CAMPO *) malloc(sizeof (ptr_campo));

    printf("\n--- JOGADOR ---\n");

    /* criar jogador*/
    for (i = 0, j = 0; i < MAX_JOGADOR; i++) {
        novo_jogador.num_jogador++; //incrementa o numero de jogador
        novo_jogador.qt_bola_jogador = 0;
        ptr_jogador = &novo_jogador;
        ptr_campo->jogadores[i] = *ptr_jogador; //adicionar o jogador no campo
        printf(">> Criando jogador %d...\n\n", ptr_campo->jogadores[i].num_jogador);
        j++;
    }

    if (j == MAX_JOGADOR) {
        //criar bola
        criar_bola();
    }
}


//nesta função cria a bola e adiciona ao ponteiro_campo,
//e está função também funciona na perfeição

void criar_bola(void) {

    int k, m; //identificador para incrementar criação de bola

    printf("\n--- BOLA ---\n");

    /*cria bola*/
    for (k = 0, m = 0; k < MAX_BOLA; k++) {
        nova_bola.num_bola++; //incrementa o numero da bola
        ptr_bola = &nova_bola;
        ptr_campo->bolas[k] = *ptr_bola; //atribuir a baliza para cada jogador
        printf(">> Criar bola %d...\n\n", ptr_campo->bolas[k].num_bola);
        m++;
    }

    if (m == MAX_BOLA) {
        //criar bola
        jogador_recebe_bola();
    }
}

//A minha dúvida é nesta função jogador recebe bola, 
//a função funciona quando o numero de bola for 1 e/ou 2 bolas 
//e se no caso for 3 bolas, como mostra na imagem abaixo o codigo,
//em vez de dizer que o jogador tem bola nº3, diz que tem bola nº4 e 
//funciona só que quando o jogador que tem bola nº3, diz que tem bola nº0

void jogador_recebe_bola(void) {

    int recebe_bola = 0;
    int j, m, p;
    srand(time(NULL));

    printf("\n--- JOGADOR RECEBE BOLA---\n");

    //faz um loop
    for (m = 0, p = 0; m < MAX_BOLA; m++) {
        //captura a bola
        if (m + 1 == ptr_campo->bolas[m].num_bola) {
            //escolhe um jogador aleatorio
            recebe_bola = 1 + rand() % MAX_JOGADOR;
            ////faz um loop
            for (j = 0; j < MAX_JOGADOR; j++) {
                //captura o jogador a receber bola
                if ((j + 1 == ptr_campo->jogadores[j].num_jogador)
                        //jogador escolhido igual ao que está no campo
                        && (recebe_bola == ptr_campo->jogadores[j].num_jogador)) {
                    //escolhe o jogador x
                    printf(">> Jogador %d foi escolhido para receber bola %d...\n",
                            ptr_campo->jogadores[j].num_jogador, m + 1);
                    //recebe a bola do campo
                    ptr_campo->jogadores[j].bola[m] = ptr_campo->bolas[m];
                    //incrementa a quantidade de bola
                    ptr_campo->jogadores[j].qt_bola_jogador++;
                    //a bola nº y foi para jogador x
                    printf("\t>> Bola %d foi para jogador %d...\n",
                            ptr_campo->bolas[m].num_bola,
                            ptr_campo->jogadores[j].num_jogador);
                    //o jogador x tem bola nºy
                    printf(">> Jogador %d tem a bola %d...\n\n",
                            ptr_campo->jogadores[j].num_jogador,
                            ptr_campo->jogadores[j].bola[m].num_bola);
                }
            }
        }
    }
}

//função main

int main(void) {
    //criar jogador
    criar_jogador();

    return 0;
}


