Ragazzi stò implementando dei bonus(per ora solo uno) nel gioco pacman, l'ho fatto in questo modo:

Bonus.h

codice:
#ifndef BONUS_H
#define BONUS_H

#include "Pacman.h"
#include "Mappa.h"

#define BONUS_VELOCITA_COLOR 0x0A


#define TEMPO_B_VELOCITA        2000
enum BONUS { VELOCITA=7, PERCORSO_BREVE, UNKNOWN };

typedef struct _bonus {
        int BonusX;
        int BonusY;
        int BonusTime;
        int BonusType;
} BONUS;


BONUS *InitBonus( MAPPA *M );
void GeneraBonus( PACMAN *P, BONUS *B );
void BonusVelocita( PACMAN *P );
void BonusPercorsoBreve();
void StampaBonus();

#endif
Bonus.c
codice:
#include "Bonus.h"

void ScegliBonus( PACMAN *P, BONUS *B )
{ 
      switch( B->BonusType )
      {
              case VELOCITA:
                   BonusVelocita( P );
                   break;
      }             
}

/*  Inizializzo il bonus
    x    = coordinata x
    y    = coordinata y;
    time = tempo visualizzazione bonus
*/
BONUS *InitBonus( MAPPA *M ) 
{
      BONUS *B = NULL;
      int prob = rand() % 100;
      int i, j;   
      
      // Ho la probabilità del 10% che il bonus venga generato
      if ( prob >= 90 )
      {
           // Genero casualmente uno dei tre bonus a disposizione
           //short val = rand() % 9 + 7;
           short val = 7;

           B = ( BONUS* )malloc( sizeof ( BONUS ) );
           
           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( i=0; i < M->NRighe; i++ ) 
                {
                     if ( M->Mappa[i][j] == val )
                     {
                        B->BonusX = i;
                        B->BonusY = j;
                     }
                }
           }            
      }
      
      return B;
}

// Setta a 200 la velocità di pacman ( inizialmente è a 100 )
void BonusVelocita( PACMAN *P )
{       
       P->PacWait = 200;
}


// Funzione per stampare a video il bonus
void StampaBonus( BONUS *B )
{
     Gotoxy( B->BonusX, B->BonusY );
     
     switch ( B->BonusType )
     {
              case VELOCITA:
                   TextColor( BONUS_VELOCITA_COLOR );
                   printf( "%c", 184 );
                   break;                                               
     }
}
adesso il problema ce l'ho nel main

main.c
codice:
    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] == 1 && ( P->PacX != NewX || P->PacY != NewY ) )
            { 
                 Clrscr();
                 P->PacX = NewX; 
                 P->PacY = NewY; 
                 StampaPacman( P );

                 Bonus = InitBonus( M );
                 
                 // Se sono fortunato, genero il bonus
                 if ( Bonus != NULL )
                 {
                      // Stampo a video il bonus
                      StampaBonus( Bonus );
                      
                      // 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 );
                      }    
                 }
            }
            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;
        }
  } while ( Tasto != ESC );
Qui ho un ciclo di polling e dovrei fare in modo che quando il Bonus != NULL, questo deve essere stampato permanentemente sulla mappa per una decina di secondi. Poi se pacman riesce a cattuararlo, richiamo ScegliBonus.