Advertisement
nigu

guardieladri

Nov 17th, 2014
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.66 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 guardia(int pipeout);
  22. void controllo(int pipein);
  23.  
  24. int main() {
  25.     int filedes[2];
  26.     int pid_ladro;
  27.     int pid_guardia;
  28.     initscr(); /* inizializzazione dello schermo */
  29.     noecho(); /* i caratteri corrispondenti ai tasti premuti non saranno
  30.     * visualizzati sullo schermo del terminale */
  31.     srand((int)time(0)); /*inizializziamo il generatore di numeri random*/
  32.     curs_set(0); /* nasconde il cursore */
  33.     if(pipe(filedes)==-1) {
  34.         perror("Errore nella creazione della pipe.");
  35.         exit(1);
  36.     }
  37.     switch(pid_ladro=fork()) {
  38.         case -1:
  39.             perror("Errore nell'esecuzione della fork.");
  40.             exit(1);
  41.         case 0:
  42.             close(filedes[0]); /* chiusura del descrittore di lettura */
  43.             ladro(filedes[1]); /* richiamiamo la funzione ladro, passandogli il descrittore di lettura */
  44.         default:
  45.             switch(pid_guardia=fork()) {
  46.                 case -1:
  47.                     perror("Errore nell'esecuzione della fork.");
  48.                     exit(1);
  49.                 case 0:
  50.                     close(filedes[0]);
  51.                     guardia(filedes[1]);
  52.                 default:
  53.                     // il padre lancia la funzione di controllo
  54.                     close(filedes[1]);
  55.                     controllo(filedes[0]);
  56.             }
  57.     }
  58.     // siamo usciti dal controllo e vengono terminati i 2 processi figli
  59.     // ripristina il normale modo operativo dello schermo
  60.     kill(pid_ladro,1);
  61.     kill(pid_guardia,1);
  62.     endwin();
  63.     return 0;
  64. }
  65.  
  66. void ladro(int pipeout) {
  67.     struct pos pos_ladro;
  68.     long int r;
  69.     int dx,dy;
  70.     pos_ladro.x=1;
  71.     pos_ladro.y=1;
  72.     pos_ladro.c='$';
  73.     write(pipeout,&pos_ladro,sizeof(pos_ladro));
  74.     while(1) {
  75.         r=random();
  76.         if(r<RAND_MAX/2)
  77.             dx=PASSO;
  78.         else
  79.             dx=-PASSO;
  80.         if(pos_ladro.x+dx<1 || pos_ladro.x+dx>=MAXX)
  81.             dx=-dx;
  82.         pos_ladro.x+=dx;
  83.         r=random();
  84.         if(r<RAND_MAX/2)
  85.             dy=PASSO;
  86.         else
  87.             dy=-PASSO;
  88.         if(pos_ladro.y+dy<1 || pos_ladro.y+dy>=MAXY)
  89.             dy=-dy;
  90.         pos_ladro.y+=dy;
  91.         write(pipeout,&pos_ladro,sizeof(pos_ladro));
  92.         usleep(100000);
  93.     }
  94. }
  95.  
  96. void guardia(int pipeout) {
  97.     struct pos pos_guardia;
  98.     pos_guardia.c='#';
  99.     pos_guardia.x=MAXX-1;
  100.     pos_guardia.y=MAXY-1;
  101.     write(pipeout,&pos_guardia,sizeof(pos_guardia));
  102.     while(1) {
  103.         char c;
  104.             switch(c=getch()) {
  105.                 case SU:
  106.                     if(pos_guardia.y>0)
  107.                         pos_guardia.y-=1;
  108.                     break;
  109.                 case GIU:
  110.                     if(pos_guardia.y<MAXY-1)
  111.                         pos_guardia.y+=1;
  112.                     break;
  113.                 case SINISTRA:
  114.                     if(pos_guardia.x>0)
  115.                         pos_guardia.x-=1;
  116.                     break;
  117.                 case DESTRA:
  118.                     if(pos_guardia.x<MAXX-1)
  119.                         pos_guardia.x+=1;
  120.                     break;
  121.             }
  122.             write(pipeout,&pos_guardia,sizeof(pos_guardia));
  123.     }
  124. }
  125.  
  126. void controllo (int pipein) {
  127.     struct pos ladro, guardia, valore_letto;
  128.     ladro.x=-1;
  129.     guardia.x=-1;
  130.     do {
  131.         read(pipein,&valore_letto,sizeof(valore_letto));
  132.         if(valore_letto.c=='$') {
  133.             if (ladro.x>=0) { /* cancello la 'vecchia' posizione del ladro */
  134.                 mvaddch(ladro.y,ladro.x,' ');
  135.             }
  136.             ladro=valore_letto;
  137.         } else {
  138.             if (guardia.x>=0) { /* cancello la 'vecchia' posizione della guardia */
  139.                 mvaddch(guardia.y,guardia.x,' ');
  140.             }
  141.             guardia=valore_letto;
  142.         }
  143.         mvaddch(valore_letto.y,valore_letto.x,valore_letto.c);
  144.         curs_set(0);
  145.         refresh();
  146.     } while (guardia.x!=ladro.x || guardia.y!=ladro.y);
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement