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

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


zion33

Pergunta

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 para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

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,7k
×
×
  • Criar Novo...