⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fig15_21.c

📁 C程序设计经典教程第5版程序示例,比较适合初级c语言的学生
💻 C
字号:
/* Fig. 15.21: fig15_21.c
   Using datafiles. */
#include <allegro.h>
#include "pong.h"

/* symbolic constants for the ball抯 possible directions */
#define DOWN_RIGHT 0
#define UP_RIGHT 1
#define DOWN_LEFT 2
#define UP_LEFT 3

/* function prototypes */
void moveBall( void );
void respondToKeyboard( void );
void reverseVerticalDirection( void );
void reverseHorizontalDirection( void );

volatile int ball_x; /* the ball抯 x-coordinate */
volatile int ball_y; /* the ball抯 y-coordinate */
volatile int barL_y; /* y-coordinate of the left paddle */
volatile int barR_y; /* y-coordinate of the right paddle */
volatile int scoreL; /* score of the left player */
volatile int scoreR; /* score of the right player */
volatile int direction; /* the ball抯 direction */
BITMAP *buffer; /* pointer to the buffer */
DATAFILE *pongData; /* pointer to the datafile */

int main( void )
{
   /* first, set up Allegro and the graphics mode */
   allegro_init(); /* initialize Allegro */
   install_keyboard(); /* install the keyboard for Allegro to use */
   install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, NULL );
   install_timer(); /* install the timer handler */
   set_color_depth( 16 ); /* set the color depth to 16-bit */
   set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0 ); /* set graphics mode */
   buffer = create_bitmap(SCREEN_W, SCREEN_H);/* create buffer */
   pongData = load_datafile( "pongdatafile.dat" ); /* load the datafile */
   ball_x = SCREEN_W / 2; /* give ball its initial x-coordinate */
   ball_y = SCREEN_H / 2; /* give ball its initial y-coordinate */
   barL_y = SCREEN_H / 2; /* give left paddle its initial y-coordinate */
   barR_y = SCREEN_H / 2; /* give right paddle its initial y-coordinate */
   scoreL = 0; /* set left player抯 score to 0 */
   scoreR = 0; /* set right player抯 score to 0 */
   srand( time( NULL ) ); /* seed the random function ... */
   direction = rand() % 4; /* and then make a random initial direction */
   /* add timer that calls moveBall every 5 milliseconds */
   install_int( moveBall, 5 );
   /* add timer that calls respondToKeyboard every 10 milliseconds */
   install_int( respondToKeyboard, 10 );
   
   while ( !key[KEY_ESC] ) /* until the escape key is pressed ... */
   {
      /* now, perform double buffering */
      clear_to_color( buffer, makecol( 255, 255, 255 ) );
      blit( pongData[BALL].dat, buffer, 0, 0, ball_x, ball_y, 40, 40 );
      blit( pongData[BAR].dat, buffer, 0, 0, 0, barL_y, 20, 100 );  
      blit( pongData[BAR].dat, buffer, 0, 0, 620, barR_y, 20, 100 );
      line( buffer, 0, 30, 640, 30, makecol( 0, 0, 0 ) );
      /* draw text onto the buffer */
      textprintf_ex( buffer, pongData[PONGFONT].dat, 75, 0, makecol( 0, 0, 0 ),
                     -1, "Left Player Score: %d", scoreL );             
      textprintf_ex( buffer, pongData[PONGFONT].dat, 400, 0, makecol( 0, 0, 0 ),
                     -1, "Right Player Score: %d", scoreR );            
      blit( buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h );    
      clear_bitmap( buffer );                                      
   } /* end while */
 
   remove_int( moveBall ); /* remove moveBall timer */
   remove_int( respondToKeyboard ); /* remove respondToKeyboard timer */
   destroy_bitmap( buffer ); /* destroy the buffer bitmap */
   unload_datafile( pongData ); /* unload the datafile */
   return 0;
} /* end function main */
END_OF_MAIN() /* don抰 forget this! */

