Salve a tutti sto implementado il giochino spaceinvaders, e ho riscontrato problemi usando le pipe.
non so se riesco a spiegare il problema così, comunque:
uso, nel main, una fork() per creare i processi battleship (navicella spaziale del giocatore), aliens(i nemici) e battlefield(campo di battaglia dove disegno gli spostamenti e tutto).
e fin qui tutto bene, la navicella si sposta al mio comando e gli alieni da destra a sinistra e scendono ogni fine riga.
MAIN
int main()
{
// vafriabili pid e filedes
int pid_spaceship;
int pid_aliens;
int filedes[2];
// inizializzazioni
initscr();
noecho();
curs_set(0);
if(pipe(filedes)==-1)
{
perror("pipe create failed");
exit(2);
}
// processi
switch(pid_aliens=fork())
{
case -1: // case error
{
perror("Fork spaceship failed");
exit(1);
}
case 0: // case figlio (spaceship)
{
close(filedes[0]); // chiuso in lettura
aliens(filedes[1]); // aperto in scrittura verso aliens
}
default:
{
switch(pid_spaceship=fork())
{
case -1: // error
{
perror("Fork aliens failed");
exit(1);
}
case 0: // figlio (aliens)
{
close(filedes[0]); // chiuso in lettura
spaceship(filedes[1]); // aperto in scrittura verso spaceship
}
default:
{
close(filedes[1]); // chiuso in scrittura
battlefield(filedes[0]); // aperto in lettura
}
}
}
}
// chiusura processi e fine del programma
kill(pid_aliens,1);
kill(pid_spaceship,1);
endwin();
return 0;
}
all'interno della funzione spaceship creao una fork() al momento della pressione del tasto sparo (barra spaziatrice) che crea un nuovo processo chiamato missile, passo a missile i parametri filedes e la coordinata x dell'astronave, da missile scrivo una write che dovrebbe scrivere in battlefield.
SPACESHIP
void spaceship(int pipeout)
{
//variabili e inizializzazione per lo sparo
int pid_missile;
int filedes[2];
if(pipe(filedes)==-1)
{
perror("pipe create failed");
exit(2);
}
// variabili della navetta
struct pos pos_spaceship;
int spaceship_ciclo=TRUE; // ciclo sempre vero
char touch_key; // tasto premuto controller giocatore
// posizione iniziale e forma degli alieni
pos_spaceship.id=1;
pos_spaceship.x=40;
pos_spaceship.y=22;
pos_spaceship.form='W';
// scrittura nel fd pipeout, struttura pos_aliens, dimensione(pos_aliens)
write(pipeout,&pos_spaceship,sizeof(pos_spaceship));
while(spaceship_ciclo) // ciclo infinito
{
switch (touch_key=getch())
{
case LEFT:
{
if(pos_spaceship.x>2) pos_spaceship.x-=1;
break;
}
case RIGHT:
{
if(pos_spaceship.x<MAX_COL-2) pos_spaceship.x+=1;
break;
}
case FIRE: // creazione processo missile
{
switch(pid_missile=fork())
{
case -1:
{
perror("Fork missile failed");
exit(1);
}
case 0: // processo missile
{
close(filedes[0]); // chiuso in lettura
missile(filedes[1],pos_spaceship.x); // aperto in scrittura
break;
}
}
//break;
}
}
write(pipeout,&pos_spaceship,sizeof(pos_spaceship)); // scrittura nel fd
}
}
MISSILE
void missile(int pipeout,int x)
{
struct pos pos_missile;
int missile_ciclo=TRUE; // ciclo sempre vero
pos_missile.y=18;
pos_missile.x=x;
pos_missile.form='!'; // forma del missile
pos_missile.id=100;
while(missile_ciclo)
{
//usleep(3000);
pos_missile.y--; // avanzamento dello sparo
// scrive a battlefield la struttura aggiornata del missile
write(pipeout,&pos_missile,sizeof(pos_missile)); // scrittura nel fd
}
}
BSATTLEFIELD
void battlefield(int pipein)
{
struct pos aliens,spaceship,missile,read_value;
spaceship.x=40;
spaceship.y=22;
mvaddch(40,22,'W');
refresh();
do
{
// lettura dei dati passati da aliens
read(pipein,&read_value,sizeof(read_value));
// movimento alieni
if(read_value.id==2)
{
mvaddch(aliens.y,aliens.x,' '); // cancellazione della vecchia posizione
aliens=read_value; // lettura della nuova posizione
mvaddch(aliens.y,aliens.x,aliens.form);
refresh();
}
//moviemento navicella
if(read_value.id==1)
{
mvaddch(spaceship.y,spaceship.x,' ');
spaceship=read_value;
mvaddch(spaceship.y,spaceship.x,spaceship.form);
refresh();
}
// movimento sparo
if(read_value.id==100)
{
mvaddch(missile.y,missile.x,'X');
missile=read_value;
refresh();
mvaddch(missile.y,missile.x,missile.form);
refresh();
}
// scrittura sul campo di battaglia i valori letti
//mvaddch(read_value.y,read_value.x,read_value.form);
//refresh(); // scrittura effettiva
}while(aliens.y!=MAX_LINES-2);
}
Il problema è che non scrive nulla su battlefield e quando premo la barra non esce nessuno sparo..
qualcuno di voi sa dirmi se ho scritto male il codice o dove sto sbagliando?
grazie a tutti...