Jump to content
mirador_22

[Resolvido] aceder aos valores de uma struct[] adicionados numa outra struct em C

Recommended Posts

mirador_22

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);

função criar jogador

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

função criar bola

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

função comecar jogo

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

função main

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

zWTQ0qD.png?1

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, e o problema é se o numero de jogador for pelo 10 então, vou ter que criar 10 cases para comparar os valores?

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 (case 1 e case 2) 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.

Edited by mirador_22

Share this post


Link to post
Share on other sites
HappyHippyHippo

olha bem para o código da primeira situação. a única coisa que diz que é erro é a mensagem.

na realidade não existe erro nenhum, é simplesmente o passo do ciclo da pesquisa do jogador que recebe a bola


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mirador_22

olha bem para o código da primeira situação. a única coisa que diz que é erro é a mensagem.

na realidade não existe erro nenhum, é simplesmente o passo do ciclo da pesquisa do jogador que recebe a bola

por acaso, já consegui resolver o algoritimo e agora já consegui saber em que baliza que o jogador está e em qt bolas ele tem

de qualquer maneira, obrigado

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.