Save some elements of a struct array in another struct array

2

I have defined a struct array struct CAMPO campo[2] in which it will be pointed to by a pointer struct CAMPO *ptr_campo and this pointer will be pointed at the entered players in the field, here is the code defined ...

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

#define MAX 10
#define MAX_PONTOS 10

typedef struct JOGADOR JOGADOR;
typedef struct CAMPO CAMPO;

struct JOGADOR {
    int num_jogador;
    int pontos;
};

struct CAMPO {
    struct JOGADOR jogadores[MAX];
};

/*novo jogador*/
struct JOGADOR novo_jogador;
/*apontador para  novo jogador*/
struct JOGADOR *ptr_jogador;
/*Array campo jogo e campo prolonagamento*/
struct CAMPO campo[2];
/*apontador para campo jogo e campo prolonagamento */
struct CAMPO *ptr_campo;

/*Prototipos das funções*/
void criar_jogador_no_campo0(void);
void definir_vencedor_ou_empate_jogo(void);
void adicionar_jogadores_empatados_campo1(int, int);
void mostrar_jogadores_no_prolongamento(void);
...
}

In this function create the player and insert in the field, that is the campo[0]

void criar_jogador_no_campo0(void) {

    int i, j;
    //aponta para campo de jogo
    ptr_campo = &campo[0];

    for (i = 0, j = 0; i < MAX; i++) {
        campo[0] = *(ptr_campo);
        novo_jogador.num_jogador++;
        novo_jogador.pontos = 1 + rand() % MAX_PONTOS;
        ptr_jogador = &novo_jogador;
        campo[0].jogadores[i] = *ptr_jogador;
        *(ptr_campo) = campo[0];
        printf(">> Criar jogador %d com pontos %d no campo[0]...\n",
                ptr_campo->jogadores[i].num_jogador,
                ptr_campo->jogadores[i].pontos);
        j++;
    }

    if (j == MAX) {
        definir_vencedor_ou_empate_jogo();
    }
}

In this function set the winning player with the highest number of points or in the case of a tie they will go to the prologging field, ie campo[1]

void definir_vencedor_ou_empate_jogo(void) {

    int j, k, m, t;
    int contador = 0;
    int max = 0;

    puts("\n Determinar o jogador vencedor ou em situação de empate\n");
    //para todos os jogadores
    for (j = 0; j < MAX; j++) {
        //se o jogador listado tiver mais pontos marcados do que max
        if (ptr_campo->jogadores[j].pontos > max) {
            //max = pontos do jogador
            max = ptr_campo->jogadores[j].pontos;
            //contador será igual a um
            contador = 1;
            //se tiver os mesmo pontos que max
        } else if (ptr_campo->jogadores[j].pontos == max) {
            //incrementa o contador
            contador++;
        }
    }//se contador for igual a um
    if (contador == 1) {
        //para todos os jogadores
        for (k = 0; k < MAX; k++) {
            //se o jogador listado tiver mais do que max pontos
            if (ptr_campo->jogadores[k].pontos == max) {
                //o jogador iterado é o vencedor
                printf(">> Jogador %d é o VENCEDOR com %d pontos(s)\n",
                        ptr_campo->jogadores[k].num_jogador,
                        ptr_campo->jogadores[k].pontos);
            }
        }//caso contrário (contador diferente de um)
    } else {
        //iterar todos os jogadores
        for (m = 0; m < MAX; m++) {
            //se os pontos do jogador listado for igual a max
            if (ptr_campo->jogadores[m].pontos == max) {
                //o jogador iterado faz parte do prolongamento
                printf(">> Jogador %d com %d pontos(s) e vai para campo[1]\n", 
                        ptr_campo->jogadores[m].num_jogador,
                        ptr_campo->jogadores[m].pontos);
            }
        }
        puts("\n\t\t--- Lista de Jogadores para campo[1] ---");
        //iterar todos os jogadores
        for (t = 0; t < MAX; t++) {
            //se os pontos do jogador listado for igual a max
            if (ptr_campo->jogadores[t].pontos == max) {
                //o jogador iterado faz parte 
               //da lista de jogadores para prolongamento
                 adicionar_jogadores_empatados_campo1
                       (ptr_campo->jogadores[t].num_jogador, contador);
            }
        }
    }
}

