Problema con le fork in C

Stefanokj

Utente Attivo
333
7
OS
Arch
Hey ragazzi,

Sto realizzando un mini gioco utilizzando processi e ncurses.

Nella finestra di gioco devo avere: a sinistra la navicella da me controllata, a destra le navicelle nemiche. Ogni nave nemica deve essere controllata da un processo diverso.

Ho fatto praticamente di tutto, l'unico problema che ho è che quando provo a generare le navi nemiche,non so perché, le genero sovrapposte. Con il codice che ho scritto sotto vorrei generare la prima astronave in alto a destra, attendere un ritardo (dove la prima astronave si sposta in basso) e generare la seconda astronave (sempre in alto a destra) e così via.

Penso che il problema sia in "GeneratoreNemici", ma non capisco dove.
Se vi serve dare un occhiata al codice completo lo trovate qui: https://pastebin.com/59zYdsxh
C:
void Nemico(int pipeout, int y)
{
struct position nemico;
//int deltax;        /* Spostamento orizzontale */
int deltay=1;        /* Spostamento verticale */
int pidM;
  nemico.x = MAXX;  /* Coordinata X iniziale */
  nemico.y = y;  /* Coordinata Y iniziale */
  nemico.c ='$';    /* Carattere identificativo */
  int secondi = 0;
  int pidN = getpid(); /*Ottengo il pid del processo*/
  /*chiudo la pipe in lettura*
    

  /* Comunico le coordinate iniziali al processo padre */
  write(pipeout,&nemico,sizeof(nemico));

  while(1){
    if(secondi == 5){
          pidM = fork();

            if(pidM==0) {
                    //flash();
                    /* Visualizzo il Proiettile nella posizione iniziale */
                    //mvprintw(MAXX/2,MAXY/2,"@");
            //write(pipeout,&prova,sizeof(prova));
            refresh();
                    /* ed eseguo quindi la relativa funzione di gestione */
                    //close(pipeout); /* chiusura del descrittore di lettura */
                    Missile(pipeout,nemico.x,nemico.y); /* invocazione funzione proiettile */
        }
      secondi = 0;
    }
    //if(random() < RAND_MAX/2) deltax= 1; else deltax=-1;

    /* Se supero area X schermo inverte il movimento */
    //if(nemico.x + deltax < 1 || nemico.x + deltax > MAXX){
    //    deltax = -deltax;
    //}

        /* Movimento X */
    //nemico.x += deltax;

        //if(random() < RAND_MAX/2) deltay= 1; else deltay=-1;
    refresh();
    /* Se supero area Y schermo inverto il movimento */
    if(nemico.y + deltay < 1 || nemico.y + deltay > MAXY){
      deltay = -deltay;
      nemico.x--;
    }

        /* Movimento Y */
    nemico.y += deltay;
        if(nemico.x<0){
      kill(pidN,1);
    }
    
    usleep(pidM);
    /* Comunico le coordinate correnti al processo padre */
    write(pipeout,&nemico,sizeof(nemico));

        /* Inserisco una pausa per rallentare il movimento */
    usleep(DELAY);
    secondi++;
  }
}
void GeneratoreNemici(int pipeout, int m){
  pid_t pids[m];
  int i;
  //int y;
 
  /* creo i figli */
    for (i = 0; i < m; ++i) {
        pids[i]=fork();
      if (pids[i] < 0) {
        perror("fork");
        abort();
      } else if (pids[i] == 0) {
     //y = y + m;
            Nemico(pipeout, MAXY);
        exit(0);
      }
    }

    /* aspetta che i figli finiscano */
int status;
pid_t pid;
while (m > 0) {
  pid = wait(&status);

  --m;  // TODO(pts): Remove pid from the pids array.
}

}
 

Andretti60

Utente Èlite
6,440
5,091
il problema dovrebbe essere qui:
C:
  nemico.x = MAXX;  /* Coordinata X iniziale */
  nemico.y = y;  /* Coordinata Y iniziale */
La coordinata X e' sempre la stessa, mentre la Y la passi dall'esterno.
Accertati che siano sempre diverse (una il generatore di numeri a caso, nel giusto intervallo di valori)
 

Stefanokj

Utente Attivo
333
7
OS
Arch
il problema dovrebbe essere qui:
C:
  nemico.x = MAXX;  /* Coordinata X iniziale */
  nemico.y = y;  /* Coordinata Y iniziale */
La coordinata X e' sempre la stessa, mentre la Y la passi dall'esterno.
Accertati che siano sempre diverse (una il generatore di numeri a caso, nel giusto intervallo di valori)
Ho utilizzato la stessa coordinata x perché inizialmente tutte le astronavi nemiche devono essere nel lato destro dello schermo, e pian piano devo avanzare verso sinistra (un po' come space invaders solo di lato).
Poi ho provato a passare un valore di y diverso (incrementandolo secondo il numero delle navicelle riga 416 di pastebin, ma non ha funzionato)
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!