Jump to content
Fórum Script Brasil
  • 0

aceder a dados de um struct [] dentro de uma outra struct em C


zion33
 Share

Question

Eu tenho este código em baixo foi baseado para testar um partida de jogo, funciona sem erro semântico e por vezes contem algum erro sintáctico
na qual resulta em erros de obter resultados pretendidos.

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

#define MAX 10
#define N 5

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[2]; // no maximo 2 bolas
}; // Declaração da estrutura que define o jogador

struct CAMPO {//O campo
    JOGADOR jogadores[MAX]; // contem no maximo 10 jogadores
    BOLA bolas[N]; // possui no maximo 5 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 comecar_jogo(void);

void criar_jogador(void) {

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

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

void criar_bola(void) {

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

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

void comecar_jogo(void) {

    int m, j;
    int recebe_bola;
    srand(time(NULL));

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

    for (m = 0; m < N; m++) {
        recebe_bola = rand() % MAX + 1;
        printf("\tJogador %02d recebe bola %02d...\n", recebe_bola, m + 1);
        for (j = 0; j < MAX; j++) {
            if (recebe_bola == ptr_campo->jogadores[j].num_jogador) {
                ptr_campo->jogadores[j].bola[m].num_bola = ptr_campo->bolas[m].num_bola;
                printf("\tA bola %02d foi para jogador %02d...\n", ptr_campo->bolas[m].num_bola,
                        ptr_campo->jogadores[j].num_jogador);
                printf("\tO jogador %02d tem a bola %02d...\n\n", ptr_campo->jogadores[j].num_jogador,
                        ptr_campo->jogadores[j].bola[m].num_bola);
            } else {
                printf("\tERRO: Jogador %02d não recebeu bola %02d...\n\n", ptr_campo->jogadores[j].num_jogador,
                        ptr_campo->bolas[m].num_bola);
            }
        }
    }
}

void main(void) {

    printf("\t\t+====================================+\n");
    printf("\t\t|          INICIAR PROGRAMA          |\n");
    printf("\t\t+====================================+\n\n");
    //criar jogador
    criar_jogador();
    //criar_bola
    criar_bola();
    //começa o jogo
    comecar_jogo();
    printf("\t\t+====================================+\n");
    printf("\t\t|         TERMINAR PROGRAMA          |\n");
    printf("\t\t+====================================+\n\n");
}

testando o main, obtive esse resultado como mostra na seguinte figura

Captura_de_tela_de_2015-10-29_22-08-18.t

 

 

 

 

de facto, o erro ocorre na função começa jogo

for (m = 0; m < N; m++) {
        recebe_bola = rand() % MAX + 1;
        printf("\tJogador %02d recebe bola %02d...\n", recebe_bola, m + 1);
        for (j = 0; j < MAX; j++) {
            if (recebe_bola == ptr_campo->jogadores[j].num_jogador) {
                ptr_campo->jogadores[j].bola[m].num_bola = ptr_campo->bolas[m].num_bola;
                printf("\tA bola %02d foi para jogador %02d...\n", ptr_campo->bolas[m].num_bola,
                        ptr_campo->jogadores[j].num_jogador);
                printf("\tO jogador %02d tem a bola %02d...\n\n", ptr_campo->jogadores[j].num_jogador,
                        ptr_campo->jogadores[j].bola[m].num_bola);
            } else {
                printf("\tERRO: Jogador %02d não recebeu bola %02d...\n\n", ptr_campo->jogadores[j].num_jogador,
                        ptr_campo->bolas[m].num_bola);
            }
        }
    }

 

alterei para switch para fazer teste e deu certo, se no caso for criado todas as cases,

for (m = 0; m < N; m++) {
        recebe_bola = rand() % MAX + 1;
        printf("Jogador %02d recebe bola %02d...\n", recebe_bola, m + 1);
        switch (recebe_bola) {
            case 1:
                //a bola recebida é a mesma que está no campo
                ptr_campo->jogadores[recebe_bola].bola[m].num_bola = ptr_campo->bolas[m].num_bola;
                printf("\tA bola %02d foi para jogador %02d...\n",
                        ptr_campo->bolas[m].num_bola,
                        ptr_campo->jogadores[recebe_bola].num_jogador + 1);
                printf("O jogador %02d tem a bola %02d...\n\n",
                        ptr_campo->jogadores[recebe_bola].num_jogador + 1,
                        ptr_campo->jogadores[recebe_bola].bola[m].num_bola);
                break;
            case 2:
                //a bola recebida é a mesma que está no campo
                ptr_campo->jogadores[recebe_bola].bola[m].num_bola = ptr_campo->bolas[m].num_bola;
                printf("\tA bola %02d foi para jogador %02d...\n",
                        ptr_campo->bolas[m].num_bola,
                        ptr_campo->jogadores[recebe_bola].num_jogador + 1);
                printf("O jogador %02d tem a bola %02d...\n\n",
                        ptr_campo->jogadores[recebe_bola].num_jogador + 1,
                        ptr_campo->jogadores[recebe_bola].bola[m].num_bola);
                break;
            default:
                printf("ERRO em jogador %02d recebe bola ...\n\n", ptr_campo->jogadores[m].num_jogador);
                break;
        }
    }

nesse caso, funciona mas para os dois casos e agora o problema é aceder aos valores dentro da estrutura para que possa comparar e se for igual ao que foi criado, retorna verdadeira mas não está dando certo, agradeço alguma sugestão.

Link to comment
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

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...