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 ?