Java版吃豆游戏

  • Post author:
  • Post category:java


这是一个吃豆游戏的Java实现,具体代码较多请下载文件。

下载地址:

http://download.csdn.net/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>


*


*


@author


chenpeng


* @email:ceponline@yahoo.com.cn


*


@version


0.1




*/








class


Timer


implements


Runnable




{



Pacgame ap;






int


duration;






private


Thread myThread;






private




boolean


loopf


=




true


;






private




long


tickCount;







public


Timer(Pacgame ap,


int


duration)




{





this


.ap


=


ap;




this


.duration


=


duration;


}










public


Timer(Pacgame ap)




{





this


(ap,


16


);


}










public




void


on()




{



myThread


=




new


Thread(


this


);


myThread.start();


}










public




void


off()




{



loopf


=




false


;


}










public




void


run()




{



loopf


=




true


;


tickCount


=


System.currentTimeMillis();





while


(loopf)




{






try






{



Thread.sleep(duration);



}





catch


(Exception e)




{



e.printStackTrace();


}





ap.notifyFrame();


}





}










public




int


frames()




{





long


nowTick


=


System.currentTimeMillis();




int


frame


=


(


int


) (nowTick





tickCount)


/


duration;





if


(frame


<=




0


)




{



frame


=




1


;


tickCount


=


nowTick;



}





else




if


(frame


>




5


)




{



frame


=




5


;


tickCount


=


nowTick;



}





else






{



tickCount


+=


frame


*


duration;


}







return


frame;


}





}










public




class


Pacgame


extends


Panel


implements


Runnable




{








/**




*




*/







private




static




final




long


serialVersionUID


=




1L


;






private




static




int


WIDTH


=




256


;






private




static




int


HEIGHT


=




224


;




Thread thread;






//


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






VolatileImage offImage;




Image bg, bg0;




CGloader loader;




MazeManager mzmanager;




MapManager emanager;




SpriteManager spmanager, chipmanager;




MonsterSprite redmon, ao, pink, monster;




PacSprite pac;




AttractManager atMng;




Timer timer;






int


key


=




0


;






int


score;






int


number1;






boolean


loadOK


=




false


;






boolean


isAttr


=




false


;







public




void


init()




{



ClassLoader cl


=


getClass().getClassLoader();


Toolkit tk


=


Toolkit.getDefaultToolkit();


bg0


=


tk.createImage(cl.getResource(





main.png





));


bg


=




new


BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB_PRE);


MediaTracker mt


=




new


MediaTracker(


this


);


mt.addImage(bg0,


0


);





try






{



mt.waitForID(


0


);



}





catch


(Exception e)




{



e.printStackTrace();


}





loader


=




new


CGloader(





pacchr.png





,


this


);


loader.setAlpha(


0


,


8


);




mzmanager


=




new


MazeManager();




emanager


=




new


MapManager();




spmanager


=




new


SpriteManager(


4


);


chipmanager


=




new


SpriteManager(


5


);




pac


=




new


PacSprite(


10


,


20


, loader);


redmon


=




new


RedMonster(


10


,


10


, mzmanager, loader);


redmon.setTarget(pac);


spmanager.add(redmon);


ao


=




new


BlueMonster(


9


,


13


, mzmanager, loader);


ao.setTarget(pac);


spmanager.add(ao);


pink


=




new


PinkMonster(


10


,


13


, mzmanager, loader);


pink.setTarget(pac);


spmanager.add(pink);


monster


=




new


Monster(


11


,


13


, mzmanager, loader);


monster.setTarget(pac);


spmanager.add(monster);





for


(


int


i


=




0


; i


<




5


; i


++


)




{



chipmanager.add(


new


ChipSprite(i


*




16


,


0


, loader, i


*




16


,


130


,


16


,




16


));


}







atMng


=




new


AttractManager(loader);


timer


=




new


Timer(


this


,


16


);




setBackground(Color.black);


setSize(WIDTH, HEIGHT);




offImage


=


createVolatileImage(WIDTH, HEIGHT);




}










public




void


paint(Graphics g)




{





if


(


!


loadOK)




return


;





do






{





int


returnCode


=


offImage.validate(getGraphicsConfiguration());





if


(returnCode


==


VolatileImage.IMAGE_INCOMPATIBLE)




{



offImage


=


createVolatileImage(WIDTH, HEIGHT);


}





Graphics volG


=


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());


}










public




void


update(Graphics g)




{



paint(g);


}










public




void


start()




{



System.gc();





if


(thread


==




null


)




{



thread


=




new


Thread(


this


);


thread.start();


}





}







@SuppressWarnings(





deprecation





)





public




void


stop()




{






if


(thread


!=




null


)




{



thread.stop();


thread


=




null


;


}





}










public




void


run()




{








while


(


true


)




{





//


MAIN LOOP






score


=




0


;


number1


=




3


;




int


stage


=




1


;


esaInit();


loadOK


=




true


;





while


(number1


>




0


)




{






while


(gameMain(stage)


==




2


)




{





if


(stage


==




2


)


gameTheater();


stage


++


;


number1


++


;


//


1:DEAD 2:CLEAR






esaInit();


}





}







//


GAME OVER






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


;


}







}










public




void


esaInit()




{



Graphics g


=


bg.getGraphics();


g.drawImage(bg0,


0


,


0


,


null


);


g.dispose();


emanager.init(bg);


}










