Exemple #1
0
/* velocitat de la paleta (variable global v_pal) */
void mou_paleta_ordinador(int * i)
{
  
  int index = (int)i;
  
  do
  {
 /* char rh,rv,rd; */
  f_h[index] = po_pf[index] + v_pal[index];		/* posicio hipotetica de la paleta */
  if (f_h[index] != ipo_pf[index])	/* si pos. hipotetica no coincideix amb pos. actual */
  {
    if (v_pal[index] > 0.0)			/* verificar moviment cap avall */
    {
	pthread_mutex_lock(&mutex3);
  if (win_quincar(f_h[index]+l_pal-1,ipo_pc[index]) == ' ')   /* si no hi ha obstacle */
	{
    pthread_mutex_unlock(&mutex3);
    pthread_mutex_lock(&mutex1);
	  win_escricar(ipo_pf[index],ipo_pc[index],' ',NO_INV);      /* esborra primer bloc */
	  pthread_mutex_unlock(&mutex1);
    po_pf[index] += v_pal[index]; ipo_pf[index] = po_pf[index];		/* actualitza posicio */
	  pthread_mutex_lock(&mutex1);
    win_escricar(ipo_pf[index]+l_pal-1,ipo_pc[index],'1',INVERS); /* impr. ultim bloc */
    pthread_mutex_unlock(&mutex1);
	}
	else{
    pthread_mutex_unlock(&mutex3);
    v_pal[index] = -v_pal[index];   /* si hi ha obstacle, canvia el sentit del moviment */
  }		
	   
    }
    else			/* verificar moviment cap amunt */
    {
  pthread_mutex_lock(&mutex3);
	if (win_quincar(f_h[index],ipo_pc[index]) == ' ')        /* si no hi ha obstacle */
	{
    pthread_mutex_unlock(&mutex3);
    pthread_mutex_lock(&mutex1);
	  win_escricar(ipo_pf[index]+l_pal-1,ipo_pc[index],' ',NO_INV); /* esbo. ultim bloc */
	  pthread_mutex_unlock(&mutex1);
    po_pf[index] += v_pal[index]; ipo_pf[index] = po_pf[index];		/* actualitza posicio */
	  pthread_mutex_lock(&mutex1);
    win_escricar(ipo_pf[index],ipo_pc[index],'1',INVERS);	/* impr. primer bloc */
    pthread_mutex_unlock(&mutex1);
	}
	else{		/* si hi ha obstacle, canvia el sentit del moviment */
     pthread_mutex_unlock(&mutex3);
	   v_pal[index] = -v_pal[index];
   }
    }
  }
  else po_pf[index] += v_pal[index]; 	/* actualitza posicio vertical real de la paleta */
  win_retard(retard);
  }while ((tecla != TEC_RETURN) && (cont==-1));
  pthread_exit(NULL);
}
Exemple #2
0
/*	>0 ==> la pilota ha sortit per la porteria dreta		*/
int moure_pilota(void)
{
  cont=2;
  int f_h, c_h;
  char rh,rv,rd;
  do
  {
  f_h = pil_pf + pil_vf;		/* posicio hipotetica de la pilota */
  c_h = pil_pc + pil_vc;
  cont = -1;		/* inicialment suposem que la pilota no surt */
  rh = rv = rd = ' ';
  if ((f_h != ipil_pf) || (c_h != ipil_pc))
  {		/* si posicio hipotetica no coincideix amb la pos. actual */
    if (f_h != ipil_pf)		/* provar rebot vertical */
    {	rv = win_quincar(f_h,ipil_pc);	/* veure si hi ha algun obstacle */
	if (rv != ' ')			/* si no hi ha res */
	{   pil_vf = -pil_vf;		/* canvia velocitat vertical */
	    f_h = pil_pf+pil_vf;	/* actualitza posicio hipotetica */
	}
    }
    if (c_h != ipil_pc)		/* provar rebot horitzontal */
    {	rh = win_quincar(ipil_pf,c_h);	/* veure si hi ha algun obstacle */
	if (rh != ' ')			/* si no hi ha res */
	{    pil_vc = -pil_vc;		/* canvia velocitat horitzontal */
	     c_h = pil_pc+pil_vc;	/* actualitza posicio hipotetica */
	}
    }
    if ((f_h != ipil_pf) && (c_h != ipil_pc))	/* provar rebot diagonal */
    {	rd = win_quincar(f_h,c_h);
	if (rd != ' ')				/* si no hi ha obstacle */
	{    pil_vf = -pil_vf; pil_vc = -pil_vc;	/* canvia velocitats */
	     f_h = pil_pf+pil_vf;
	     c_h = pil_pc+pil_vc;		/* actualitza posicio entera */
	}
    }
    if (win_quincar(f_h,c_h) == ' ')	/* verificar posicio definitiva */
    {						/* si no hi ha obstacle */
	win_escricar(ipil_pf,ipil_pc,' ',NO_INV);	/* esborra pilota */
	pil_pf += pil_vf; pil_pc += pil_vc;
	ipil_pf = f_h; ipil_pc = c_h;		/* actualitza posicio actual */
	if ((ipil_pc > 0) && (ipil_pc <= n_col))	/* si no surt */
		win_escricar(ipil_pf,ipil_pc,'.',INVERS); /* imprimeix pilota */
	else
		cont = ipil_pc;	/* codi de finalitzacio de partida */
    }
  }
  else { pil_pf += pil_vf; pil_pc += pil_vc; }
  win_retard(retard);
  
  }while((tecla != TEC_RETURN) && (cont==-1));
  
}
Exemple #3
0
/* tercer argument */
int main(int n_args, char *ll_args[])
{
  int i,fil,n_v, id_win,n_fil,n_col;
  int *p_lletres, id_lletres;
  void *p_win;

  if (n_args < 7)
  {   fprintf(stderr,"\tproces (%d): mp_car2 fila n_veg id_lletres id_win n_fil n_col\n",(int) getpid());
	exit(0);
  }
  fil = atoi(ll_args[1]);
  n_v = atoi(ll_args[2]);
  if (n_v > MAX_VEGADES) n_v = MAX_VEGADES;

  id_lletres = atoi(ll_args[3]);
  p_lletres = map_mem(id_lletres);	/* obtenir adres. de mem. compartida */
  if (p_lletres == (int*) -1)
  {   fprintf(stderr,"proces (%d): error en identificador de memoria\n",(int)getpid());
	exit(0);
  }

  id_win = atoi(ll_args[4]);
  p_win = map_mem(id_win);
  if (p_win == (int*) -1)
  {   fprintf(stderr,"proces (%d): error en identificador de finestra\n",(int)getpid());
	exit(0);
  }
  n_fil = atoi(ll_args[5]);		/* obtenir dimensions del camp de joc */
  n_col = atoi(ll_args[6]);

  win_set(p_win,n_fil,n_col);	/* crea acces a finestra oberta pel proces pare */

  srand(getpid());
  for (i=0; i < n_v; i++)	/* per a totes les vegades (n_v) */
  {
    win_retard((1 + rand() % 3)*100);	/* dormir entre 0.1 i 0.3 segons */
    if (*p_lletres > 0)			/* si falten lletres */
    {
	win_escricar(fil,i+1,'a'+fil-1,NO_INV);	/* escriure marca del proces */
 	(*p_lletres)--;				/* una lletra menys */
     }
     else exit(i);	/* provoca sortida del proces */
  }
  return(i);	/* retorna el numero de lletres que ha impres el proces */
}
Exemple #4
0
/* velocitat de la paleta (variable global v_pal) */
void mou_paleta_ordinador(int * i)
{
  int f_h;
  int contador=0;
  int index = (int)i;
  FILE *doc;
  doc = fopen("log.txt","w");
  do
  {
  contador++;
 /* char rh,rv,rd; */
  fprintf(doc,"Iteració: %d\n",contador);

  f_h = po_pf[index] + v_pal[index];		/* posicio hipotetica de la paleta */
  if (f_h != ipo_pf[index])	/* si pos. hipotetica no coincideix amb pos. actual */
  {
    if (v_pal[index] > 0.0)			/* verificar moviment cap avall */
    {
	if (win_quincar(f_h+l_pal-1,ipo_pc[index]) == ' ')   /* si no hi ha obstacle */
	{
	  win_escricar(ipo_pf[index],ipo_pc[index],' ',NO_INV);      /* esborra primer bloc */
	  po_pf[index] += v_pal[index]; ipo_pf[index] = po_pf[index];		/* actualitza posicio */
	  win_escricar(ipo_pf[index]+l_pal-1,ipo_pc[index],'1',INVERS); /* impr. ultim bloc */
	}
	else		/* si hi ha obstacle, canvia el sentit del moviment */
	   v_pal[index] = -v_pal[index];
    }
    else			/* verificar moviment cap amunt */
    {
	if (win_quincar(f_h,ipo_pc[index]) == ' ')        /* si no hi ha obstacle */
	{
	  win_escricar(ipo_pf[index]+l_pal-1,ipo_pc[index],' ',NO_INV); /* esbo. ultim bloc */
	  po_pf[index] += v_pal[index]; ipo_pf[index] = po_pf[index];		/* actualitza posicio */
	  win_escricar(ipo_pf[index],ipo_pc[index],'1',INVERS);	/* impr. primer bloc */
	}
	else		/* si hi ha obstacle, canvia el sentit del moviment */
	   v_pal[index] = -v_pal[index];
    }
  }
  else po_pf[index] += v_pal[index]; 	/* actualitza posicio vertical real de la paleta */
  
  win_retard(retard);
  }while ((tecla != TEC_RETURN) && (cont==-1));
}
Exemple #5
0
/* funcio per moure la paleta de l'usuari en funcio de la tecla premuda */
void mou_paleta_usuari(void)
{
  
    do
    {
      tecla = win_gettec();
      if ((tecla == TEC_AVALL) && (win_quincar(ipu_pf+l_pal,ipu_pc) == ' '))
      {
        win_escricar(ipu_pf,ipu_pc,' ',NO_INV);	   /* esborra primer bloc */
        ipu_pf++;					   /* actualitza posicio */
        win_escricar(ipu_pf+l_pal-1,ipu_pc,'0',INVERS); /* impri. ultim bloc */
      }
      if ((tecla == TEC_AMUNT) && (win_quincar(ipu_pf-1,ipu_pc) == ' '))
      {
        win_escricar(ipu_pf+l_pal-1,ipu_pc,' ',NO_INV); /* esborra ultim bloc */
        ipu_pf--;					    /* actualitza posicio */
        win_escricar(ipu_pf,ipu_pc,'0',INVERS);	    /* imprimeix primer bloc */
      }
      win_retard(retard);
  
    }while((tecla != TEC_RETURN) && (cont==-1));
}
Exemple #6
0
/* funcio per moure la paleta de l'usuari en funcio de la tecla premuda */
void mou_paleta_usuari(void)
{
  
    do
    {
      tecla = win_gettec();
      pthread_mutex_lock(&mutex3);
      if ((tecla == TEC_AVALL) && (win_quincar(ipu_pf+l_pal,ipu_pc) == ' '))
      {
        pthread_mutex_unlock(&mutex3);
        pthread_mutex_lock(&mutex1);
        win_escricar(ipu_pf,ipu_pc,' ',NO_INV);	   /* esborra primer bloc */
        pthread_mutex_unlock(&mutex1);
        ipu_pf++;					   /* actualitza posicio */
        pthread_mutex_lock(&mutex1);
        win_escricar(ipu_pf+l_pal-1,ipu_pc,'0',INVERS); /* impri. ultim bloc */
        pthread_mutex_unlock(&mutex1);
      }
      pthread_mutex_unlock(&mutex3);
      pthread_mutex_lock(&mutex3);
      if ((tecla == TEC_AMUNT) && (win_quincar(ipu_pf-1,ipu_pc) == ' '))
      {
        pthread_mutex_unlock(&mutex3);
        pthread_mutex_lock(&mutex1);
        win_escricar(ipu_pf+l_pal-1,ipu_pc,' ',NO_INV); /* esborra ultim bloc */
        pthread_mutex_unlock(&mutex1);
        ipu_pf--;					    /* actualitza posicio */
        pthread_mutex_lock(&mutex1);
        win_escricar(ipu_pf,ipu_pc,'0',INVERS);	    /* imprimeix primer bloc */
        pthread_mutex_unlock(&mutex1);
      }
      pthread_mutex_unlock(&mutex3);
      win_retard(retard);
    }while((tecla != TEC_RETURN) && (cont==-1));
    pthread_exit(NULL);
}
Exemple #7
0
int main(int n_args, char * ll_args[])
{
  int i,n,t,t_total,n_proc,n_veg;
  int *p_lletres,id_lletres;
  int id_win,n_fil,n_col,mida_camp;
  char a1[20],a3[20],a4[20],a5[10],a6[10], fmis[80];
  void *p_win;

  if (n_args != 4)
  {	fprintf(stderr,"comanda: multiproc2 num_procs n_vegades n_lletres\n");
	exit(1);
  }
  n_proc = atoi(ll_args[1]);		/* convertir arguments a num. enter */
  n_veg = atoi(ll_args[2]);
  if (n_proc < 1) n_proc = 1;		/* i filtrar el seu valor */
  if (n_proc > MAX_PROCS) n_proc = MAX_PROCS;
  if (n_veg < 1) n_veg = 1;
  if (n_veg > MAX_VEGADES) n_veg = MAX_VEGADES;

  id_lletres = ini_mem(sizeof(int));	/* crear zona mem. compartida */
  p_lletres = map_mem(id_lletres);	/* obtenir adres. de mem. compartida */
  *p_lletres = atoi(ll_args[3]);	/* inicialitza variable compartida */
  if (*p_lletres < 1) *p_lletres = 1;
  if (*p_lletres > n_proc*n_veg) *p_lletres = n_proc*n_veg;
  sprintf(a3,"%i",id_lletres);	/* convertir identificador mem. en string */

  n_fil = n_proc+3;
  n_col = n_veg+2;
  mida_camp = win_ini(&n_fil,&n_col,'+',INVERS);
  if (mida_camp < 0)
  {			/* si no pot crear l'entorn de joc amb les curses */
    switch (mida_camp)
    {	case -1: fprintf(stderr,"camp de joc ja creat!\n"); break;
	case -2: fprintf(stderr,"no s'ha pogut inicialitzar l'entorn de curses!\n"); break;
	case -3: fprintf(stderr,"les mides del camp demanades son massa grans!\n"); break;
	case -4: fprintf(stderr,"no s'ha pogut crear la finestra!\n"); break;
    }
    elim_mem(id_lletres);	/* elimina zona de memoria compartida */
    exit(2);
  }
  id_win = ini_mem(mida_camp);	/* crear zona mem. compartida */
  p_win = map_mem(id_win);	/* obtenir adres. de mem. compartida */
  sprintf(a4,"%i",id_win);
  sprintf(a5,"%i",n_fil);	/* convertir mides camp en string */
  sprintf(a6,"%i",n_col);

  win_set(p_win,n_fil,n_col);		/* crea acces a finestra oberta */

  n = 0;
  for ( i = 0; i < n_proc; i++)
  {
    tpid[n] = fork();		/* crea un nou proces */
    if (tpid[n] == (pid_t) 0)		/* branca del fill */
    {
	sprintf(a1,"%i",(i+1));
	execlp("./mp_car2", "mp_car2", a1, ll_args[2], a3, a4, a5, a6, (char *)0);
	fprintf(stderr,"error: no puc executar el process fill \'mp_car2\'\n");
	exit(0);
    }
    else if (tpid[n] > 0) n++;		/* branca del pare */
  }
/* fprintf(stderr,"Pare: he creat %d processos fill, espero que acabin!\n\n",n);*/
      
  do
  { sprintf(fmis,"lletres = %d",*p_lletres);
    win_escristr(fmis);
    win_update();			/* actualitza visualitzacio CURSES */
    win_retard(20);
  } while (*p_lletres != 0);
      
  t_total = 0;
  for (i = 0; i < n; i++)
  {
    waitpid(tpid[i],&t,0);	/* espera finalitzacio d'un fill */
    t = t >> 8;			/* normalitza resultat	*/
/* 	fprintf(stderr,"el proces (%d) ha escrit %d lletres\n",tpid[i],t); */
    t_total += t;
  }
  win_fi();

  printf("\nJa han acabat tots els processos creats!\n");
  printf("Entre tots els processos han escrit %d lletres.\n",t_total);

  elim_mem(id_win);		/* elimina zones de memoria compartida */
  elim_mem(id_lletres);
  return(0);
}
Exemple #8
0
int main(int n_args, char *ll_args[])
{
	
	int id_win,n_fil,n_col;
	void *p_win;
	int moviments,*p_moviments;
	int retard;
	int tecla,*p_tecla;
	int cont,*p_cont;
	int MAX_MOV;
	
	int l_pal;
	
	
	int ipo_pf;
	int ipo_pc;
	float po_pf;
	float v_pal;
	
	float aux1,aux2;
	int index;
	
	id_win = atoi(ll_args[1]);
	p_win = map_mem(id_win);
	
	n_fil = atoi(ll_args[2]);		/* obtenir dimensions del camp de joc */
	n_col = atoi(ll_args[3]);
	
	win_set(p_win,n_fil,n_col);	/* crea acces a finestra oberta pel proces pare */
	
	
	/* moviments,retard,tecla,cont,MAX_MOV,index,l_pal*/
	
	moviments= atoi(ll_args[4]);
	p_moviments = map_mem(moviments);	/* obtenir adres. de mem. compartida */
	
	
	
	retard= atoi(ll_args[5]);
	tecla= atoi(ll_args[6]);
	p_tecla = map_mem(tecla);	/* obtenir adres. de mem. compartida */
	
	cont= atoi(ll_args[7]);
	p_cont = map_mem(cont);	/* obtenir adres. de mem. compartida */
	
	
	MAX_MOV= atoi(ll_args[8]);
	index= atoi(ll_args[9]);	
	l_pal= atoi(ll_args[10]);
	ipo_pf= atoi(ll_args[11]);
	ipo_pc= atoi(ll_args[12]);
	aux1= atoi(ll_args[13]);
	aux2= atoi(ll_args[14]);
	
	po_pf=aux1/100;
	v_pal=aux2/100;
	
	
	
	
	
	int f_h;
	
	/* char rh,rv,rd; */
	int i= index; 
	int j=i+1;
	char c = j +'0';
  
do{
  
  f_h = po_pf + v_pal;		/* posicio hipotetica de la paleta */
 
  if (f_h != ipo_pf)	/* si pos. hipotetica no coincideix amb pos. actual */
  { 
    if (v_pal > 0.0)			/* verificar moviment cap avall */
    {
	
	if (win_quincar(f_h+l_pal-1,ipo_pc) == ' ')   /* si no hi ha obstacle */
	{
	  
	  win_escricar(ipo_pf, ipo_pc,' ',NO_INV);      /* esborra primer bloc */
	 
	  po_pf += v_pal; ipo_pf = po_pf;		/* actualitza posicio */
	  
	  win_escricar(ipo_pf+l_pal-1, ipo_pc,c,INVERS); /* impr. ultim bloc */
    

	}
	else{		/* si hi ha obstacle, canvia el sentit del moviment */
	   v_pal = -v_pal;
	  *p_moviments=*p_moviments+1;
      

       
     }}
    else			/* verificar moviment cap amunt */
    {

	if (win_quincar(f_h,ipo_pc) == ' ')        /* si no hi ha obstacle */
	{
	   			
	  win_escricar(ipo_pf+l_pal-1,ipo_pc,' ',NO_INV); /* esbo. ultim bloc */
	 
	  po_pf += v_pal; ipo_pf = po_pf;		/* actualitza posicio */
	  
	  win_escricar(ipo_pf, ipo_pc,c,INVERS);	/* impr. primer bloc */
	 
	}
	else{		/* si hi ha obstacle, canvia el sentit del moviment */
	   v_pal = -v_pal;
	   *p_moviments=*p_moviments+1;
        
         
     }}
  }
  else 
  
  po_pf += v_pal; 	/* actualitza posicio vertical real de la paleta */
  
  
  win_retard(retard);
  
	 } while (*p_tecla != TEC_RETURN && (*p_cont==-1) && *p_moviments<MAX_MOV);

return(0);
}