วันพฤหัสบดีที่ 30 มิถุนายน พ.ศ. 2554

เกม Pacman

              จงเขียนเกม PACMAN โดยมีรายละเอียดดังนี้
    n1. มีลูกบอลทั้งหมด 80 ลูก
 n2. มีการเก็บคะแนนและแสดงคะแนนด้านซ้ายบน
 n3. หากกินลูกบอลหมดจะขึ้นคำว่า YOU WIN



PACMAN SCREENSHOT



ตัวอย่างการเล่นเกม 


http://www.youtube.com/watch?v=QYL5QQiGHx8


อธิบายโค้ด



                 SOURCECODE

#include <cdx_app_wiz.h>

// ------------------------------------------------------------------
// CDX Objects
// ------------------------------------------------------------------
CDXScreen   *Screen     = 0;      // The screen object, every program must have one
CDXInput    *Input            = 0;
FPSmanager  *Fps        = 0;
CDXSnd*     g_snd;
CDXSprite   * pac       = 0;
CDXSprite   * pac_up          = 0;
CDXSprite   * pac_dw    = 0;
CDXSprite   * pac_re    = 0;
     //ประกาศตัวแปรพอย์นเตอร์ทั้งหมดที่ใช้ในการโปรแกรมเกม Pacman

int x, y, i, j, c;
int score,points,num,k=0;
int a=0;
bool still=false;
     //ประกาศตัวแปรทั้งหมดที่ใช้ในการโปรแกรมเกม Pacman
typedef struct
{
      int x, y;
      CDXSprite* ball;
      bool Active;
     
     
}BALLINFO;
BALLINFO myball[10][8];
     //ประกาศโครงสร้างตัวแปรชนิดใหม่ขึ้นมาเพื่อใช้งานในการโปรแกรมแกรมเกม Pacman
// ------------------------------------------------------------------
// cdx_Init - handles initialization of the CDX objects
// ------------------------------------------------------------------
BOOL cdx_Init()
{
      Screen = new CDXScreen();
      Screen->Create( );
      Screen->CreateWindowed( 480, 272, 32, SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_INIT_TIMER );

      Input = new CDXInput( );
      Input->Create( );

      Fps = new FPSmanager( );
      SDL_initFramerate( Fps );
      SDL_setFramerate( Fps, 30 );
     //คำสั่งจองหน่วยความจำให้กับโปรแกรมPacman และคำสั่งในการสร้างหน้าต่างของโปรแกรม

      // TODO: Initialize your own CDX objects here

      pac = new CDXSprite( );
      pac->Create( "pac.png", 1 );

      pac_re = new CDXSprite( );
      pac_re->Create( "pac_re.png", 1 );

      pac_up = new CDXSprite( );
      pac_up->Create( "pac_up.png", 1 );

      pac_dw = new CDXSprite( );
      pac_dw->Create( "pac_dw.png", 1 );
          //จองหน่วยความจำสำหรับการแสดงรูปภาพในแต่ละไฟล์

      for( i = 0; i < 10; i++ )
      for( j = 0; j < 8; j++ )
      {
            myball[i][j].ball = new CDXSprite( );
            myball[i][j].ball->Create( "ball.png", 1 );
            myball[i][j].x = 40*(i+1);
            myball[i][j].y = 30*(j+1);

            myball[i][j].ball->SetPos( myball[i][j].x, myball[i][j].y );
            myball[i][j].Active = true;
           
      }
          //จองหน่วยความจำในการสร้างลูกบอลทั้งหมด 80 ลูก
      g_snd = new CDXSnd( );
      g_snd->Create( );

     

      return TRUE;
}

// ------------------------------------------------------------------
// cdx_DeInit - handles cleanup of CDX objects
// ------------------------------------------------------------------
void cdx_DeInit( void )
{
      // TODO: Destroy your CDX objects here
      for( i = 0; i < 10; i++ )
            for( j = 0; j < 8; j++ )
            SAFEDELETE( myball[i][j].ball );
      SAFEDELETE(pac);
      SAFEDELETE(pac_re);
      SAFEDELETE(pac_up);
      SAFEDELETE(pac_dw);
      SAFEDELETE( g_snd );

      SAFEDELETE( Fps );
      SAFEDELETE( Input );
      SAFEDELETE( Screen );
     //คำสั่งในการคืนหน่วยความจำทั้งหมดให้กับ OS
}

