还剩15页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
package com.hjsxt.tank;importjava.awl.*;importjava.awt.cvcnt.*;importjava.util.List;importjava.util.ArrayList;*这个类的作用是坦克嬉戏的主窗LI*@author mashibing**/publicclass TankClientextends Frame{/***整个坦克嬉戏的宽度*/publicstaticfinal intGAME_WIDTH=800;publicstaticfinal intGAME_HEIGHT=600;Tank myTank=new Tank50,50,true,Tank.Direction.STOP,his;Wall wl=newWall100,200,20,150,this,w2=newWall300,100,300,20,this;ListExplodc explodes=newArrayListExplodc;ListMissile missiles=newArrayListMissile;ListTank tanks=newArrayListTank;Image offScreenImage=null;Blood b=newBlood;publicvoidpaintGraphics g{/**指明子弹-爆炸•坦克的数量*以及坦克的生命值*/g.drawStringCmissilescount:+missiles.size,10,50;g.drawStringexplodes count:+explodes.size,10,70;g.drawStringtanks count:+tanks.size,10,90;g.drawStringtanks life:1+myTank.getLifeO,10,110;iftanks.size=0{forint i=0;i5;i++{tanks.addnewTank50+40*i+l,50,false,Tank.Direction.D,his;Missileni=new Missilex,y,good,dir,this.tc;tc.missiles.addm;return m;}publicRectangle getRect{return newRectanglex,y,WIDTH,HEIGHT;}publicboolean isLive{return live;Ipublicvoid setLivebooleanlive{this.live=live;publicboolean isGood{return good;/***撞墙*@param w被撞的墙*@retum撞上了返回true,否则false*/publicboolean collidesWihWallWallw{ifthis.live this.getRect.intersectsw.getRect{this.slayO;return true;return false;Ipublicboolean collidesWithTanksjava.util.ListTank tanks{forini i=0;itanks.size;i++{Tank t=tanks.geti;ifthis!=t{ifthis.live t.isLiveOthis.getRect.intersectst.getRect{this.stayO;t.stayO;return true;retum false;private voidsuperFire{Direction^dirs=Direction.values;forint i=0;i8;i++{firedirs[ij;Ipublicint getLife{retum life;publicvoid setLifeintlife{this.life=life;private classBloodBar publicvoid drawGraphics g{Colorc=g.getColor;g.setColorColor.RED;g.drawRcctx,y-10,WIDTH,10;intw=WIDTH*life/100;g.fillRcctx,y-10,w,10;g.setColorc;publicboolean eatBloodb{ifthis.live b.isLivethis.getRect.intersectsb.getRect{this.life=100;b.setLivefalse;return true;return false;package com.hjsxt.tank;importjava.awl.*;importjava.util.List;publicclass Missile{publicstaticfinal intXSPEED=10;publicstaticfinal intYSPEED=10;publicstaticfinal intWIDTH=10;publicstaticfinal intHEIGHT=10;int x,y;Tank.Direction dir;private boolean good;private booleanlive=rue;private TankClient tc;publicMissileintx,ini y.Tank.Direction dir{this.x=x;this.y=y;this.dir=dir;publicMissileint x,inty,boolean good.Tank.Direction dir,TankClient tc{thisx,y,dir;this.good=good;this.tc=c;publicvoiddrawGraphics g{if!live{tc.missiles.removethis;return;Colorc=g.getColor;g.setColorColor.BLACK;g.fillOvalx,y,WIDTH,HEIGHT;g.setColorc;inove;private voidmove{switchdir{case L:x-=XSPEED;break;case LU:x-=XSPEED;y-=YSPEED;break;case U:y-=YSPEED;break;case RU:x+=XSPEED;y-=YSPEED;break;case R:x+=XSPEED;break;case RD:x+=XSPEED;y+=YSPEED;break;case D:y+=YSPEED;break;case LD:x-=XSPEED;y+=YSPEED;break;case STOP:break;ifx0||y0||xTankClient.GAME_WIDTH||y TankClient.GAME_HEIGHT{live=false;Ipublicboolean isLive{return live;publicRectangle gctRcct{return newRectanglex,y,WIDTH,HEIGHT;Ipublicboolean hitTankTank t{ifthis.livethis.geRcct.intersectst.getRectt.isLivethis.good!=t.isGoodO{ift.isGood{t.setLi fet.getLi fe-20;ift.getLife=0t.setLivefalse;}else{t.setLivefalse;this.live=false;Explodee=new Explodex,y,Ic;tc.explodes.adde;return true;return false;publicboolean hitTanksListTanktanks{fbrint i=0;itanks.size;i++{ifhiTanktanks.geti{return true;Ireturn false;1publicboolean hitWallWallw{ifthis.live this.getRect.intersectsw.getRect{this.live=false;return true;return false;package com.bjsxt.tank;importjava.awt.*;publicclass Explode{intx,y;private booleanlive=tnie;private TankClient tc;intn diameter={4,7,12,18,26,32,49,30,14,6};int step=0:publicExplodeint x,int y,TankClient tc{this.x=x;this.y=y;this.tc=tc;publicvoiddrawGraphics g{if!live{tc.explodes.removethis;return;ifstcp==diameter.length{live=false;step=0;return;Colorc=g.getColor;g.setColorColor.ORANGE;g.fillOvalx,y,diameter[step],diameter[step];g.setColorc;step++;package com.bjsxt.tank;importjava.awt.*;publicclass Blood{int x,y,w,h;TankClient tc;ini step=0;private booleanlive=true;〃指明血块运动的轨迹,由pos中各个点构成private int[][]pos={{350,300},360,300,{375,275},{400,200},{
360.270},{365,290},340,280;publicBlood{x=pos
[0]
[0];y=pos
[0][l];w=h=15;IpublicvoiddrawGraphics g{if!live return;Colorc=g.getColor;g.setColorColor.MAGENTA;g.fillRectx,y,w,h;g.setColorc;move;Iprivate voidmove{step++;ifstep==pos.length{step=0;x=pos[step][OJ;y=pos[slep][l];publicRectangle getRect{return newRcctanglex,y,w,h;publicboolean isLive{return live;publicvoid setLiveboolcanlive{this.live=live;package com.bjsxt.tank;importjava.awt.*;publicclass Wall{int x,y,w,h;TankClient tc;publicWal1int x,int y,intw,int h,TankClienttc{this.x=x;this.y=y;this.w=w;this.h=h;this.tc=tc;publicvoid drawGraphicsg{g.fillRectx,y,w,h;IpublicRectangle getRect{return newRectanglex,y,w,h;forint i=0;imissiles.size;i++{Missilem=missiles.geti;m.hitTankstanks;m.hitTankmyTank;m.hitWallwl;m.hitWallw2;m.drawg;//if!m.isLive missiles.removem;//elsem.drawg;forint i=0;iexplodes.size;i++{Explodee=explodes.geti;e.drawg;forint i=0;itanks.size;i++{Tankt=tanks.geli;t.coll idesWith Wallw1;t.collidesWithWalIw2;t.coll idesWithTankstanks;t.drawg;myTank.drawg;myTank.eatb;wl.drawg;w
2.drawg;b.drawg;1publicvoidupdaleGraphics g{ifoffScreenImage==null{oftScreenlmage=this.createhnageGAME_WIDTH,GAME_HEIGHT;Graphics gOffScreen=offScreenImage.getGraphics;Colorc=gOffScreen.getColorO;gOffScreen.setColorColor.GREEN;gOffScreen.fillRect0,0,GAME_WIDTH.GAME_HEIGHT;gOffScreen.setColorc;paintgOffScreen;g.drawImageoffScreenImage,0,0,null;*本方法显示坦克主窗口**/publicvoidlauchFrameO{forint i=0;i10;i++{tanks.addncwTank50+40*i+l,50,false,Tank.Direction.D,this;//this.setLocation400,300;this.setSizeGAME_WIDTH GAME_HEIGHT;,this.setTitleTankWar;this.addWindowListenernew WindowAdapter{publicvoidwindowClosingWindowEvcnt c{System.exitO;}};this.setResizablefalse;this.setBackgroundColor.GREEN;this.addKcyListcncrncw KcyMonitor;setVisibletrue;newThreadnew PaintThread.start;publicstatic voidmainString[]args{TankClienttc=new TankClient;tc.lauchFrameO;privateclass PaintThreadimplements Runnable{publicvoid run{whiletrue{repaint;try Thread.sleep50;}catch InterruptedExceptione{e.printStackTraceO;private classKeyMonitorextends KeyAdapter!publicvoid keyReleased Key Event e{myTank.keyReleasede;publicvoid keyPressedKeyEvente{myTank.keyPressede;Ipackage com.bjsxt.tank;importjava.awt.*;importjava.awt.event.*;importjava.util.*;publicclass Tankpublicstaticfinal intXSPEED=5;publicstaticfinal intYSPEED=5;publicstaticfinal intWIDTH=30;publicstaticfinal intHEIGHT=30;private booleanlive=true;private BloodBarbb=newBloodBar;private intlife=100;TankClieni tc;private boolean good;private intx,y;private intoldX,oldY;private staticRandomr=new Random;private booleanbL二false,bU=false,bR=false,bD=false;enum Direction{L,LU,U,RU,R,RD,D,LD,STOP};private Direction dir=Direction.STOP;private DirectionptDir=Direction.D;private intstep=r.nextlnt12+3;publicTankint x,int y,booleangood{this.x=x;this.y=y;this.oldX=x;this.oldY=y;this.good=good;IpublicTankint x,inty,booleangood.Directiondir,TankClicnt tc{thisx,y,good;this.dir=dir;this.tc=tc;}publicvoiddrawGraphicsg{if!live{if!good{tc.tanks.removethis;}return;Colorc=g.getColor;ifgoodg.setColorColor.RED;elseg.setColorColor.BLUE;g.fillOvalx,y,WIDTH,HEIGHT;g.setColorc;ifgoodbb.drawg;switchptDir{caseL:g.drawLinex+Tank.WIDTH/2,y+Tank.HEIGHT/2,x,y+Tank.HEIGHT/2;break;caseLU:g.drawLinex+Tank.WIDTH/2,y+Tank.HEIGHT/2,x,y;break;caseU:g.drawLinex+Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.WIDTH/2,y;break;caseRU:g.drawLinex+Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.WIDTH,y;break;caseR:g.drawLinex+Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.WIDTH,y+Tank.HEIGHT/2;break;caseRD:g.drawLinex+Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.WIDTH,y+Tank.HEIGHT;break;caseD:g.drawLinex+Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.WIDTH/2,y+Tank.HEIGHT;break;caseLD:g.drawLinex+Tank.WIDTH/2,y+Tank.HEIGHT/2,x,y+Tank.HEIGHT;break;move;Ivoid move{this.oldX=x;this.oldY=y;switchdir{caseL:x-=XSPEED;break;caseLU:xi-=XSPEED;y-=YSPEED;break;caseU:y-=YSPEED;break;caseRU:xii+=XSPEED;y-=YSPEED:break;caseR:xiii+=XSPEED;break;caseRD:xiv+=XSPEED;y+=YSPEED;break;caseD:y+=YSPEED;break;caseLD:xv-=XSPEED;y+=YSPEED;break;case STOP:break;ifthis.dir!=Direction.STOP{this.ptDir=this.dir;ifx0x=0;ify30y=30;ifx+Tank.WIDTH TankClient.GAME_WIDTH x=TankClient.GAME_WIDTH-Tank.WIDTH;ify+Tank.HEIGHTTankClient.GAME_HEIGHTy=TankClient.GAME_HEIGHT-Tank.HEIGHT;if!good{Direclionf]dirs=Direction.values;ifstep==0{step=r.nextlntl2+3;int rn=r.nextlntdirs.length;dir=dirs|rn];stepifr.nextInt4038this.fire;private voidstay{x=oldX;y=oldY;Ipublicvoid keyPressedKeyEvente{intkey=e.getKcyCode;switchkey{caseKcyEvent.VK_F2:if!this.live{this.live=true;this.life=100;break;caseKeyEvent.VK_LEFT:bL=true;break;caseKeyEvent.VK_UP:bU=rue;break;caseKeyEvent.VK_RIGHT:bR=true;break;caseKey Event.V K_DOWN:bD=true;break;locateDirection;void locateDirectionO{ifbL!bU!bR!bD dir=Direction.L;elseifbLbU!bR!bD dir=Direction.LU;elseif!bLbU!bR!bDdir=Direction.U;elseif!bLbU bR!bD dir=Direction.RU;elseif!bL!bUbR!bDdir=Direction.R;elseif!bL!bUbR bDdir=Dircction.RD;elseif!bL!bU!bRbDdir=Direction.D;elseifbL!bU!bRbDdir=Direction.LD;else if!bLJbU!bR!bD dir=Direction.STOP;}publicvoid keyReleasedKeyEvente{intkey=e.getKeyCode;switchkey{caseKeyEvent.VK_CONTROL:fire;break;caseKeyEvent.VK_LEFT:bL=false;break;caseKeyEvent.VK_UP:bU=false;break;caseKeyEvent.VK_RIGHT:bR=false;break;caseKeyEvent.VK_DOWN:bD=false;break;caseKeyEvent.VK_A:supcrFire;break;locateDirection;publicMissilefire{if!live returnnull;intx=this.x+Tank.WIDTH/2-Missile.WIDTH/2;inty=this.y+Tank.HEIGHT/2-Missile.HEIGHT/2;Missilem=new Missilex,y,good,ptDir,this.tc;tc.missiles.addm;return m;publicMissilefireDireclion dir{if!live returnnull;intx=this.x+Tank.WIDTH/2-Missile.WIDTH/2;inty=this.y+Tank.HEIGHT/2-MissiIe.HEIGHT/2;。