Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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(void* args);
- void* Amico(void* args);
- void Area(void);
- int collision;
- pthread_mutex_t muta=PTHREAD_MUTEX_INITIALIZER;
- /* Struttura adoperata per veicolare le coordinate */
- struct position {
- int x; /* Coordinata X */
- int y; /* Coordinata Y */
- };
- /*
- ----------------------------------------------------------------------
- Funzione principale del programma
- ----------------------------------------------------------------------
- */
- int main() {
- initscr(); /* Inizializza schermo di output */
- noecho(); /* Imposta modalitร della tastiera */
- curs_set(0); /* Nasconde il cursore */
- pthread_create (&thread_nemico, NULL, &nemico, NULL);
- pthread_create (&thread_amico, NULL, &amico, NULL);
- srand(time(NULL)); /* Inizializza generatore di numeri casuali */
- pthread_join(thread_nemico, NULL);
- pthread_join(thread_amico, NULL);
- 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