// ------------------------------------------------------------------
// cdx_DoFrame - performs drawing of the current frame
// ------------------------------------------------------------------
void cdx_DoFrame()
{
      Input->Update( );

      Screen->GetBackEx()->Fill(0);
             


      // TODO: Add code to draw your objects during each frame
      g_snd->Play( "siren.ogg" );
          //คำสั่งในการเล่นเสียงBGM

      if(x<=0) x=0;
      if (x>=450)
            x=450;
      if(y<=0)y=0;
      if(y>=245)
            y=245;
          //คำสั่งสร้างเส้นขอบของหน้าต่างซึ่งมีผลที่ให้ตัวPacman เดินไม่ทะลุหน้าจอ โดยให้วีการกำหนดลิมิตค่า x,y
      pac->SetPos( x, y );
      pac_re->SetPos( x, y );
      pac_up->SetPos( x, y );
      pac_dw->SetPos( x, y );
                                //คำสั่งแสดงตำแหน่งของภาพ
      switch(a){
            case 1:pac->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );break;
          //คำสั่งที่ใช้ในการแสดงภาพ
            case 2:pac_re->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );break;
            case 3:pac_up->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );break;
            case 4:pac_dw->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );break;
            case 0:pac->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );break;
            case 9: break;
      }
           
      if(num!=80){
      if( Input->GetKeyState(SDLK_RIGHT)||
            Input->GetKeyState(CDXKEY_JOYBUTN9)){
            x += 5; a=1;}

      if( Input->GetKeyState(SDLK_LEFT)||
            Input->GetKeyState(CDXKEY_JOYBUTN7)){
            x -= 5; a=2;}

      if( Input->GetKeyState(SDLK_UP)||
            Input->GetKeyState(CDXKEY_JOYBUTN8)){
            y -= 5; a=3;}

      if( Input->GetKeyState(SDLK_DOWN)||
            Input->GetKeyState(CDXKEY_JOYBUTN6)){
            y += 5; a=4;}
      }
     //คำสั่งรับข้อมูลจากทางคีย์บอร์ดแล้วนำไปประมวลผลเป็นการบังคับทิศทางของตัว Pacman
      for( i = 0; i < 10; i ++ ){
            for( j = 0; j < 8; j++ )
            {
                  if( pac->SpriteHit(myball[i][j].ball) && myball[i][j].Active ){
                        myball[i][j].Active = false;
                        points=points+10;
                        score=points;
                        num=num+1;
                        g_snd->Play( "munch_a.wav" );
                  }
                  if( myball[i][j].Active ){
                        myball[i][j].ball->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );}
            }
      }
     //แสดงผล ตรวจสอบการชนกันของภาพ และเมื่อมีการชนกันของภาพจะมีการเก็บคะแนนเอาไว้ที่ตัวแปร points เพื่อเก็บเป็น คะแนนสะสม Score   
      score=points+score;
      TextXY( Screen->GetBack(), 20, 20, 233, 227, 66, 255, ETA_RIGHT, "Score : %d",points);
     // คำสั่งแสดง คะแนน
      if(num==80){
            a=9;
            TextXY(Screen->GetBack(),50,70,233,227,66,255,ETA_CENTER,"You Win.");
            pac->SetPos( 230, 90 );
            pac->Draw( Screen->GetBack(), 0, 0, CDXBLT_TRANS );
            TextXY(Screen->GetBack(),50,130,233,227,66,255,ETA_CENTER,"Congratulation.Your score : %d",points);
      }
     //คำสั่งแสดงข้อความเมื่อเกมจบ
      Screen->Flip( 0, 0, 1 );
      SDL_framerateDelay( Fps );
}

int main( int argc, char* args[] )
{
#ifdef _PSP

#ifndef NDEBUG
      pspDebugScreenInit( );
#endif

      SetupCallbacks( );
#endif     

      cdx_Init();

      while(1)
      {
      #ifdef WIN32
                  if( Input->GetKeyState(SDLK_ESCAPE) )
                        break;
      #endif
                        cdx_DoFrame();
            }

            cdx_DeInit();

            return 0;
 }






ไม่มีความคิดเห็น:

แสดงความคิดเห็น