Advertisement
nigu

Difesa

Nov 25th, 2014
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.84 KB | None | 0 0
  1. #include <stdio.h> #include <curses.h> #include <stdlib.h> #include <unistd.h> #define PASSO 1 /* entita dello spostamento del ladro */ #define SU 65 /* Freccia su */ #define GIU 66 /* Freccia giu */ #define SINISTRA 68 /* Freccia sinsitra */ #define DESTRA 67 /* Freccia destra */ #define MAXX 80 /* Numero di colonne dello schermo */ #define MAXY 24 /* Numero di righe dello schermo */ /* Struttura per la comunicazione tra figli e padre */ struct pos { char c; /* soggetto che invia il dato: ladro o guardia */ int x; /* coordinata x */ int y; /* coordinata y */ }; int scudi=3; void aereo_nemico(int pipeout); void aereo_amico(int pipeout); void controllo(int pipein); int main() { int filedes[2]; int pid_aereo_nemico; int pid_aereo_amico; int pid_guardia; initscr(); /* inizializzazione dello schermo */ noecho(); /* i caratteri corrispondenti ai tasti premuti non saranno * visualizzati sullo schermo del terminale */ srand((int)time(0)); /*inizializziamo il generatore di numeri random*/ curs_set(0); /* nasconde il cursore */ if(pipe(filedes)==-1) { perror("Errore nella creazione della pipe."); exit(1); } mvprintw(MAXY,1,"Vite: %d",scudi); switch(pid_aereo_nemico=fork()) { case -1: perror("Errore nell'esecuzione della fork."); exit(1); case 0: close(filedes[0]); /* chiusura del descrittore di lettura */ aereo_nemico(filedes[1]); /* richiamiamo la funzione aereo_nemico, passandogli il descrittore di lettura */ default: switch(pid_aereo_amico=fork()) { case -1: perror("Errore nell'esecuzione della fork."); exit(1); case 0: close(filedes[0]); aereo_amico(filedes[1]); default: // il padre lancia la funzione di controllo close(filedes[1]); controllo(filedes[0]); } } // siamo usciti dal controllo e vengono terminati i 2 processi figli // ripristina il normale modo operativo dello schermo kill(pid_aereo_nemico,1); kill(pid_aereo_amico,1); endwin(); return 0; } void aereo_nemico(int pipeout) { struct pos pos_aereo_nemico, b1, b2, b3, bold1, bold2, bold3; int time=0; long int r; int dx,dy; pos_aereo_nemico.x=1; pos_aereo_nemico.y=1; pos_aereo_nemico.c='+'; //write(pipeout,&pos_aereo_nemico,sizeof(pos_aereo_nemico)); while(1) { /* time++;*/ /* if(time%100){*/ /* mvaddch(bold1.y,bold1.x,' ');*/ /* mvaddch(bold2.y,bold2.x,' ');*/ /* mvaddch(bold3.y,bold3.x,' ');*/ /* b1.x=rand()%MAXX; */ /* b1.y=rand()%MAXY; */ /* b1.c='O';*/ /* do{*/ /* b2.x=rand()%MAXX; */ /* b2.y=rand()%MAXY; */ /* b2.c='O';*/ /* }while(b2.x!=b1.x || b2.y!=b1.y);*/ /* do{*/ /* b3.x=rand()%MAXX; */ /* b3.y=rand()%MAXY; */ /* b3.c='O';*/ /* }while(b3.x!=b2.x || b3.y!=b2.y);*/ /* */ /* write(pipeout,&b1,sizeof(b1)); */ /* write(pipeout,&b2,sizeof(b2)); */ /* write(pipeout,&b3,sizeof(b3));*/ /* bold1.x=b1.x;*/ /* bold1.y=b1.y; */ /* bold2.x=b2.x;*/ /* bold2.y=b2.y;*/ /* bold3.x=b3.x;*/ /* bold3.y=b3.y;*/ /* }*/ r=random(); if(r<RAND_MAX/2) dx=PASSO; else dx=-PASSO; if(pos_aereo_nemico.x+dx<1 || pos_aereo_nemico.x+dx>=MAXX) dx=-dx; pos_aereo_nemico.x+=dx; r=random(); if(r<RAND_MAX/2) dy=PASSO; else dy=-PASSO; if(pos_aereo_nemico.y+dy<1 || pos_aereo_nemico.y+dy>=MAXY) dy=-dy; pos_aereo_nemico.y+=dy; write(pipeout,&pos_aereo_nemico,sizeof(pos_aereo_nemico)); usleep(100000); } } void aereo_amico(int pipeout) { struct pos pos_aereo_amico; long int r; int dx,dy; pos_aereo_amico.x=MAXX/2; pos_aereo_amico.y=MAXY/2; pos_aereo_amico.c='#'; srand((int)time(0)); write(pipeout,&pos_aereo_amico,sizeof(pos_aereo_amico)); while(1) { char c; switch(c=getch()) { case SU: if(pos_aereo_amico.y>0) pos_aereo_amico.y-=1; break; case GIU: if(pos_aereo_amico.y<MAXY-1) pos_aereo_amico.y+=1; break; case SINISTRA: if(pos_aereo_amico.x>0) pos_aereo_amico.x-=1; break; case DESTRA: if(pos_aereo_amico.x<MAXX-1) pos_aereo_amico.x+=1; break; } write(pipeout,&pos_aereo_amico,sizeof(pos_aereo_amico)); } } void controllo (int pipein) { struct pos aereo_nemico, balloon, aereo_amico, valore_letto, b1, b2, b3, bold1, bold2, bold3; int time; aereo_nemico.x=-1; balloon.x=-1; aereo_amico.x=-1; do { if(!(time++%100)){ mvaddch(bold1.y,bold1.x,' '); mvaddch(bold2.y,bold2.x,' '); mvaddch(bold3.y,bold3.x,' '); do{ b1.x=rand()%MAXX; b1.y=rand()%MAXY; b1.c='O'; }while(b1.x == bold1.x && b1.y == bold1.y); do{ b2.x=rand()%MAXX; b2.y=rand()%MAXY; b2.c='O'; }while(b2.x == bold2.x && b2.y == bold2.y ||b2.x == b1.x && b2.y == b1.y); do{ b3.x=rand()%MAXX; b3.y=rand()%MAXY; b3.c='O'; }while( b3.x == bold3.x && b3.y == bold3.y || b3.x == b1.x && b3.y == b1.y || b3.x == b2.x && b3.y == b2.y); mvaddch(b1.y,b1.x,'O'); mvaddch(b2.y,b2.x,'O'); mvaddch(b3.y,b3.x,'O'); bold1.x=b1.x; bold1.y=b1.y; bold2.x=b2.x; bold2.y=b2.y; bold3.x=b3.x; bold3.y=b3.y; } read(pipein,&valore_letto,sizeof(valore_letto)); if(valore_letto.c=='+') { if (aereo_nemico.x>=0) { /* cancello la 'vecchia' posizione del ladro */ mvaddch(aereo_nemico.y,aereo_nemico.x,' '); } aereo_nemico=valore_letto; } else if(valore_letto.c=='#') { if (aereo_amico.x>=0) { /* cancello la 'vecchia' posizione dell'aereo_amico */ mvaddch(aereo_amico.y,aereo_amico.x,' '); } aereo_amico=valore_letto; } /* else if(valore_letto.c=='O') { */ /* balloon=valore_letto; */ /* }*/ mvaddch(valore_letto.y,valore_letto.x,valore_letto.c); curs_set(0); refresh(); if(aereo_amico.x==aereo_nemico.x && aereo_amico.y==aereo_nemico.y) { scudi--; mvprintw(MAXY,1,"Vite: %d",scudi); } if((aereo_nemico.x==b1.x && aereo_nemico.y==b1.y) || (aereo_nemico.x==b2.x && aereo_nemico.y==b2.y) || (aereo_nemico.x==b3.x && aereo_nemico.y==b3.y) ) { scudi=3; mvprintw(MAXY,1,"Vite: %d",scudi); } } while (scudi>0); initscr(); clear; printf("GAME OVER\nPress Ctrl-C to exit...\n"); while(true); }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement