Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* difesa-aerea-1b.c - RS-2014 [impiego di fork e pipes] */
- #include <stdio.h>
- #include <curses.h>
- #include <stdlib.h>
- #include <unistd.h>
- #define UP 65 /* Cursore sopra */
- #define DW 66 /* Cursore sotto */
- #define SX 68 /* Cursore sinistra */
- #define DX 67 /* Cursore destra */
- #define MAXX 80 /* Dimensione dello schermo di output (colonne) */
- #define MAXY 20 /* Dimensione dello schermo di output (righe) */
- #define DELAY 50000 /* Ritardo nel movimento degli aerei nemici (da adattare) */
- /* Prototipi delle funzioni adoperate */
- void Nemico(int pipeout);
- void Amico(int pipeout);
- void Area(int pipein);
- /* Struttura adoperata per veicolare le coordinate */
- struct position {
- char c; /* Identificatore dell'entità che invia i dati */
- int x; /* Coordinata X */
- int y; /* Coordinata Y */
- };
- /*
- ----------------------------------------------------------------------
- Funzione principale del programma
- ----------------------------------------------------------------------
- */
- int main() {
- int p[2]; /* Descrittori pipe */
- int pidN; /* Pid processo figlio 'Nemico' */
- int pidA; /* Pid processo figlio 'Amico */
- initscr(); /* Inizializza schermo di output */
- noecho(); /* Imposta modalità della tastiera */
- curs_set(0); /* Nasconde il cursore */
- pipe(p); /* Creazione pipe */
- srand(time(NULL)); /* Inizializza generatore di numeri casuali */
- pidN = fork(); /* Creo il primo processo figlio 'Nemico' */
- if(pidN==0) { /* Se il pid == 0 -> si tratta del processo 'Nemico' */
- Nemico(p[1]); /* ed eseguo quindi la relativa funzione di gestione */
- }
- else {
- pidA=fork(); /* Altrimenti sono ancora nel processo padre e creo il processo 'amico' */
- if(pidA==0) { /* Se il pid == 0 -> si tratta del processo 'amico' */
- mvprintw(MAXY/2,MAXX/2,"#"); /* Visualizzo amico nella posizione iniziale */
- refresh();
- Amico(p[1]); /* ed eseguo quindi la relativa funzione di gestione */
- }
- else {
- Area(p[0]); /* Sono ancora nel processo padre e invoco la funzione Area() */
- }
- }
- kill(pidN,1); /* Termino i processi Nemico e Amico */
- kill(pidA,1);
- endwin(); /* Ripristino la modalità di funzionamento usuale */
- printf("\n\n\nGAME OVER\n\n\n"); /* Termino il gioco ed esco dal programma */
- return 0;
- }
- /*
- ----------------------------------------------------------------------
- Funzione 'Aereo Nemico'
- ----------------------------------------------------------------------
- */
- void Nemico(int pipeout) {
- struct position nemico;
- int YX=0; /* Variabile per direzione movimento aereo */
- nemico.x = 1; /* Coordinata X iniziale */
- nemico.y = 1; /* Coordinata Y iniziale */
- nemico.c ='+'; /* Carattere identificativo */
- write(pipeout,&nemico,sizeof(nemico)); /* Comunico le coordinate iniziali al processo padre */
- while(1) {
- if(random()<RAND_MAX/2)
- YX=0;
- else
- YX=1;
- if(YX==0) {
- nemico.y = random()%MAXY;
- for(nemico.x=2;nemico.x<MAXX;nemico.x++) { /* Effettuo il percorso da x=0 a x=MAXX */
- write(pipeout,&nemico,sizeof(nemico)); /* Comunico le coordinate correnti al processo padre */
- usleep(DELAY); /* Inserisco una pausa per rallentare il movimento */
- }
- }
- else {
- nemico.x = random()%MAXX; /* Genero casualmente una posizione x di partenza */
- for(nemico.y=2;nemico.y<MAXY;nemico.y++) { /* Effettuo il percorso da y=0 a y=MAXY */
- write(pipeout,&nemico,sizeof(nemico)); /* Comunico le coordinate correnti al processo padre */
- usleep(DELAY); /* Inserisco una pausa per rallentare il movimento */
- }
- }
- }
- }
- /*
- ----------------------------------------------------------------------
- Funzione 'Aereo Amico' - Movimento tramite i tasti cursore
- ----------------------------------------------------------------------
- */
- void Amico(int pipeout) {
- struct position amico;
- char c;
- amico.x = MAXX/2; /* Coordinata X iniziale */
- amico.y = MAXY/2; /* Coordinata Y iniziale */
- amico.c ='#'; /* Carattere identificativo */
- write(pipeout,&amico,sizeof(amico)); /* Comunico le coordinate iniziali al processo padre */
- while(1) { /* Lettura dei tasti cursore */
- c = getch();
- if(c==UP && amico.y > 0)
- amico.y-=1;
- if(c==DW && amico.y < MAXY-1)
- amico.y+=1;
- if(c==SX && amico.x > 0)
- amico.x-=1;
- if(c==DX && amico.x < MAXX-1)
- amico.x+=1;
- write(pipeout,&amico,sizeof(amico)); /* Comunico al processo padre le coordinate dell'aereo amico */
- }
- }
- /*
- ----------------------------------------------------------------------
- Funzione relativa al processo di visualizzazione e controllo
- ----------------------------------------------------------------------
- */
- void Area(int pipein) {
- struct position nemico, amico, dato_letto;
- struct position bonus1, told1;
- struct position bonus2, told2;
- struct position bonus3, told3;
- int i=0, max_collision=3, collision=0;
- mvprintw(0,1,"%3d",max_collision); /* Visualizzo collisioni concesse all'aereo amico */
- do {
- read(pipein,&dato_letto,sizeof(dato_letto)); /* Leggo dalla pipe */
- if(dato_letto.c=='+') { /* nemico */
- mvaddch(nemico.y,nemico.x,' '); /* Cancello il precedente carattere visualizzato */
- nemico=dato_letto; /* Aggiorno le coordinate relative alla nuova posizione */
- }
- else { /* amico */
- mvaddch(amico.y,amico.x,' '); /* Cancello il precedente carattere visualizzato */
- amico=dato_letto; /* Aggiorno le coordinate relative alla nuova posizione */
- }
- mvaddch(dato_letto.y,dato_letto.x,dato_letto.c); /* Visualizzo gli oggetti sulle coordinate correnti */
- if(!(i++%100)) {
- mvaddch(told1.y,told1.x,' '); /* Cancello i precedenti palloni visualizzati */
- mvaddch(told2.y,told2.x,' ');
- mvaddch(told3.y,told3.x,' ');
- /* Genero casualmente le nuove coordinate dei 3 bonus verificando che
- le nuove coordinate non siano uguali alle precedenti o agli altri palloni */
- do {
- bonus1.x = rand()%MAXX;
- bonus1.y = rand()%MAXY;
- } while (((bonus1.x == amico.x) && (bonus1.y == amico.y)) ||
- (bonus1.x == nemico.x) && (bonus1.y == nemico.y) ||
- (bonus1.x == told1.x) && (bonus1.y == told1.y) ||
- (bonus1.x == told2.x) && (bonus1.y == told2.y) ||
- (bonus1.x == told3.x) && (bonus1.y == told3.y));
- do{
- bonus2.x = rand()%MAXX;
- bonus2.y = rand()%MAXY;
- } while((bonus2.x == bonus1.x) && (bonus2.y == bonus1.y));
- do{
- bonus3.x = rand()%MAXX;
- bonus3.y = rand()%MAXY;
- } while((bonus3.x == bonus2.x) && (bonus3.y == bonus2.y));
- /* Visualizzo i nuovi bonus */
- mvaddch(bonus1.y,bonus1.x,'1');
- mvaddch(bonus2.y,bonus2.x,'2');
- mvaddch(bonus3.y,bonus3.x,'3');
- /* Memorizzo le coordinate dei palloni visualizzati */
- told1.x = bonus1.x;
- told1.y = bonus1.y;
- told2.x = bonus2.x;
- told2.y = bonus2.y;
- told3.x = bonus3.x;
- told3.y = bonus3.y;
- }
- /* Visualizzo le possibili collisioni rimaste all'aereo amico */
- mvprintw(0,1,"%3d",max_collision);
- /* Nascondo il cursore */
- curs_set(0);
- /* Aggiorno lo schermo di output per visualizzare le modifiche */
- refresh();
- /* Segnalo collisione e tipo (nemico/amico oppure nemico/bonus)
- (con meccanismo per evitare il rilevamento multiplo della stessa collisione) */
- if(amico.x == nemico.x && amico.y == nemico.y){
- if(amico.x < MAXX)
- amico.x++;
- else
- amico.x--;
- max_collision--;
- /* Esce quando terminano le possibili collisioni ed avviene una nuova collisione */
- if(max_collision < 0)
- collision=1;
- }
- if( nemico.x == bonus1.x && nemico.y == bonus1.y ||
- nemico.x == bonus2.x && nemico.y == bonus2.y ||
- nemico.x == bonus3.x && nemico.y == bonus3.y ) {
- if(nemico.x < MAXX)
- nemico.x++;
- else
- nemico.x--;
- max_collision=3;
- }
- /* Il ciclo si ripete finchè non si verifica una collisione amico/nemico */
- } while(!collision);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement