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>
*
*
@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();
}


}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Java 代码实现游戏的示例: ``` import java.util.Scanner; public class PacManGame { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("欢迎来到游戏!"); System.out.print("请输入地图宽度:"); int width = sc.nextInt(); System.out.print("请输入地图高度:"); int height = sc.nextInt(); char[][] map = new char[height][width]; int pacManX = 0, pacManY = 0; int dotCount = 0; // 初始化地图 for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { map[i][j] = '.'; } } // 随机生成子 int dotNum = (int) (0.2 * width * height); for (int i = 0; i < dotNum; i++) { int x = (int) (Math.random() * height); int y = (int) (Math.random() * width); if (map[x][y] == '.') { map[x][y] = '*'; dotCount++; } } // 初始化 Pac-Man 的位置 pacManX = height / 2; pacManY = width / 2; map[pacManX][pacManY] = 'C'; // 开始游戏循环 while (dotCount > 0) { System.out.println("当前地图:"); printMap(map); // 获取用户输入 System.out.print("请输入移动方向(w/a/s/d):"); char direction = sc.next().charAt(0); // 移动 Pac-Man int newPacManX = pacManX, newPacManY = pacManY; switch (direction) { case 'w': newPacManX--; break; case 'a': newPacManY--; break; case 's': newPacManX++; break; case 'd': newPacManY++; break; default: System.out.println("无效的移动方向!"); continue; } // 判断是否越界 if (newPacManX < 0 || newPacManX >= height || newPacManY < 0 || newPacManY >= width) { System.out.println("Pac-Man 不能走出地图!"); continue; } // 判断是否遇到墙 if (map[newPacManX][newPacManY] == '#') { System.out.println("Pac-Man 不能穿过墙!"); continue; } // 更新 Pac-Man 的位置 map[pacManX][pacManY] = '.'; pacManX = newPacManX; pacManY = newPacManY; map[pacManX][pacManY] = 'C'; // 判断是否子 if (map[pacManX][pacManY] == '*') { map[pacManX][pacManY] = 'C'; dotCount--; System.out.println("到了一个子!"); } } System.out.println("恭喜您通关了游戏!"); } // 打印地图 public static void printMap(char[][] map) { for (int i = 0; i < map.length; i++) { for (int j = 0; j < map[0].length; j++) { System.out.print(map[i][j] + " "); } System.out.println(); } } } ``` 这个程序实现了以下功能: 1. 根据用户输入的地图宽度和高度,随机生成一定数量的子,并初始化 Pac-Man 的位置。 2. 在游戏循环中,打印当前地图,接受用户输入移动方向,并根据输入更新 Pac-Man 的位置。 3. 在更新 Pac-Man 的位置后,判断是否子,如果是,则更新子数量,并打印提示信息。 4. 当所有子都被掉时,结束游戏循环。 这只是一个简单的示例,你可以根据自己的需求扩展它,比如增加难度、添加墙壁、改变子的分布规律等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值