จงเขียนเกม PACMAN โดยมีรายละเอียดดังนี้
n1. มีลูกบอลทั้งหมด 80 ลูก
n2. มีการเก็บคะแนนและแสดงคะแนนด้านซ้ายบน
n3. หากกินลูกบอลหมดจะขึ้นคำว่า YOU WIN
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;
}
ไม่มีความคิดเห็น:
แสดงความคิดเห็น