void moveBall() /* moves the ball */
{
   switch ( direction ) {
      case DOWN_RIGHT:
         ++ball_x; /* move the ball to the right */
         ++ball_y; /* move the ball down */
         break;
      case UP_RIGHT:
         ++ball_x; /* move the ball to the right */
         --ball_y; /* move the ball up */
         break;
      case DOWN_LEFT:
         --ball_x; /* move the ball to the left */
         ++ball_y; /* move the ball down */
         break;
      case UP_LEFT:
         --ball_x; /* move the ball to the left */
         --ball_y; /* move the ball up */
         break;
   } /* end switch */

   /* if the ball is going off the top or bottom ... */
   if ( ball_y <= 30 || ball_y >= 440 ) 
      reverseVerticalDirection(); /* make it go the other way */

   /* if the ball is in range of the left paddle ... */                   
   if (ball_x < 20 && (direction == DOWN_LEFT || direction == UP_LEFT))   
   {                                                                      
      /* is the left paddle in the way? */                                
      if ( ball_y > ( barL_y - 39 ) && ball_y < ( barL_y + 99 ) )         
         reverseHorizontalDirection();                                    
      else if ( ball_x <= -20 ) { /* if the ball goes off the screen */     
         ++scoreR; /* give right player a point */                        
         ball_x = SCREEN_W / 2; /* place the ball in the ... */           
         ball_y = SCREEN_H / 2; /* ... center of the screen  */           
         direction = rand() % 4; /* give the ball a random direction */   
      } /* end else */                                                    
   } /* end if */                                                         
   
   /* if the ball is in range of the right paddle ... */                  
   if (ball_x > 580 && (direction == DOWN_RIGHT || direction == UP_RIGHT))
   {                                                                      
      /* is the right paddle in the way? */                               
      if ( ball_y > ( barR_y - 39 ) && ball_y < ( barR_y + 99 ) )         
         reverseHorizontalDirection();                                    
      else if ( ball_x >= 620 ) { /* if the ball goes off the screen */   
         ++scoreL; /* give left player a point */                         
         ball_x = SCREEN_W / 2; /* place the ball in the ... */           
         ball_y = SCREEN_H / 2; /* ... center of the screen  */           
         direction = rand() % 4; /* give the ball a random direction */   
      } /* end else */                                                    
   } /* end if */                                                         
} /* end function moveBall */

void respondToKeyboard() /* responds to keyboard input */                  
{                                                                          
   if ( key[KEY_A] ) /* if A is being pressed... */                        
      barL_y -= 3; /* ... move the left paddle up */                       
   if ( key[KEY_Z] ) /* if Z is being pressed... */                        
      barL_y += 3; /* ... move the left paddle down */                     
                                                                           
   if ( key[KEY_UP] ) /* if the up arrow key is being pressed... */        
      barR_y -= 3; /* ... move the right paddle up */                      
   if ( key[KEY_DOWN] ) /* if the down arrow key is being pressed... */    
      barR_y += 3; /* ... move the right paddle down */                    
                                                                           
   /* make sure the paddles don抰 go offscreen */                          
   if ( barL_y < 30 ) /* if left paddle is going off the top */        
      barL_y = 30;                                                         
   else if ( barL_y > 380 ) /* if left paddle is going off the bottom */    
      barL_y = 380;                                                        
   if ( barR_y < 30 ) /* if right paddle is going off the top */       
      barR_y = 30;                                                         
   else if ( barR_y > 380 ) /* if right paddle is going off the bottom */   
      barR_y = 380;                                                        
} /* end function respondToKeyboard */                                     

void reverseVerticalDirection() /* reverse the ball抯 up-down direction */
{
   if ( ( direction % 2 ) == 0 ) /* "down" directions are even numbers */
      ++direction; /* make the ball start moving up */
   else /* "up" directions are odd numbers */
      --direction; /* make the ball start moving down */
   play_sample( pongData[BOING].dat, 255, 128, 1000, 0 ); /* play sound */
} /* end function reverseVerticalDirection */

void reverseHorizontalDirection() /* reverses the horizontal direction */
{
   direction = ( direction + 2 ) % 4; /* reverse horizontal direction */
   play_sample( pongData[BOING].dat, 255, 128, 1000, 0 ); /* play sound */
} /* end function reverseHorizontalDirection */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -