这是一个吃豆游戏的Java实现,具体代码较多请下载文件。
下载地址: http://download.youkuaiyun.com/source/396925
package
org.loon.test;

import
java.awt.Color;
import
java.awt.Event;
import
java.awt.Frame;
import
java.awt.Graphics;
import
java.awt.Image;
import
java.awt.Insets;
import
java.awt.MediaTracker;
import
java.awt.Panel;
import
java.awt.Toolkit;
import
java.awt.event.WindowAdapter;
import
java.awt.event.WindowEvent;
import
java.awt.image.BufferedImage;
import
java.awt.image.VolatileImage;


/***/
/**
*
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:
*</p>
*<p>
*Copyright:Copyright(c)2008
*</p>
*<p>
*Company:LoonFramework
*</p>
*<p>
*License:http://www.apache.org/licenses/LICENSE-2.0
*</p>
*
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/

class
Timer
implements
Runnable
...
{
Pacgameap;

intduration;

privateThreadmyThread;

privatebooleanloopf=true;

privatelongtickCount;


publicTimer(Pacgameap,intduration)...{
this.ap=ap;
this.duration=duration;
}


publicTimer(Pacgameap)...{
this(ap,16);
}


publicvoidon()...{
myThread=newThread(this);
myThread.start();
}


publicvoidoff()...{
loopf=false;
}


publicvoidrun()...{
loopf=true;
tickCount=System.currentTimeMillis();

while(loopf)...{

try...{
Thread.sleep(duration);

}catch(Exceptione)...{
e.printStackTrace();
}
ap.notifyFrame();
}
}


publicintframes()...{
longnowTick=System.currentTimeMillis();
intframe=(int)(nowTick-tickCount)/duration;

if(frame<=0)...{
frame=1;
tickCount=nowTick;

}elseif(frame>5)...{
frame=5;
tickCount=nowTick;

}else...{
tickCount+=frame*duration;
}
returnframe;
}
}


public
class
Pacgame
extends
Panel
implements
Runnable
...
{

/***//**
*
*/
privatestaticfinallongserialVersionUID=1L;

privatestaticintWIDTH=256;

privatestaticintHEIGHT=224;

Threadthread;

//构造一个双缓冲的、可变的image
VolatileImageoffImage;

Imagebg,bg0;

CGloaderloader;

MazeManagermzmanager;

MapManageremanager;

SpriteManagerspmanager,chipmanager;

MonsterSpriteredmon,ao,pink,monster;

PacSpritepac;

AttractManageratMng;

Timertimer;

intkey=0;

intscore;

intnumber1;

booleanloadOK=false;

booleanisAttr=false;


publicvoidinit()...{
ClassLoadercl=getClass().getClassLoader();
Toolkittk=Toolkit.getDefaultToolkit();
bg0=tk.createImage(cl.getResource("main.png"));
bg=newBufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_ARGB_PRE);
MediaTrackermt=newMediaTracker(this);
mt.addImage(bg0,0);

try...{
mt.waitForID(0);

}catch(Exceptione)...{
e.printStackTrace();
}
loader=newCGloader("pacchr.png",this);
loader.setAlpha(0,8);

mzmanager=newMazeManager();

emanager=newMapManager();

spmanager=newSpriteManager(4);
chipmanager=newSpriteManager(5);

pac=newPacSprite(10,20,loader);
redmon=newRedMonster(10,10,mzmanager,loader);
redmon.setTarget(pac);
spmanager.add(redmon);
ao=newBlueMonster(9,13,mzmanager,loader);
ao.setTarget(pac);
spmanager.add(ao);
pink=newPinkMonster(10,13,mzmanager,loader);
pink.setTarget(pac);
spmanager.add(pink);
monster=newMonster(11,13,mzmanager,loader);
monster.setTarget(pac);
spmanager.add(monster);

for(inti=0;i<5;i++)...{
chipmanager.add(newChipSprite(i*16,0,loader,i*16,130,16,
16));
}

atMng=newAttractManager(loader);
timer=newTimer(this,16);

setBackground(Color.black);
setSize(WIDTH,HEIGHT);

offImage=createVolatileImage(WIDTH,HEIGHT);

}


