JavaAWT实现贪吃蛇游戏.docx
《JavaAWT实现贪吃蛇游戏.docx》由会员分享,可在线阅读,更多相关《JavaAWT实现贪吃蛇游戏.docx(12页珍藏版)》请在冰豆网上搜索。
JavaAWT实现贪吃蛇游戏
importproject.MainPanel;
/**
*入口函数
*
*@authorAdministrator
*
*/
publicclassMain{
publicstaticvoidmain(String[]args){
newMainPanel();
}
}
packageproject;
importjava.util.LinkedList;
/**
*存放程序运行时数据
*
*@authorAdministrator
*
*/
publicclassConfig{
/**
*节点尺寸
*/
publicstaticfinalintLEN=25;
publicstaticfinalintROW=20;
publicstaticfinalintCOLUMN=20;
/*
*边距
*/
publicstaticfinalintLEFT_LIMIT=10;
publicstaticfinalintUPER_LIMIT=30;
publicstaticfinalintDOWN_LIMIT=LEN*ROW+UPER_LIMIT;
publicstaticfinalintRIGHT_LIMIT=LEN*COLUMN+LEFT_LIMIT;
/**
*方向常量
*/
publicstaticfinalintUPER=0,DOWN=1,LEFT=2,RIGHT=3;
/**
*画面布局数据存储数组
*/
privatestaticint[][]panel=newint[ROW][COLUMN];
/**
*移动方向初始化向右
*/
privatestaticintdirect=RIGHT;
/**
*移动时间间隔
*/
privatestaticlongtime=500;
/**
*贪吃蛇数据存储容器
*/
privatestaticLinkedListtrack=newLinkedList();
/**
*增加移动时间间隔,上限为1000毫秒
*/
publicstaticvoidtimeUp(){
if(time<1000)
time+=100;
}
/**
*减少时间间隔,下线为100毫秒
*/
publicstaticvoidtimeDown(){
if(time>100)
time-=100;
}
/**
*获取当前时间间隔
*
*@returntime
*/
publicstaticlonggetTime(){
returntime;
}
/**
*获取当前界面数据
*
*@return
*/
publicstaticint[][]getPanel(){
returnpanel;
}
/**
*设置移动方向
*
*@paramdirect
*/
publicstaticvoidsetDirect(intdirect){
Config.direct=direct;
}
/**
*获得移动方向
*
*@return
*/
publicstaticintgetDirect(){
returndirect;
}
/**
*添加蛇头位置,如果与蛇身重复,抛出运行时异常用于结束游戏
*
*@paramx
*@paramy
*/
publicstaticvoidadd(intx,inty){
panel[x][y]=1;
for(int[]arr:
track){
if(arr[0]==x&&arr[1]==y)
thrownewRuntimeException();
}
track.addFirst(newint[]{x,y});
}
/**
*移除蛇尾
*/
publicstaticvoidremove(){
int[]site=(int[])track.removeLast();
panel[site[0]][site[1]]=0;
}
}
packageproject;
importjava.awt.Graphics;
importjavax.swing.JFrame;
@SuppressWarnings("serial")
/**
*界面布局类
*@authorAdministrator
*
*/
publicclassMainPanelextendsJFrame{
JFrameframe;
Policepolice;
publicMainPanel(){
//TODOAuto-generatedconstructorstub
frame=this;
frame.setBounds(300,300,Config.RIGHT_LIMIT,Config.DOWN_LIMIT);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setTitle("贪吃蛇");
init();
}
privatevoidinit(){
newWorm(this);
police=newPolice();
frame.addKeyListener(police);
}
publicvoidpaint(Graphicsg){
super.paint(g);
paintWorm(g);
}
privatevoidpaintWorm(Graphicsg){
int[][]panel=Config.getPanel();
for(inti=0;ifor(intj=0;jif(panel[i][j]==1){
g.fillRect((Config.LEFT_LIMIT+Config.LEN*j),
(Config.UPER_LIMIT+Config.LEN*i),Config.LEN,
Config.LEN);
}
}
}
}
}
packageproject;
importjava.awt.event.KeyEvent;
importjava.awt.event.KeyListener;
importstaticjava.awt.event.KeyEvent.*;
/**
*键盘监听器类
*
*@authorAdministrator
*
*/
publicclassPoliceimplementsKeyListener{
@Override
publicvoidkeyPressed(KeyEvente){
//TODOAuto-generatedmethodstub
{
chara=e.getKeyChar();
if(a=='a')
Config.setDirect(Config.LEFT);
elseif(a=='s')
Config.setDirect(Config.DOWN);
elseif(a=='d')
Config.setDirect(Config.RIGHT);
elseif(a=='w')
Config.setDirect(Config.UPER);
elseif(a=='q')
Config.timeUp();
elseif(a=='e')
Config.timeDown();
}
{
inti=e.getKeyCode();
if(i==VK_LEFT)
Config.setDirect(Config.LEFT);
elseif(i==VK_DOWN)
Config.setDirect(Config.DOWN);
elseif(i==VK_RIGHT)
Config.setDirect(Config.RIGHT);
elseif(i==VK_UP)
Config.setDirect(Config.UPER);
}
}
publicvoidkeyReleased(KeyEvente){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidkeyTyped(KeyEvente){
//TODOAuto-generatedmethodstub
}
}
packageproject;
importjavax.swing.JFrame;
/**
*贪吃蛇构造类
*
*@authorAdministrator
*
*/
publicclassWormimplementsRunnable{
int[][]panel;
/**
*随机食物位置
*/
int[]food=newint[2];
/**
*蛇头位置信息
*/
int[]head;
/**
*当前移动方向
*/
intdirect;
JFrameframe;
publicWorm(JFrameframe){
this.frame=frame;
panel=Config.getPanel();
direct=Config.getDirect();
head=newint[2];
wormInit();
newThread(this).start();
}
privatevoidwormInit(){
for(inti=1;i<=3;i++){
Config.add(7,i);
}
head[0]=7;
head[1]=3;
}
publicvoidrun(){
try{
foodRandom();
while(true){
try{
Thread.sleep(Config.getTime());
}catch(InterruptedExceptione){
e.printStackTrace();
}
switch(Config.getDirect()){
caseConfig.UPER:
{
if(direct==Config.DOWN){
Config.setDirect(direct);
break;
}
Config.add(head[0]--,head[1]);
if(head[0]==food[0]&&head[1]==food[1]){
//蛇头移动到食物位置后,调用产生食物方法,并不调用移除蛇尾方法
foodRandom();
break;
}
Config.remove();
break;
}
caseConfig.DOWN:
{
if(direct==Config.UPER){
Config.setDirect(direct);
break;
}
Config.add(head[0]++,head[1]);
if(head[0]==food[0]&&head[1]==food[1]){
foodRandom();
break;
}
Config.remove();
break;
}
caseConfig.LEFT:
{
if(direct==Config.RIGHT){
Config.setDirect(direct);
break;
}
Config.add(head[0],head[1]--);
if(head[0]==food[0]&&head[1]==food[1]){
foodRandom();
break;
}
Config.remove();
break;
}
caseConfig.RIGHT:
{
if(direct==Config.LEFT){
Config.setDirect(direct);
break;
}
try{
Config.add(head[0],head[1]++);
}catch(Exceptione){
}
if(head[0]==food[0]&&head[1]==food[1]){
foodRandom();
break;
}
Config.remove();
break;
}
}
direct=Config.getDirect();
frame.paint(frame.getGraphics());
}
}catch(Exceptione){
frame.setTitle("GameOver");
}
}
/**
*在随机位置产生食物
*/
privatevoidfoodRandom(){
while(true){
intx=(int)(Math.random()*Config.ROW);
inty=(int)(Math.random()*Config.COLUMN);
if(panel[x][y]==0){
panel[x][y]=1;
food[0]=x;
food[1]=y;
return;
}
}
}
}