Ir para conteúdo
Fórum Script Brasil

zion33

Membros
  • Total de itens

    5
  • Registro em

  • Última visita

Tudo que zion33 postou

  1. E aí pessoal beleza, eu estou desenvolvendo um programa em C que simula uma partida de futebol para 7 jogadores e já consegui terminar o jogo e no caso de haver um vencedor, o programa faz tudo bem mas o problema está em caso de empate entre 4 jogadores jogadores por exemplo: desenvolvi uma função que serve para listar os 7 jogadores por números de golo e /*Função para listar quantidade de remates entre jogadores*/ void listar_jogador_num_golos_jogo(void) { int s; puts("\n\t\t--- Estatisticas de Golos dos Jogadores no Jogo ---"); //para todos os jogadores for (s = 0; s < qt_jogador_jogo; s++) { printf("\t\t\t Jogador %d: %d golo(s)\n", ptr_campo_jogo->jogadores[s].num_jogador, ptr_campo_jogo->jogadores[s].estatistica.qt_golos_marcados); } sleep(1); //determina o vencedor ou prolongamento em caso de empate definir_vencedor_ou_empate_jogo(); } faz exactamente o que pretendido pelo enunciado, tal como mostra a figura e desenvolvi uma outra função que determina o jogador vencedor ou em caso de empate, o jogador seleccionado irá fazer parte do prolongamento /*Função que determina o vencedor ou prologamento em caso de empate*/ void definir_vencedor_ou_empate_jogo(void) { int j, k, m, t; contador_jogadores_jogo = 0; max_golo_jogo = 0; puts("\n Determinar o jogador vencedor ou em caso empate, irá ao prolongamento...\n"); sleep(1); //para todos os jogadores for (j = 0; j < qt_jogador_jogo; j++) { //se o jogador listado tiver mais golos marcados do que max if (ptr_campo_jogo->jogadores[j].estatistica.qt_golos_marcados > max_golo_jogo) { //max = golos do jogador max_golo_jogo = ptr_campo_jogo->jogadores[j].estatistica.qt_golos_marcados; //contador será igual a um contador_jogadores_jogo = 1; //se tiver os mesmo golos que max } else if (ptr_campo_jogo->jogadores[j].estatistica.qt_golos_marcados == max_golo_jogo) { //incrementa o contador contador_jogadores_jogo++; } }//se contador for igual a um if (contador_jogadores_jogo == 1) { //para todos os jogadores for (k = 0; k < qt_jogador_jogo; k++) { //se o jogador listado tiver mais do que max golos if (ptr_campo_jogo->jogadores[k].estatistica.qt_golos_marcados == max_golo_jogo) { //o jogador iterado é o vencedor printf(">> Jogador %d é o VENCEDOR marcando %d golo(s)...\n\n", ptr_campo_jogo->jogadores[k].num_jogador, ptr_campo_jogo->jogadores[k].estatistica.qt_golos_marcados); sleep(1); } }//caso contrário (contador diferente de um) } else { //iterar todos os jogadores for (m = 0; m < qt_jogador_jogo; m++) { //se os golos do jogador listado for igual a max if (ptr_campo_jogo->jogadores[m].estatistica.qt_golos_marcados == max_golo_jogo) { //o jogador iterado faz parte do prolongamento printf(">> Jogador %d marcou %d golo(s) e vai para PROLONGAMENTO...\n", ptr_campo_jogo->jogadores[m].num_jogador, ptr_campo_jogo->jogadores[m].estatistica.qt_golos_marcados); sleep(1); } } puts("\n\t\t--- Lista de Jogadores para Prolongamento em situação de empate ---"); //iterar todos os jogadores for (t = 0; t < qt_jogador_jogo; t++) { //se os golos do jogador listado for igual a max if (ptr_campo_jogo->jogadores[t].estatistica.qt_golos_marcados == max_golo_jogo) { //o jogador iterado faz parte da lista de jogadores para prolongamento listar_jogadores_para_prolongamento(ptr_campo_jogo->jogadores[t].num_jogador, contador_jogadores_jogo); } } } } e até aqui tudo bem, e o programa mostra o resultado pretendido, tal como mostra na figura em baixo e o problema começa aqui em usar apenas esses jogadores seleccionados? para iniciar o prolongamento... /*Função*/ void iniciar_prolongamento(void) { int j; srand(time(NULL)); int recebe_bola = 1 + rand() % qt_jogador_jogo; for (j = 0; j < qt_jogador_jogo; j++) { if ((recebe_bola == ptr_campo_jogo->jogadores[j].estatistica.qt_golos_marcados) &&(ptr_campo_jogo->jogadores[j].estatistica.qt_golos_marcados == max_golo_jogo)) { printf("\nMostra o jogador %d...\n", recebe_bola); } sleep(1); } }quando compilo, mostra todos os jogadores, e já pensei em guardar essa lista de jogadores para prolongamento em um apontador externo e também pensei em usar um vetor campo com 3 dimensoes guardar jogadores, para jogo, prolongamento e penalti struct CAMPO campos[3]; /*campo de jogo, prolongamento e penalti*/ struct CAMPO *ptr_campo_jogo; /*apontador para campo*/alguma sugestão?
  2. 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 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.
  3. Pronto já consegui resolver embora ainda existe alguns erros mas é normal, o que eu fiz foi juntar as duas funções em apenas uma função comecar_jogo(void);que faz as duas operações, aqui vai o codigo /* função comecar o jogo */ void comecar_jogo(void) { int m, p; int recebe_bola; int recebe_bola_chutada; int trajetoria_bola; srand(time(NULL)); *ptr_bola = nova_bola; *ptr_jogador = novo_jogador; *ptr_campo = campo; printf("\n\n"); printf("\t\t+====================================+\n"); printf("\t\t| INICIAR JOGO |\n"); printf("\t\t+====================================+\n\n"); for (m = 0, p = 0; m < qt_bola; m++) { recebe_bola = rand() % qt_jogador + 1; printf("Jogador %02d recebe bola %02d...\n", recebe_bola, m + 1); //se o jogador no campo que recebe a bola for igual ao jogador escolhido if (recebe_bola == ptr_campo->jogadores[recebe_bola].num_jogador) {//Duvida //a bola recebida é a mesma que está no campo ptr_campo->jogadores[recebe_bola].t_posse_bola = time(NULL); //tempo de posse bola ptr_campo->jogadores[recebe_bola].bola[m].num_bola = ptr_campo->bolas[m].num_bola; printf("\tA bola %02d foi para jogador %02d na baliza %02d...\n", ptr_campo->bolas[m].num_bola + 1, ptr_campo->jogadores[recebe_bola].num_jogador, ptr_campo->jogadores[recebe_bola].baliza.num_baliza + 1); sleep(1); printf("O jogador %02d na baliza %02d tem a bola %02d...\n\n", ptr_campo->jogadores[recebe_bola].num_jogador, ptr_campo->jogadores[recebe_bola].baliza.num_baliza + 1, ptr_campo->jogadores[recebe_bola].bola[m].num_bola + 1); sleep(1); } p++; } if (p == qt_bola) { while (1) {//para teste //Duvida -> o jogador não chuta para sua baliza recebe_bola_chutada = rand() % qt_jogador + 1; //jogador X tem a bola e chuta para Jogador Y -> Duvida if (ptr_campo->jogadores[recebe_bola_chutada].num_jogador != ptr_campo->jogadores[recebe_bola].num_jogador) { ptr_campo->jogadores[recebe_bola_chutada].bola[m] = ptr_campo->jogadores[recebe_bola].bola[m]; ptr_campo->jogadores[recebe_bola].estatistica.qt_remates++; printf("O jogador %02d chutou a bola %02d para baliza %02d do jogador %02d...\n", ptr_campo->jogadores[recebe_bola].num_jogador + 1, ptr_campo->jogadores[recebe_bola].bola[m].num_bola + 1, ptr_campo->jogadores[recebe_bola_chutada].baliza.num_baliza + 1, ptr_campo->jogadores[recebe_bola_chutada].num_jogador + 1); sleep(1); //Duvida -> o jogador não chuta para sua baliza trajetoria_bola = 1 + rand() % 5; ptr_campo->jogadores[recebe_bola].bola[m].tipo_trajetoria = obter_trajetoria_da_bola(trajetoria_bola); //meio da baliza if (trajetoria_bola == 5) {//para fora printf("\tA bola %02d chutada pelo jogador %02d para baliza %02d do jogador %02d foi %s...\n", ptr_campo->jogadores[recebe_bola].bola[m].num_bola + 1, ptr_campo->jogadores[recebe_bola].num_jogador + 1, ptr_campo->jogadores[recebe_bola_chutada].baliza.num_baliza + 1, ptr_campo->jogadores[recebe_bola_chutada].num_jogador + 1, ptr_campo->jogadores[recebe_bola].bola[m].tipo_trajetoria); } else { printf("\tA bola %02d chutada pelo jogador %02d para baliza %02d do jogador %02d foi %s da baliza...\n", ptr_campo->jogadores[recebe_bola].bola[m].num_bola + 1, ptr_campo->jogadores[recebe_bola].num_jogador + 1, ptr_campo->jogadores[recebe_bola_chutada].baliza.num_baliza + 1, ptr_campo->jogadores[recebe_bola_chutada].num_jogador + 1, ptr_campo->jogadores[recebe_bola].bola[m].tipo_trajetoria); } sleep(1); printf("O jogador %02d na baliza %02d tem a bola %02d...\n\n", ptr_campo->jogadores[recebe_bola_chutada].num_jogador + 1, ptr_campo->jogadores[recebe_bola_chutada].baliza.num_baliza + 1, ptr_campo->jogadores[recebe_bola_chutada].bola[m].num_bola + 1); } } } }aqui o printscreen da simulação nota: o projeto é em C usando tecnicas de sincronização, mas não achei necessario colocar os semaforos ps: alguma sugestão, orientação ou ajuda para imprimir os valores corretos eu agradecia
  4. o objectivo é mais ou menos assim de acordo com o este codigo em baixo..., mas o problema consiste em chamar as funções void dar_bola_ao_jogador(int num_bola, int num_jogador); e função void chutar_bola_para_baliza(int num_bola, int chuta_bola); /* função dar bola ao jogador - aleatorio*/ void bola_para_jogador(void) { int m; int recebe_bola; srand(time(NULL)); *ptr_bola = nova_bola; *ptr_jogador = novo_jogador; *ptr_campo = campo; *ptr_estatistica = estatisticas; printf("\n\n"); printf("\t\t+====================================+\n"); printf("\t\t| INICIAR JOGO |\n"); printf("\t\t+====================================+\n\n"); for (m = 0; m < qt_bola; m++) { printf("Bola %02d\n", m + 1); recebe_bola = rand() % qt_jogador + 1; printf("Jogador %02d recebe bola %02d\n", recebe_bola, m + 1); } printf("\n\n"); printf("\t\t+====================================+\n"); printf("\t\t| JOGO TERMINOU |\n"); printf("\t\t+====================================+\n\n"); }
  5. Ola a todos, estou com uma duvida em chamar funções apartir de outras funções e não corresponde nada, já vi todas as partes e não consigo decifrar o erro e alguma ideia, eu agradecia ps: só foi postado alguma parte de codigo que tenho duvidas #define MAX_NUM_JOGADOR 3//numero maximo de jogadores #define MAX_NUM_BOLA 2//numero maximo de bolas para jogo 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[MAX_NUM_BOLA]; // existem várias bolas entre uma a duas bolas }; // Declaração da estrutura que define o jogador struct CAMPO {//O campo JOGADOR jogadores[MAX_NUM_JOGADOR]; // contem no maximo 5 jogadores BOLA bolas[MAX_NUM_BOLA]; // possui no maximo 3 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 bola_para_jogador(void); void dar_bola_ao_jogador(int, int); void chutar_bola_para_baliza(int, int); // funçao para criar jogador e adicionar ao campo void criar_jogador(void) { int i; //identificador para incrementar criação de jogador /* criar jogador*/ for (i = 0; i < MAX_NUM_JOGADOR; i++) { *ptr_jogador = novo_jogador; novo_jogador.num_jogador++; //incrementa o numero de jogador campo.jogadores[i] = *ptr_jogador; //adicionar o jogador no campo *ptr_campo = campo; printf("Criando jogador %02d...\n\n", ptr_campo->jogadores[i].num_jogador + 1); } } /* função criar bola*/ void criar_bola(void) { int k; //identificador para incrementar criação de bola for (k = 0; k < MAX_NUM_BOLA; k++) { *ptr_bola = nova_bola; nova_bola.num_bola++; //incrementa o numero da bola campo.bolas[k] = *ptr_bola; //adicionar a bola no campo *ptr_campo = campo; printf("Criar bola %02d...\n\n", ptr_campo->bolas[k].num_bola + 1); } } /*função para dar bola ao jogador escolhido aleatoriamente*/ void dar_bola_ao_jogador(int num_bola, int num_jogador){ *ptr_bola = nova_bola; *ptr_jogador = novo_jogador; *ptr_campo = campo; *ptr_estatistica = estatisticas; //se o jogador no campo que recebe a bola for igual ao jogador escolhido if (num_jogador == ptr_campo->jogadores[num_jogador].num_jogador) {//Duvida //a bola recebida é a mesma que está no campo ptr_campo->jogadores[num_jogador].t_posse_bola = time(NULL); //tempo de posse bola ptr_campo->jogadores[num_jogador].bola[num_bola].num_bola = ptr_campo->bolas[num_bola].num_bola; printf("\tA bola %02d foi para jogador %02d na baliza %02d...\n\n", ptr_campo->bolas[num_bola].num_bola + 1, ptr_campo->jogadores[num_jogador].num_jogador + 1, ptr_campo->jogadores[num_jogador].baliza.num_baliza + 1); sleep(1); printf("\tO jogador %02d na baliza %02d tem a bola %02d...\n\n", ptr_campo->jogadores[num_jogador].num_jogador + 1, ptr_campo->jogadores[num_jogador].baliza.num_baliza + 1, ptr_campo->jogadores[num_jogador].bola[num_bola].num_bola + 1); } } /*função para jogador X chutar bola para baliza de outro jogador*/ void chutar_bola_para_baliza(int num_bola, int chuta_bola) { int trajetoria_bola; int recebe_bola_chutada; srand(time(NULL)); *ptr_bola = nova_bola; *ptr_jogador = novo_jogador; *ptr_campo = campo; while (1) {//para teste //Duvida -> o jogador não chuta para sua baliza recebe_bola_chutada = rand() % MAX_NUM_JOGADOR + 1; //jogador X tem a bola e chuta para Jogador Y -> Duvida if (ptr_campo->jogadores[recebe_bola_chutada].num_jogador != ptr_campo->jogadores[chuta_bola].num_jogador) { ptr_campo->jogadores[recebe_bola_chutada].bola[num_bola] = ptr_campo->jogadores[chuta_bola].bola[num_bola]; printf("\tO jogador %02d chutou a bola %02d para baliza %02d do jogador %02d...\n\n", ptr_campo->jogadores[chuta_bola].num_jogador + 1, ptr_campo->jogadores[chuta_bola].bola[num_bola].num_bola + 1, ptr_campo->jogadores[recebe_bola_chutada].baliza.num_baliza + 1, ptr_campo->jogadores[recebe_bola_chutada].num_jogador + 1); } } e a minha duvida é nesta parte em chamar as funções void dar_bola_ao_jogador(int num_bola, int num_jogador); e função void chutar_bola_para_baliza(int num_bola, int chuta_bola); /* função dar bola ao jogador - aleatorio*/ void bola_para_jogador(void) { int m, n, p, q; int recebe_bola; srand(time(NULL)); *ptr_bola = nova_bola; *ptr_jogador = novo_jogador; *ptr_campo = campo; printf("\n\n"); printf("\t\t+====================================+\n"); printf("\t\t| INICIAR JOGO |\n"); printf("\t\t+====================================+\n\n"); for (m = 0, p = 0; m < MAX_NUM_BOLA; m++) { recebe_bola = rand() % MAX_NUM_JOGADOR; for (q = 0; q < MAX_NUM_JOGADOR; q++) { if (recebe_bola == ptr_campo->jogadores[q].num_jogador) { dar_bola_ao_jogador(m, ptr_campo->jogadores[q].num_jogador); } } p++; } if (p == qt_bola) { chutar_bola_para_baliza(m, ptr_campo->jogadores[recebe_bola].num_jogador); printf("\n\n"); printf("\t\t+====================================+\n"); printf("\t\t| JOGO TERMINOU |\n"); printf("\t\t+====================================+\n\n"); } } eis a imagem da simulação...
×
×
  • Criar Novo...