publicvoidpaint(Graphicsg)...{
if(!loadOK)
return;

do...{
intreturnCode=offImage.validate(getGraphicsConfiguration());

if(returnCode==VolatileImage.IMAGE_INCOMPATIBLE)...{
offImage=createVolatileImage(WIDTH,HEIGHT);
}
GraphicsvolG=offImage.getGraphics();
volG.drawImage(bg,0,0,this);
spmanager.draw(volG,this);
pac.draw(volG,this);
chipmanager.draw(volG,this);
if(isAttr)
atMng.draw(volG,this);
volG.dispose();
g.drawImage(offImage,0,0,this);
}while(offImage.contentsLost());
}


publicvoidupdate(Graphicsg)...{
paint(g);
}


publicvoidstart()...{
System.gc();

if(thread==null)...{
thread=newThread(this);
thread.start();
}
}

@SuppressWarnings("deprecation")

publicvoidstop()...{

if(thread!=null)...{
thread.stop();
thread=null;
}
}


publicvoidrun()...{


while(true)...{
//MAINLOOP
score=0;
number1=3;
intstage=1;
esaInit();
loadOK=true;

while(number1>0)...{

while(gameMain(stage)==2)...{
if(stage==2)
gameTheater();
stage++;
number1++;//1:DEAD2:CLEAR
esaInit();
}
}
//GAMEOVER
isAttr=true;
spmanager.setShow(false);
pac.setShow(false);
atMng.player=true;
atMng.ready=false;
atMng.gameover=true;
repaint();

timer.on();
key=0;

while(true)...{
if(key>0)
break;
waitFrame();
}
timer.off();
atMng.player=false;
atMng.gameover=false;
}

}


publicvoidesaInit()...{
Graphicsg=bg.getGraphics();
g.drawImage(bg0,0,0,null);
g.dispose();
emanager.init(bg);
}


publicintgameMain(intstage)...{
atMng.init(bg,score,number1);
spmanager.init();
pac.init();
//游戏状态1:DEAD2:CLEAR
intgamestat=0;
intrenzoku=0;
booleanispower=false;
booleaniseyesnd=false;
Spritechip;

isAttr=true;
intwait;

if((score==0)&&(number1==3))...{
wait=2000;

}else...{
wait=1000;
}

spmanager.setShow(false);
pac.setShow(false);
atMng.player=true;
atMng.ready=true;
repaint();
sleep(wait);

atMng.setBattle(--number1);
spmanager.setShow(true);
pac.setShow(true);
atMng.player=false;
atMng.ready=true;
repaint();
sleep(wait);
isAttr=false;

inttime=0;
timer.on();
intframe=1;

while(gamestat==0)...{

for(intl=0;l<frame;l++)...{
intscore0=score;

if(time==60*55)...{
spmanager.setNawabari(false);

}elseif(time==60*50)...{
spmanager.setNawabari(true);

}elseif(time==60*30)...{
spmanager.setNawabari(false);

}elseif(time==60*25)...{
spmanager.setNawabari(true);

}elseif(time==60*5)...{
spmanager.setNawabari(false);
}
spmanager.run();
MonsterSpritehitmon=spmanager.isMonsterHit(pac);

if(hitmon!=null)...{
intstate=hitmon.getState();
if(state==0)
gamestat=1;

if(state==1)...{
renzoku++;
score=score+(1<<renzoku)*100;
chip=chipmanager.getSprite(renzoku);
intx=hitmon.getX();
inty=hitmon.getY();
chip.setXY(x,y);
chip.setShow(true);
hitmon.setShow(false);
pac.setShow(false);


try...{
Thread.sleep(50);

}catch(Exceptione)...{
}

repaint();

for(inti=0;i<50;i++)...{

try...{
Thread.sleep(10);

}catch(Exceptione)...{
}
}
chip.setShow(false);
hitmon.setShow(true);
pac.setShow(true);
hitmon.activity();
iseyesnd=true;


if(ispower)...{
if(iseyesnd)

try...{
Thread.sleep(10);

}catch(Exceptione)...{
}

}
}
}

pac.setKey(key);
intesa=pac.run(mzmanager,emanager);

if(esa>0)...{
intremain=emanager.getRemain();
score+=10;
if(remain<=0)
gamestat=2;
}

if(esa==2)...{
redmon.state();
ao.state();
pink.state();
monster.state();
pac.powerup();
renzoku=0;
score+=40;
ispower=true;
}


if(ispower)...{
if(!pac.isPower()
||((redmon.getState()!=1)
&&(ao.getState()!=1)
&&(pink.getState()!=1)&&(monster

.getState()!=1)))...{

ispower=false;
}
}

if(iseyesnd)...{
if((redmon.getState()!=2)&&(ao.getState()!=2)
&&(pink.getState()!=2)

&&(monster.getState()!=2))...{

iseyesnd=false;
}
}


if(score!=score0)...{
atMng.setScore(score);
}
time++;
score0=score;
if(gamestat>0)
break;
}//FPSLOOPEND

repaint();
frame=waitFrame();
System.gc();
}
timer.off();


try...{
Thread.sleep(2000);

}catch(Exceptione)...{
}

returngamestat;
}


