예제 #1
0
파일: jogo.c 프로젝트: zml/BattleShips
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;	
				}  
			}
   		}		
  	}
}
예제 #2
0
파일: hfame.c 프로젝트: zml/BattleShips
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);
}
예제 #3
0
파일: jogadores.c 프로젝트: zml/BattleShips
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);

}
예제 #4
0
파일: jogo.c 프로젝트: zml/BattleShips
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();
  }
	
}
예제 #5
0
파일: jogo.c 프로젝트: zml/BattleShips
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;
}
예제 #6
0
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;

}