My doubt starts in this function in adding only the players tied in campo[0] to campo[1] , in order to get the winner, type after draw will go to the prolongation, but I do not know if it will be necessary, add them to the new array field or I'm not sure what to ask ....

void adicionar_jogadores_empatados_campo1(int num_jogador, int quant_jogador) {

    int j = 0;
    //aponta para campo de prolongamento
    //*(ptr_campo + 1) = &campo[1]; //-> dá erro

    for (int i = 0; i < MAX; i++) {
        if (num_jogador == ptr_campo->jogadores[i].num_jogador) {
            campo[1] = *(ptr_campo + i);
            campo[1].jogadores[i] = ptr_campo->jogadores[i];
            *(ptr_campo + i) = campo[1];
            printf("\t\t\t Jogador %d com %d pontos(s) adicionado no campo[1]\n",
                    (ptr_campo + i)->jogadores[i].num_jogador,
                    (ptr_campo + i)->jogadores[i].pontos);
            j++;
        }
    }

    if (j == quant_jogador) {
        //mostra os jogadores no prolongamento
        mostrar_jogadores_no_prolongamento();
    }
}

In this function will show the players added in campo[1]

void mostrar_jogadores_no_prolongamento(void) {
    printf("\n\n--- Ponteiro para Campo 1 ---");
    for (int i = 0; i < MAX; i++) {
        //mostra os valores do novo ponteiro
        printf("\nAponta para ->Jogador %d com pontos %d no campo[1]",
                (ptr_campo + i)->jogadores[i].num_jogador,
                (ptr_campo + i)->jogadores[i].pontos);
    }
}

function main

int main(void) {

    criar_jogador_no_campo0();

    return 0;
}

Each time I test the program, it shows only this data below, never give a tie despite testing several times

Thisquestionissimilartotheonethatwasresolvedyesterday view link only yesterday post was used an array of integers and in that doubt is used a struct array to store players in different situations

See running on ideone .

    
asked by anonymous 14.11.2015 / 11:05

1 answer

2

A first problem with your code is that you are not feeding the pseudorandom number generator seed correctly, so the rand result is predictable.

To change the value of the seed, use the srand function. A good seed is the current time:

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

int main(void) {

    srand((unsigned int)time(NULL));

    criar_jogador_no_campo0();

    return 0;
}

In addition, there is confusion about pointers in the adicionar_jogadores_empatados_campo1 and mostrar_jogadores_no_prolongamento functions.

A pointer to the extension field can be obtained as follows:

struct CAMPO *ptr_campo_2 = ptr_campo + 1;

Using this pointer you can rewrite your function as follows:

void adicionar_jogadores_empatados_campo1(int num_jogador, int quant_jogador) {

    int j = 0;

    for (int i = 0; i < MAX; i++) {
        if (num_jogador == ptr_campo->jogadores[i].num_jogador) {
            ptr_campo_2->jogadores[i] = ptr_campo->jogadores[i];
            printf("\t\t\t Jogador %d com %d pontos(s) adicionado no campo[1]\n",
                    ptr_campo_2->jogadores[i].num_jogador,
                    ptr_campo_2->jogadores[i].pontos);
            j++;
        }
    }
    // O maior valor possível de j eh quant_jogador - 1
    if (j + 1 == quant_jogador) {
        //mostra os jogadores no prolongamento
        mostrar_jogadores_no_prolongamento();
    }
}

Of course you can also get the pointer to the extension field from the game field address with the expression (ptr_campo + 1) , so you could rewrite your mostrar_jogadores_no_prolongamento function like this:

void mostrar_jogadores_no_prolongamento(void) {
    printf("\n\n--- Ponteiro para Campo 1 ---");
    for (int i = 0; i < MAX; i++) {
        //mostra os valores do novo ponteiro
        printf("\nAponta para ->Jogador %d com pontos %d no campo[1]",
                (ptr_campo + 1)->jogadores[i].num_jogador,
                (ptr_campo + 1)->jogadores[i].pontos);
    }
}

But if you already have a pointer to the extension field there is no reason to repeat the arithmetic of pointers. Just use the original pointer:

printf("\nAponta para ->Jogador %d com pontos %d no campo[1]",
         ptr_campo_2->jogadores[i].num_jogador,
         ptr_campo_2->jogadores[i].pontos);
    
14.11.2015 / 14:28