publicvoidgameTheater()...{
Graphicsg=bg.getGraphics();
g.setColor(Color.black);
g.fillRect(0,0,WIDTH,HEIGHT);
g.dispose();

intpacx=WIDTH;
intp;
intindex=288;
spmanager.setShow(false);
pac.init();
pac.setShow(true);
redmon.init();
redmon.setShow(true);

timer.on();
intframe=1;
inti=0;

while(i<380)...{

for(intj=0;j<frame;j++)...{
p=2;

switch((i>>2)%4)...{
case1:
p+=4;
break;
case3:
p=8;
break;
}
pac.setP(p);
pac.setXY(pacx--,100);
redmon.setXY(index--,100);
i++;
if(i>=360)
break;
}
repaint();
frame=waitFrame();
}

pacx=-32;
redmon.state();
index=0;

i=0;

while(i<380)...{

for(intj=0;j<frame;j++)...{
p=0;

switch((i>>2)%4)...{
case1:
p+=4;
break;
case3:
p=8;
break;
}
pac.setP(p);
pac.setXY(pacx++,100);
redmon.setXY(index++,100);
i++;
if(i>=360)
break;
}
repaint();
frame=waitFrame();
}

timer.off();
}


publicvoidsleep(inttm)...{

try...{
Thread.sleep(tm);

}catch(Exceptione)...{
e.printStackTrace();
}
}


publicbooleanhandleEvent(Evente)...{

switch(e.id)...{
caseEvent.KEY_PRESS:
caseEvent.KEY_ACTION:

switch(e.key)...{
caseEvent.RIGHT:
key=1;
break;
caseEvent.DOWN:
key=2;
break;
caseEvent.LEFT:
key=4;
break;
caseEvent.UP:
key=8;
break;
}
returntrue;
caseEvent.KEY_RELEASE:
caseEvent.KEY_ACTION_RELEASE:
default:
}
returnfalse;
}


/***//**
*fps计算
*
*@return
*/

privatesynchronizedintwaitFrame()...{

try...{
wait();

}catch(InterruptedExceptione)...{
}
//返回fps
returntimer.frames();
}


publicsynchronizedfinalvoidnotifyFrame()...{
notifyAll();
}


publicstaticvoidmain(String[]args)...{
finalPacgameap=newPacgame();
ap.setSize(WIDTH,HEIGHT);
Framefrm=newFrame("Java吃豆游戏");

frm.addWindowListener(newWindowAdapter()...{

publicvoidwindowClosing(WindowEvente)...{
ap.stop();
System.exit(0);
}
});
frm.addNotify();
Insetsinset=frm.getInsets();
intw0=inset.left+inset.right;
inth0=inset.top+inset.bottom;
frm.add(ap);
frm.setSize(ap.getWidth()+w0,ap.getHeight()+h0);
frm.setResizable(false);
frm.setLocationRelativeTo(null);
frm.setVisible(true);
ap.requestFocus();
ap.init();
ap.start();
}

}
下载地址: http://download.youkuaiyun.com/source/396925




























































































































































































































































































































































































































































































































































































































































































