PDA

Visualizza la versione completa : [C] Implementazione bonus gioco pacman


gaten
13-10-2012, 15:53
Ragazzi stò implementando dei bonus(per ora solo uno) nel gioco pacman, l'ho fatto in questo modo:

Bonus.h



#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


#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


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.

linoma
13-10-2012, 21:37
Controlli ogni 10 secondi se BONUS != NULL

gaten
13-10-2012, 21:42
E' proprio qui che ho difficoltà, inoltre non riesco a capire come mai quando mi muovo col pacman, ogni tanto esce il bonus ma sempre attaccato a pacman

linoma
14-10-2012, 10:10
Se sei forunato ricrei il bonus, hai il 10% che ogni volta sia diverso, è corretto? Nn dovrebbe essere ricreato dop 10 secondi?

gaten
14-10-2012, 15:40
Si è così

gaten
16-10-2012, 12:56
Sono riuscito a risolvere un pò di cosette facendo così:

Bonus.c


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


// 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.




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 ?

Loading