[risolto] spaceinvades with pipes, problema sparo

di il
1 risposte

[risolto] spaceinvades with pipes, problema sparo

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...

1 Risposte

Devi accedere o registrarti per scrivere nel forum
1 risposte