Sono riuscito a risolvere un pò di cosette facendo così:

Bonus.c
codice:
BONUS *InitBonus()
{
      BONUS *B;
      B = ( BONUS* )malloc( sizeof ( BONUS ) );
      
      B->BonusState = 0;
      B->BonusTimeDopo = clock();
      B->BonusTimePrima = clock();
      
      return B;
}


void GeneraBonus( MAPPA *M, BONUS *B ) 
{
      int prob = rand() % 100;
      int i, j;   
      
      // Ho la probabilità del 10% che il bonus venga generato
      if ( B->BonusState == 0 ) 
      {
           //if ( prob >= 90 )
           //{
           // Genero casualmente uno dei tre bonus a disposizione
           //short val = rand() % 9 + 7;
           short val = 7;
           
           B->BonusState = 1;
           B->BonusType = val;
           
           if ( val == 7 ) 
                B->BonusTime = TEMPO_B_VELOCITA;
           //else if ( val == 8 ) 
             //   B->BonusTime = TEMPO_B_PERCORSO_BREVE;
           //else
             //   B->BonusTime = TEMPO_B_UNKNOWN;
           
           for( i=0; i < M->NRighe; i++ ) 
           {
                for( j=0; j < M->NRighe; j++ ) 
                {
                     if ( M->Mappa[i][j] == val )
                     {
                        B->BonusX = j;
                        B->BonusY = i;
                     }
                }
           }            
           //}
      }
}

MAIN
codice:
   // Con un ciclo di polling vengono esaminati i vari oggetti del gioco
    do
    {   // se non viene battuto alcun tasto, Tasto vale zero, e PacMan 
        // permane nel suo stato di quiete o di moto rettilineo uniforme 
        Tasto = LeggiTasto( 0 );
        if ( Tasto ) PacDirezione = Tasto;
        
        PacDopo = clock(); 
        if ( PacDopo - PacPrima > P->PacWait )  // movimento ogni decimo di secondo
        {
            NewX = P->PacX; 
            NewY = P->PacY;
             
            // l'universo di gioco e' toroidale
            if ( PacDirezione==CURSORUP    )    NewY = ( P->PacY-1+M->NRighe )  % M->NRighe;
            if ( PacDirezione==CURSORLEFT  )    NewX = ( P->PacX-1+M->NColonne )% M->NColonne;
            if ( PacDirezione==CURSORDOWN  )    NewY = ( P->PacY+1 ) % M->NRighe;
            if ( PacDirezione==CURSORRIGHT )    NewX = ( P->PacX+1 ) % M->NColonne;
            
            // si sposta solo se e' nel labirinto
            if ( M->Mappa[NewY][NewX] != 9 && ( P->PacX != NewX || P->PacY != NewY ) )
            { 
                 Clrscr();
                 P->PacX = NewX; 
                 P->PacY = NewY; 
                 StampaPacman( P );
                 
                 GeneraBonus( M, Bonus );
                 
                 // Se sono fortunato, genero il bonus
                 if ( Bonus->BonusState == 1 )
                 {
                      if ( Bonus->BonusTimeDopo - Bonus->BonusTimePrima < Bonus->BonusTime ){         
                      // Stampo a video il bonus
                           StampaBonus( Bonus );
                      } else {
                           Bonus->BonusState = 0;
                      }
                      
                      // Verifico se pacman ha catturato il bonus se si scelgo il bonus generato
                      if ( P->PacX == Bonus->BonusX && P->PacY == Bonus->BonusY )
                      {
                           ScegliBonus( P, Bonus );
                           AssegnaBonus( Bonus );
                      }    
                 }
            }
            else if( M->Mappa[NewY][NewX] == 4 ) // Se esco dal labirinto stampo a video "Uscita trovata"
            {
                 MessageBox( NULL, "Uscita Trovata", "Message Box", MB_OK );
                 Tasto = 27;
            }
         
            PacPrima = PacDopo;
            Bonus->BonusTimePrima = Bonus->BonusTimeDopo;
        }
  } while ( Tasto != ESC );
Per adesso quando inizio il bonus viene subito mostrato a video e quindi generato, ma io dovrei fare in modo che si manifesti una volto ogni tanto (magari con la probabilità del 10 % ) e inoltre una volta che viene generato deve restare per una quindicina di secondi, dopodichè se non mangiato, sparisce.

codice:
if ( Bonus->BonusTimeDopo - Bonus->BonusTimePrima < Bonus->BonusTime )
Qui ho cercato di mettere un tempo, ma non va, cioè una volta preso il bonus, funziona però, il bonus dovrebbe sparire, invece resta a video! Inoltre come mai quando l'omino và sul bonus, compare una "p" rispetto al carattere 184 ascii ?