es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Juego de micro con forks.

Tengo un problema con un programa que usa forks.
Tengo que hacer un juego simple donde tengo 2 naves espaciales, una controlada por el usuario (solo arriba y abajo) y otra por la computadora (que rebota cada vez que toca un borde).
Cada nave debe ser controlada por un proceso diferente.
Además de las naves, debe ser posible disparar (bala controlada por otro proceso).
Lo hice todo, el único problema es que no entiendo por qué la nave controlada por el usuario no dispara, ¿alguien puede decirme dónde me equivoco?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con la nave espacial controlada por el usuario que no dispara puede estar relacionado con la función Proiettile. Cuando el usuario presiona el botón de disparo, se crea un nuevo proceso y se llama a la función Proiettile. Sin embargo, en la función Proiettile, la coordenada inicial para la bala se establece en las coordenadas actuales de la nave espacial, y la salida de la tubería siempre es la misma que la salida de la tubería de la nave espacial. Esto significa que la bala seguirá el mismo camino que la nave espacial y no podrá moverse de forma independiente.

    Para resolver este problema, debe pasar la salida de la tubería de proiettile como parámetro a la función Proiettile y hacer que la bala actualice sus propias coordenadas de forma independiente. Esto se puede lograr configurando la coordenada x inicial de la bala en la coordenada x actual de la nave espacial y actualizando su coordenada y en el bucle.

    Una función Proiettile revisada podría verse así:

    void Proiettile(int pipeout,int x, int y, int proiettile_pipeout)
    {
      struct position proiettile;
      int pidP=getpid();
      int deltax=1;
      proiettile.x = x;   /* Coordinata X iniziale */
      proiettile.y = y;   /* Coordinata Y iniziale */
      proiettile.c='-' ;
    
      write(proiettile_pipeout,&proiettile,sizeof(proiettile));
    
      while(1){
        /* Se supero area X schermo inverte il movimento */
        if(proiettile.x + deltax > MAXX){
          //CHIUDI PROCESSO
          kill(pidP,1);  
        }
    
        /* Movimento X */
        proiettile.x += deltax;
    
        /* Comunico le coordinate correnti al processo padre */
        write(proiettile_pipeout,&proiettile,sizeof(proiettile));
    
        /* Inserisco una pausa per rallentare il movimento */
        usleep(DELAY);
      }
    }
    

    Luego, en la función Spaceship, cuando el usuario presione el botón de disparo, puede llamar a la función Proiettile con la salida de tubería correcta:

    if(c==SHOOT) {
      pidP = fork();
    
      if(pidP==0) {
        flash();
        mvprintw(apos.y+1,apos.x,"-");
        refresh();
        /* ed eseguo quindi la relativa funzione di gestione */
        close(pipeout); /* chiusura del descrittore di lettura */
        Proiettile(pipeout,apos.x,apos.y, p[1]); /* invocazione funzione proiettile */    
      }     
    }
    

Comments are closed.