public




int


gameMain(


int


stage)




{



atMng.init(bg, score, number1);


spmanager.init();


pac.init();




//


游戏状态 1:DEAD 2:CLEAR








int


gamestat


=




0


;




int


renzoku


=




0


;




boolean


ispower


=




false


;




boolean


iseyesnd


=




false


;


Sprite chip;




isAttr


=




true


;




int


wait;





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


;






int


time


=




0


;


timer.on();




int


frame


=




1


;





while


(gamestat


==




0


)




{






for


(


int


l


=




0


; l


<


frame; l


++


)




{





int


score0


=


score;





if


(time


==




60




*




55


)




{



spmanager.setNawabari(


false


);



}





else




if


(time


==




60




*




50


)




{



spmanager.setNawabari(


true


);



}





else




if


(time


==




60




*




30


)




{



spmanager.setNawabari(


false


);



}





else




if


(time


==




60




*




25


)




{



spmanager.setNawabari(


true


);



}





else




if


(time


==




60




*




5


)




{



spmanager.setNawabari(


false


);


}





spmanager.run();


MonsterSprite hitmon


=


spmanager.isMonsterHit(pac);





if


(hitmon


!=




null


)




{





int


state


=


hitmon.getState();




if


(state


==




0


)


gamestat


=




1


;





if


(state


==




1


)




{



renzoku


++


;


score


=


score


+


(


1




<<


renzoku)


*




100


;


chip


=


chipmanager.getSprite(renzoku);




int


x


=


hitmon.getX();




int


y


=


hitmon.getY();


chip.setXY(x, y);


chip.setShow(


true


);


hitmon.setShow(


false


);


pac.setShow(


false


);







try






{



Thread.sleep(


50


);



}





catch


(Exception e)




{



}







repaint();





for


(


int


i


=




0


; i


<




50


; i


++


)




{






try






{



Thread.sleep(


10


);



}





catch


(Exception e)




{



}





}





chip.setShow(


false


);


hitmon.setShow(


true


);


pac.setShow(


true


);


hitmon.activity();


iseyesnd


=




true


;







if


(ispower)




{





if


(iseyesnd)





try






{



Thread.sleep(


10


);



}





catch


(Exception e)




{



}







}





}





}







pac.setKey(key);




int


esa


=


pac.run(mzmanager, emanager);





if


(esa


>




0


)




{





int


remain


=


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


;


}





//


FPS LOOP END








repaint();


frame


=


waitFrame();


System.gc();


}





timer.off();







try






{



Thread.sleep(


2000


);



}





catch


(Exception e)




{



}









return


gamestat;


}










public




void


gameTheater()




{



Graphics g


=


bg.getGraphics();


g.setColor(Color.black);


g.fillRect(


0


,


0


, WIDTH, HEIGHT);


g.dispose();






int


pacx


=


WIDTH;




int


p;




int


index


=




288


;


spmanager.setShow(


false


);


pac.init();


pac.setShow(


true


);


redmon.init();


redmon.setShow(


true


);




timer.on();




int


frame


=




1


;




int


i


=




0


;





while


(i


<




380


)




{






for


(


int


j


=




0


; j


<


frame; j


++


)




{



p


=




2


;





switch


((i


>>




2


)


%




4


)




{





case




1


:


p


+=




4


;




break


;




case




3


:


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


(


int


j


=




0


; j


<


frame; j


++


)




{



p


=




0


;





switch


((i


>>




2


)


%




4


)




{





case




1


:


p


+=




4


;




break


;




case




3


:


p


=




8


;




break


;


}





pac.setP(p);


pac.setXY(pacx


++


,


100


);


redmon.setXY(index


++


,


100


);


i


++


;




if


(i


>=




360


)




break


;


}





repaint();


frame


=


waitFrame();


}







timer.off();


}










public




void


sleep(


int


tm)




{






try






{



Thread.sleep(tm);



}





catch


(Exception e)




{



e.printStackTrace();


}





}










public




boolean


handleEvent(Event e)




{






switch


(e.id)




{





case


Event.KEY_PRESS:




case


Event.KEY_ACTION:





switch


(e.key)




{





case


Event.RIGHT:


key


=




1


;




break


;




case


Event.DOWN:


key


=




2


;




break


;




case


Event.LEFT:


key


=




4


;




break


;




case


Event.UP:


key


=




8


;




break


;


}







return




true


;




case


Event.KEY_RELEASE:




case


Event.KEY_ACTION_RELEASE:




default


:


}







return




false


;


}












/**




* fps计算


*


*


@return






*/








private




synchronized




int


waitFrame()




{






try






{



wait();



}





catch


(InterruptedException e)




{



}







//


返回fps








return


timer.frames();


}










public




synchronized




final




void


notifyFrame()




{



notifyAll();


}










public




static




void


main(String[] args)




{





final


Pacgame ap


=




new


Pacgame();


ap.setSize(WIDTH, HEIGHT);


Frame frm


=




new


Frame(





Java吃豆游戏





);



frm.addWindowListener(


new


WindowAdapter()




{






public




void


windowClosing(WindowEvent e)




{



ap.stop();


System.exit(


0


);


}





}



);


frm.addNotify();


Insets inset


=


frm.getInsets();




int


w0


=


inset.left


+


inset.right;




int


h0


=


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();


}







}







版权声明:本文为cping1982原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。