void ImprimeMapa(char mapa[10][10], int fd , char * erro) { int i,j; char c='-'; for ( i = 0; i < 10; i++ ) { for ( j =0; j < 10; j++ ) { if(mapa[i][j]<6) { if(Escreve(fd,(char*)&c,1,erro)==1) return; } else { if(mapa[i][j]=='/') {if(Escreve(fd,"/",1,erro)==1) return; } else { if(Escreve(fd,"t",1,erro)==1) return; } } } } }
void ImprimeQuadroHonra(int fd,char*erro) { QuadroHonra *l = inicio; pthread_mutex_lock(&rqh); leitores++; if(leitores==1) pthread_mutex_lock(&wqh); pthread_mutex_unlock(&rqh); if(Escreve(fd,(char*) &num_QuadroHonra, 1,erro)==1) l = NULL; if(num_QuadroHonra!=0) { while(l!=NULL) { if(Escreve( fd, (char*) &(l->id), 8,erro)==1) break; if(Escreve( fd, (char*) &(l->score), 1 ,erro)==1) break; l = l->seg; } } pthread_mutex_lock(&rqh); leitores--; if(leitores==0) pthread_mutex_unlock(&wqh); pthread_mutex_unlock(&rqh); }
void ImprimeListaJogadores(int fd, char *erro) { int i; Lista_Jogadores *l; pthread_mutex_lock(&rlj); leitores++; if(leitores==1) pthread_mutex_lock(&wlj); pthread_mutex_unlock(&rlj); if(Escreve(fd,(char*) &(base->num_inscritos), 1 ,erro )!=1) { for(i=0; i<HLEN; i++) { l = base->lista[i]; while(l!=NULL) { if(Escreve(fd,(char*) l->jogador.id,8,erro)==1) { i = HLEN; break;} if(Escreve(fd,(char*) l->jogador.ip,4,erro)==1) { i = HLEN; break;} if(Escreve(fd,(char*) &(l->jogador.porto),2,erro)==1) { i = HLEN; break;} if(Escreve(fd,(char*) &(l->jogador.score),1,erro)==1) { i = HLEN; break;} l = l->seg; } } } pthread_mutex_lock(&rlj); leitores--; if(leitores==0) pthread_mutex_unlock(&wlj); pthread_mutex_unlock(&rlj); }
void* jogo() { char mapa[10][10]; char comando[1]; char comando_coord[2]; unsigned char score; char erro; int fd; int i; char fim_jogo; char fim_sessao; unsigned char num_disparos; Navios nav; CoordenadaS coord; char id[8]; signal(SIGUSR1,Fexit); signal(SIGPIPE,Fbuf); while(1) { sem_wait(sem_threads); /*Copia os argumentos*/ for(i=0;i<8;i++) id[i] = transporte_id[i]; fd = transporte_fd; pthread_mutex_unlock(&lock_id); fim_sessao = 0; erro = 0; if(write( fd,"i",1 )==-1) erro = 1; while(!fim_sessao && !erro) { /* Gera o novo mapa*/ pthread_mutex_lock(&lock_mapa); GeraMapa(&nav,mapa,semente); pthread_mutex_unlock(&lock_mapa); /* Faz reset a flag e ao contador de pontuacao*/ fim_jogo = 0; num_disparos = 0; while(!fim_jogo && !erro) { if(read(fd,comando,1)==-1) {erro = 1; comando[0]='x';} /* o comando e testado e a resposta e enviada para o cliente */ /* em qualquer momento, se houver um erro de escrita, a flag erro*/ /* e posta a 1 */ switch(comando[0]) { case 'r': Escreve(fd,comando,1,&erro); fim_jogo = 1; break; case 't': if(Escreve(fd,comando,1,&erro)==1) break; score = MelhorResultado(); Escreve(fd,(char*)&score,1,&erro); fim_jogo = 1; fim_sessao = 1; break; case 'h': if(Escreve(fd,comando,1,&erro)==1) break; ImprimeQuadroHonra(fd,&erro); break; case 'e': if(Escreve(fd,comando,1,&erro)==1) break; if(Escreve(fd,(char*)&num_disparos,1,&erro)==1) break; score = MelhorResultado(); if(Escreve(fd,(char*)&score,1,&erro)==1) break; ImprimeMapa(mapa,fd,&erro); break; case 'c': if(Escreve(fd,comando,1,&erro)==1) break; ImprimeListaJogadores(fd,&erro); break; case 'd':{ if(read(fd,comando_coord,2)==-1) erro = 1; if( VerificaDisparo(comando_coord,&coord)) { if(Escreve(fd,comando,1,&erro)==1) break; if(ResultadoDisparo(mapa,&nav,coord,&num_disparos,fd,&erro)=='f') { fim_jogo = 1; RegistaResultadoJogador(id,num_disparos); } } break; } default:{ fprintf(stdout,"Comando inexistente-> %d\n",comando[0]); fim_jogo = 1; fim_sessao = 1; break; } } } } TerminaSessao(id,fd); if(erro==1) printf("com erro de ligacao por interface socket\n"); IncrementaThreadsDisponiveis(); } }
char ResultadoDisparo( char mapa[10][10],Navios *nav,CoordenadaS coord,unsigned char * num_disparos,int fd,char *erro) { int x = coord.row; int y = coord.col; int brk,tiros,i,j; char quadricula; char resultado; quadricula = mapa[x][y]; switch(quadricula) { case 0:{(*num_disparos)++; mapa[x][y]='/'; resultado='/'; break; } case 5:{(*num_disparos)++; mapa[x][y]='t'+5; if(--(nav->Quadriculas_PA)==0) resultado='n'; else {resultado='t';} break; } case 4:{(*num_disparos)++; mapa[x][y]='t'+4; if(--(nav->Quadriculas_4C)==0) resultado='n'; else {resultado='t';} break; } case 3:{(*num_disparos)++; mapa[x][y]='t'+3; brk = 0; for(i=0;i<2;i++)/*Encontra o barco na estrutura nav*/ { tiros=0; for(j=0;j<3;j++) { if(mapa[(int)nav->navios3canos[i].posicoes[j].row][(int)nav->navios3canos[i].posicoes[j].col]=='t'+3) tiros++;/*Conta os tiros que acertaram no barco i ate agora*/ if(nav->navios3canos[i].posicoes[j].row==x && nav->navios3canos[i].posicoes[j].col==y) brk=1; /*brk a 1 quando se encontra o barco que levou agora o tiro*/ } if(brk) break; /*Se o barco foi encontrado, sai do loop*/ } if(tiros==3) /*se foram infligidos 3 tiros*/ resultado='n';/*Barco ao Fundo*/ else {resultado='t';} break; } case 2:{(*num_disparos)++; mapa[x][y]='t'+2; brk = 0; for(i=0;i<3;i++)/*Encontra o barco na estrutura nav*/ { tiros = 0; for(j=0;j<2;j++) { if(mapa[(int)nav->navios2canos[i].posicoes[j].row][(int)nav->navios2canos[i].posicoes[j].col]=='t'+2) tiros++;/*Conta os tiros que acertaram no barco i ate agora*/ if(nav->navios2canos[i].posicoes[j].row==x && nav->navios2canos[i].posicoes[j].col==y) brk = 1; /*brk a 1 quando se encontra o barco que levou agora o tiro*/ } if(brk) break; /*Se o barco foi encontrado, sai do loop*/ } if(tiros==2) /*se foram infligidos 2 tiros*/ resultado='n';/*Barco ao Fundo*/ else {resultado = 't';} break; } case 1: {(*num_disparos)++; mapa[x][y]='t'+1; resultado='n'; break; } default: {/*Tiro ja efectuado previamente*/ if(mapa[x][y]=='/') { resultado = '/'; quadricula = 0; } else { resultado = 't'; quadricula = mapa[x][y]-'t'; } break; } } /*Ve se ja foram os navios todos ao fundo*/ if(resultado=='n') if((++(nav->navios_ao_fundo))==NUM_NAVIOS) resultado='f'; if(Escreve(fd,(char*)&resultado,1,erro)==1) return resultado; if(Escreve(fd,(char*)&quadricula,1,erro)==1) return resultado; Escreve(fd,(char*)num_disparos,1,erro); return resultado; }
int main() { char txt[TamMaxTexto]; char auxTxt[TamMaxTexto]; char bits[TamMaxComprimido]; int tamTxt, tamAuxTxt, numBits; /* Lê o texto de entrada */ if (!LeTexto(txt, &tamTxt)) { printf("Problemas com o arquivo de entrada\n"); return 0; } printf("\nTexto original:\n"); printf("--------------------------------------------------\n"); Escreve(txt,tamTxt); printf("--------------------------------------------------\n"); /* Inicializa estruturas */ if(ConstroiHuffman(txt, tamTxt)) { printf("\nÁrvore de Huffman:\n\n"); ImprimeHuffman(); } else { printf("\nNão foi possível construir a árvore\n"); return 0; } if (!Comprime(txt, tamTxt, bits, &numBits, TamMaxComprimido)) { printf("Problemas na compressão\n"); return 0; } printf("\nTexto comprimido:\n"); EscreveBits(bits, numBits); printf("\n"); if (!Descomprime(auxTxt,&tamAuxTxt,bits,numBits,TamMaxTexto)) { printf("Problemas na descompressão\n"); return 1; } printf("\nTexto descomprimido:\n"); printf("--------------------------------------------------\n"); Escreve(auxTxt, tamAuxTxt); printf("--------------------------------------------------\n"); if (tamTxt == tamAuxTxt && strncmp(txt,auxTxt,tamTxt)==0) printf("\nTextos idênticos\n"); else { printf("\nTextos diferentes\n"); return 0; } printf("\nTexto original: %d bytes\n", tamTxt); printf("Cadeia comprimida: %d bits (%d bytes)\n", numBits, numBits % 8 == 0 ? numBits/8 : numBits/8 + 1); printf("Média: %2.1f bits/caractere\n", (float)numBits/(float)tamTxt); LiberaHuffman(); /* Finalização */ int bch = bcheck(); /* Verifica liberação correta de memória dinâmica */ if (bch!=0) { printf("\n%d blocos de memória dinâmica não foram liberados:\n",bch); bapply(bprint); } else{ printf("\nA memória dinâmica foi totalmente liberada\n" ); } printf("\nProcessamento terminado\n"); return 0; }