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.