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