Ragazzi stò implementando dei bonus(per ora solo uno) nel gioco pacman, l'ho fatto in questo modo:
Bonus.h
Bonus.ccodice:#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
adesso il problema ce l'ho nel maincodice:#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; } }
main.c
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.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 );

Rispondi quotando