马士兵坦克大战经典源代码Word下载.docx
《马士兵坦克大战经典源代码Word下载.docx》由会员分享,可在线阅读,更多相关《马士兵坦克大战经典源代码Word下载.docx(23页珍藏版)》请在冰豆网上搜索。
*以及坦克的生命值
*/
g.drawString("
missilescount:
"
+missiles.size(),10,50);
explodescount:
+explodes.size(),10,70);
tankscount:
+tanks.size(),10,90);
tankslife:
+myTank.getLife(),10,110);
if(tanks.size()<
=0){
for(inti=0;
i<
5;
i++){
tanks.add(newTank(50+40*(i+1),50,false,Tank.Direction.D,this));
}
}
for(inti=0;
missiles.size();
Missilem=missiles.get(i);
m.hitTanks(tanks);
m.hitTank(myTank);
m.hitWall(w1);
m.hitWall(w2);
m.draw(g);
//if(!
m.isLive())missiles.remove(m);
//elsem.draw(g);
explodes.size();
Explodee=explodes.get(i);
e.draw(g);
tanks.size();
Tankt=tanks.get(i);
t.collidesWithWall(w1);
t.collidesWithWall(w2);
t.collidesWithTanks(tanks);
t.draw(g);
myTank.draw(g);
myTank.eat(b);
w1.draw(g);
w2.draw(g);
b.draw(g);
}
publicvoidupdate(Graphicsg){
if(offScreenImage==null){
offScreenImage=this.createImage(GAME_WIDTH,GAME_HEIGHT);
GraphicsgOffScreen=offScreenImage.getGraphics();
Colorc=gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0,0,GAME_WIDTH,GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage,0,0,null);
*本方法显示坦克主窗口
publicvoidlauchFrame(){
10;
tanks.add(newTank(50+40*(i+1),50,false,Tank.Direction.D,this));
//this.setLocation(400,300);
this.setSize(GAME_WIDTH,GAME_HEIGHT);
this.setTitle("
TankWar"
);
this.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);
});
this.setResizable(false);
this.setBackground(Color.GREEN);
this.addKeyListener(newKeyMonitor());
setVisible(true);
newThread(newPaintThread()).start();
publicstaticvoidmain(String[]args){
TankClienttc=newTankClient();
tc.lauchFrame();
privateclassPaintThreadimplementsRunnable{
publicvoidrun(){
while(true){
repaint();
try{
Thread.sleep(50);
}catch(InterruptedExceptione){
e.printStackTrace();
}
privateclassKeyMonitorextendsKeyAdapter{
publicvoidkeyReleased(KeyEvente){
myTank.keyReleased(e);
publicvoidkeyPressed(KeyEvente){
myTank.keyPressed(e);
}
importjava.util.*;
publicclassTank{
publicstaticfinalintXSPEED=5;
publicstaticfinalintYSPEED=5;
publicstaticfinalintWIDTH=30;
publicstaticfinalintHEIGHT=30;
privatebooleanlive=true;
privateBloodBarbb=newBloodBar();
privateintlife=100;
TankClienttc;
privatebooleangood;
privateintx,y;
privateintoldX,oldY;
privatestaticRandomr=newRandom();
privatebooleanbL=false,bU=false,bR=false,bD=false;
enumDirection{L,LU,U,RU,R,RD,D,LD,STOP};
privateDirectiondir=Direction.STOP;
privateDirectionptDir=Direction.D;
privateintstep=r.nextInt(12)+3;
publicTank(intx,inty,booleangood){
this.x=x;
this.y=y;
this.oldX=x;
this.oldY=y;
this.good=good;
publicTank(intx,inty,booleangood,Directiondir,TankClienttc){
this(x,y,good);
this.dir=dir;
this.tc=tc;
publicvoiddraw(Graphicsg){
if(!
live){
if(!
good){
tc.tanks.remove(this);
return;
Colorc=g.getColor();
if(good)g.setColor(Color.RED);
elseg.setColor(Color.BLUE);
g.fillOval(x,y,WIDTH,HEIGHT);
g.setColor(c);
if(good)bb.draw(g);
switch(ptDir){
caseL:
g.drawLine(x+Tank.WIDTH/2,y+Tank.HEIGHT/2,x,y+Tank.HEIGHT/2);
break;
caseLU:
g.drawLine(x+Tank.WIDTH/2,y+Tank.HEIGHT/2,x,y);
caseU:
g.drawLine(x+Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.WIDTH/2,y);
caseRU:
g.drawLine(x+Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.WIDTH,y);
caseR:
g.drawLine(x+Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.WIDTH,y+Tank.HEIGHT/2);
caseRD:
g.drawLine(x+Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.WIDTH,y+Tank.HEIGHT);
caseD:
g.drawLine(x+Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.WIDTH/2,y+Tank.HEIGHT);
caseLD:
g.drawLine(x+Tank.WIDTH/2,y+Tank.HEIGHT/2,x,y+Tank.HEIGHT);
move();
voidmove(){
switch(dir){
x-=XSPEED;
y-=YSPEED;
x+=XSPEED;
y+=YSPEED;
caseSTOP:
if(this.dir!
=Direction.STOP){
this.ptDir=this.dir;
if(x<
0)x=0;
if(y<
30)y=30;
if(x+Tank.WIDTH>
TankClient.GAME_WIDTH)x=TankClient.GAME_WIDTH-Tank.WIDTH;
if(y+Tank.HEIGHT>
TankClient.GAME_HEIGHT)y=TankClient.GAME_HEIGHT-Tank.HEIGHT;
Direction[]dirs=Direction.values();
if(step==0){
step=r.nextInt(12)+3;
intrn=r.nextInt(dirs.length);
dir=dirs[rn];
}
step--;
if(r.nextInt(40)>
38)this.fire();
}
privatevoidstay(){
x=oldX;
y=oldY;
publicvoidkeyPressed(KeyEvente){
intkey=e.getKeyCode();
switch(key){
caseKeyEvent.VK_F2:
this.live){
this.live=true;
this.life=100;
caseKeyEvent.VK_LEFT:
bL=true;
caseKeyEvent.VK_UP:
bU=true;
caseKeyEvent.VK_RIGHT:
bR=true;
caseKeyEvent.VK_DOWN:
bD=true;
locateDirection();
voidlocateDirection(){
if(bL&
&
!
bU&
bR&
bD)dir=Direction.L;
elseif(bL&
bU&
bD)dir=Direction.LU;
elseif(!
bL&
bD)dir=Direction.U;
bR&
bD)dir=Direction.RU;
bD)dir=Direction.R;
bD)dir=Direction.RD;
bD)dir=Direction.D;
bD)dir=Direction.LD;
bD)dir=Direction.STOP;
publicvoidkeyReleased(KeyEvente){
caseKeyEvent.VK_CONTROL:
fire();
bL=false;
bU=false;
bR=false;
bD=false;
caseKeyEvent.VK_A:
superFire();
publicMissilefire(){
live)returnnull;
intx=this.x+Tank.WIDTH/2-Missile.WIDTH/2;
inty=this.y+Tank.HEIGHT/2-Missile.HEIGHT/2;
Missilem=newMissile(x,y,good,ptDir,this.tc);
tc.missiles.add(m);
returnm;
publicMissilefire(Directiondir){
Missilem=newMissile(x,y,good,dir,this.tc);
publicRectanglegetRect(){
returnnewRectangle(x,y,WIDTH,HEIGHT);
publicbooleanisLive(){
returnlive;
publicvoidsetLive(booleanlive){
this.live=live;
publicbooleanisGood(){
returngood;
*撞墙
*@paramw被撞的墙
*@return撞上了返回true,否则false
publicbooleancollidesWithWall(Wallw){
if(this.live&
this.getRect().intersects(w.getRect())){
this.stay();
returntrue;
returnfalse;
publicbooleancollidesWithTanks(java.util.List<
tanks){
if(this!
=t){
if(this.live&
t.isLive()&
this.getRect().intersects(t.getRect())){
this.stay();
t.stay();
returntrue;
privatevoidsuperFire(){
Direction[]dirs=Direction.values();
8;
fire(dirs[i]);
publicintgetLife(){
returnlife;
publicvoidsetLife(intlife){
this.life=life;
privateclassBloodBar{
publicvoiddraw(Graphicsg){
Colorc=g.getColor();
g.setColor(Color.RED);
g.drawRect(x,y-10,WIDTH,10);
intw=WIDTH*life/100;
g.fillRect(x,y-10,w,10);
g.setColor(c);
publicbooleaneat(Bloodb){
b.isLive()&
this.getRect().intersects(b.getRect())){
this.life=100;
b.setLive(false);
retu