Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269

    [C] Implementazione bonus gioco pacman

    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.
    Con i sogni possiamo conoscere il futuro...

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Controlli ogni 10 secondi se BONUS != NULL
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    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
    Con i sogni possiamo conoscere il futuro...

  4. #4
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Se sei forunato ricrei il bonus, hai il 10% che ogni volta sia diverso, è corretto? Nn dovrebbe essere ricreato dop 10 secondi?
    Per gli Spartani e Sparta usa spartan Il mio github

  5. #5
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Si è così
    Con i sogni possiamo conoscere il futuro...

  6. #6
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    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 ?
    Con i sogni possiamo conoscere il futuro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.