Advertisement
nigu

guardieladriavvocato

Nov 17th, 2014
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.96 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <curses.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #define PASSO 1 /* entita dello spostamento del ladro */
  6. #define SU 65 /* Freccia su */
  7. #define GIU 66 /* Freccia giu */
  8. #define SINISTRA 68 /* Freccia sinsitra */
  9. #define DESTRA 67 /* Freccia destra */
  10. #define MAXX 80 /* Numero di colonne dello schermo */
  11. #define MAXY 24 /* Numero di righe dello schermo */
  12.  
  13. /* Struttura per la comunicazione tra figli e padre */
  14. struct pos {
  15.     char c; /* soggetto che invia il dato: ladro o guardia */
  16.     int x; /* coordinata x */
  17.     int y; /* coordinata y */
  18. };
  19.  
  20. void ladro(int pipeout);
  21. void avvocato(int pipeout);
  22. void guardia(int pipeout);
  23. void controllo(int pipein);
  24.  
  25. int main() {
  26.     int filedes[2];
  27.     int pid_ladro;
  28.     int pid_avvocato;
  29.     int pid_guardia;
  30.     initscr(); /* inizializzazione dello schermo */
  31.     noecho(); /* i caratteri corrispondenti ai tasti premuti non saranno
  32.     * visualizzati sullo schermo del terminale */
  33.     srand((int)time(0)); /*inizializziamo il generatore di numeri random*/
  34.     curs_set(0); /* nasconde il cursore */
  35.     if(pipe(filedes)==-1) {
  36.         perror("Errore nella creazione della pipe.");
  37.         exit(1);
  38.     }
  39.     switch(pid_ladro=fork()) {
  40.         case -1:
  41.             perror("Errore nell'esecuzione della fork.");
  42.             exit(1);
  43.         case 0:
  44.             close(filedes[0]); /* chiusura del descrittore di lettura */
  45.             ladro(filedes[1]); /* richiamiamo la funzione ladro, passandogli il descrittore di lettura */
  46.         default:
  47.             switch (pid_avvocato=fork()){
  48.                 case -1:
  49.                     perror("Errore nell'esecuzione della fork.");
  50.                     exit(1);
  51.                 case 0:
  52.                     close(filedes[0]); /* chiusura del descrittore di lettura */
  53.                     avvocato(filedes[1]); /* richiamiamo la funzione avvocato, passandogli il descrittore di lettura */
  54.                 default:
  55.                     switch(pid_guardia=fork()) {
  56.                         case -1:
  57.                             perror("Errore nell'esecuzione della fork.");
  58.                             exit(1);
  59.                         case 0:
  60.                             close(filedes[0]);
  61.                             guardia(filedes[1]);
  62.                         default:
  63.                             // il padre lancia la funzione di controllo
  64.                             close(filedes[1]);
  65.                             controllo(filedes[0]);
  66.                     }
  67.         }
  68.     }
  69.     // siamo usciti dal controllo e vengono terminati i 3 processi figli
  70.     // ripristina il normale modo operativo dello schermo
  71.     kill(pid_ladro,1);
  72.     kill(pid_avvocato,1);
  73.     kill(pid_guardia,1);
  74.     endwin();
  75.     return 0;
  76. }
  77.  
  78. void ladro(int pipeout) {
  79.     struct pos pos_ladro;
  80.     long int r;
  81.     int dx,dy;
  82.     pos_ladro.x=1;
  83.     pos_ladro.y=1;
  84.     pos_ladro.c='$';
  85.     write(pipeout,&pos_ladro,sizeof(pos_ladro));
  86.     while(1) {
  87.         r=random();
  88.         if(r<RAND_MAX/2)
  89.             dx=PASSO;
  90.         else
  91.             dx=-PASSO;
  92.         if(pos_ladro.x+dx<1 || pos_ladro.x+dx>=MAXX)
  93.             dx=-dx;
  94.         pos_ladro.x+=dx;
  95.         r=random();
  96.         if(r<RAND_MAX/2)
  97.             dy=PASSO;
  98.         else
  99.             dy=-PASSO;
  100.         if(pos_ladro.y+dy<1 || pos_ladro.y+dy>=MAXY)
  101.             dy=-dy;
  102.         pos_ladro.y+=dy;
  103.         write(pipeout,&pos_ladro,sizeof(pos_ladro));
  104.         usleep(500000);
  105.     }
  106. }
  107.  
  108. void avvocato(int pipeout) {
  109.     struct pos pos_avvocato;
  110.     long int r;
  111.     int dx,dy;
  112.     pos_avvocato.x=1+3*PASSO;
  113.     pos_avvocato.y=-1-3*PASSO;
  114.     pos_avvocato.c='A';
  115.     write(pipeout,&pos_avvocato,sizeof(pos_avvocato));
  116.     while(1) {
  117.         r=random();
  118.         if(r<RAND_MAX/2)
  119.             dx=PASSO;
  120.         else
  121.             dx=-PASSO;
  122.         if(pos_avvocato.x+dx<1 || pos_avvocato.x+dx>=MAXX)
  123.             dx=-dx;
  124.         pos_avvocato.x+=dx;
  125.         r=random();
  126.         if(r<RAND_MAX/2)
  127.             dy=PASSO;
  128.         else
  129.             dy=-PASSO;
  130.         if(pos_avvocato.y+dy<1 || pos_avvocato.y+dy>=MAXY)
  131.             dy=-dy;
  132.         pos_avvocato.y+=dy;
  133.         write(pipeout,&pos_avvocato,sizeof(pos_avvocato));
  134.         usleep(100000);
  135.     }
  136. }
  137.  
  138.  
  139. void guardia(int pipeout) {
  140.     struct pos pos_guardia;
  141.     pos_guardia.c='#';
  142.     pos_guardia.x=MAXX-1;
  143.     pos_guardia.y=MAXY-1;
  144.     write(pipeout,&pos_guardia,sizeof(pos_guardia));
  145.     while(1) {
  146.         char c;
  147.             switch(c=getch()) {
  148.                 case SU:
  149.                     if(pos_guardia.y>0)
  150.                         pos_guardia.y-=1;
  151.                     break;
  152.                 case GIU:
  153.                     if(pos_guardia.y<MAXY-1)
  154.                         pos_guardia.y+=1;
  155.                     break;
  156.                 case SINISTRA:
  157.                     if(pos_guardia.x>0)
  158.                         pos_guardia.x-=1;
  159.                     break;
  160.                 case DESTRA:
  161.                     if(pos_guardia.x<MAXX-1)
  162.                         pos_guardia.x+=1;
  163.                     break;
  164.             }
  165.             write(pipeout,&pos_guardia,sizeof(pos_guardia));
  166.     }
  167. }
  168.  
  169. void controllo (int pipein) {
  170.     struct pos ladro, avvocato, guardia, valore_letto;
  171.     ladro.x=-1;
  172.     avvocato.x=-1;
  173.     guardia.x=-1;
  174.     do {
  175.         read(pipein,&valore_letto,sizeof(valore_letto));
  176.         if(valore_letto.c=='$') {
  177.             if (ladro.x>=0) { /* cancello la 'vecchia' posizione del ladro */
  178.                 mvaddch(ladro.y,ladro.x,' ');
  179.             }
  180.             ladro=valore_letto;
  181.         } else if (valore_letto.c=='A') {
  182.        
  183.             if (avvocato.x>=0) { /* cancello la 'vecchia' posizione dell'avvocato */
  184.                 mvaddch(avvocato.y,avvocato.x,' ');
  185.             }
  186.             avvocato=valore_letto;
  187.             } else {
  188.             if (guardia.x>=0) { /* cancello la 'vecchia' posizione della guardia */
  189.                     mvaddch(guardia.y,guardia.x,' ');
  190.                 }
  191.             guardia=valore_letto;
  192.            
  193.         }  
  194.         mvaddch(valore_letto.y,valore_letto.x,valore_letto.c);
  195.         curs_set(0);
  196.         refresh();
  197.     } while ((guardia.x!=ladro.x || guardia.y!=ladro.y)&&(avvocato.x!=ladro.x || avvocato.y!=ladro.y));
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement