Java练习坦克大战version 36.docx
- 文档编号:4267351
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:27
- 大小:38.85KB
Java练习坦克大战version 36.docx
《Java练习坦克大战version 36.docx》由会员分享,可在线阅读,更多相关《Java练习坦克大战version 36.docx(27页珍藏版)》请在冰豆网上搜索。
Java练习坦克大战version36
Java坦克大战version3.6
面向对象,每个对象各司其职,各负其责。
界面:
简介:
start
引包
初始化窗口对象
窗口对象
继承Jframe
变量:
面板对象
构造:
初始化面板对象
启动面板对象进程
把面板添加到窗口
为面板对象注册监听
设置窗口大小
显示窗口库
设置关闭窗口时退出程序
main
实例化窗口对象
------------------------------------------------------------------------------------------------
面板对象
继承Jpanel
KeyListener,Runnable
变量:
hero
ets
记录敌人坦克数组
enSize
bombs
image1
image2
image3
构造方法:
声明创建我的坦克
声明创建敌人的坦克
为敌人的坦克启动线程
发射一颗子弹
子弹加入子弹数组
启动子弹线程
坦克加入ets数组
声明初始化爆照效果图片变量
paint
画出各个对象
在数组中删除死去的子弹
减少炸弹生命值
画坦克
判断坦克是否被击中
击中的话创建炸弹对象
run
每个1000毫秒调用hitTank
每辆坦克子弹保持5发
监听
---------------
坦克类
我的坦克
敌人坦克
属性:
坐标
属性:
子弹数组
属性:
子弹数组
方向
子弹
生命
颜色
行为:
开火
构造:
父类
速度
移动
run:
移动
构造:
初始化坐标
改变方向
判断生命
代码:
/**
*坦克大战3.6
*双方坦克均可移动、发射子弹
*敌方坦克可以被击中消失
*有爆照效果
*
*/
packageTankGame4;
//packageMyTankGame4;
importjava.util.Vector;
importjava.awt.*;
importjava.awt.event.KeyEvent;
importjava.awt.event.KeyListener;
importjava.util.*;
importjavax.swing.*;
publicclassMyTankGame4extendsJFrame
{
MyPanelmp=null;
publicstaticvoidmain(String[]args)
{
MyTankGame4mytankgame1=newMyTankGame4();
}
publicMyTankGame4()
{
mp=newMyPanel();
//启动mp线程
Threadt=newThread(mp);
t.start();
this.add(mp);
this.addKeyListener(mp);
this.setSize(400,300);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
classMyPanelextendsJPanelimplementsKeyListener,Runnable
{
//定义我的坦克,成员变量
Herohero=null;
//定义敌人的坦克组
Vector
intenSize=5;
//定义炸弹集合
Vector
publicvoidrun()
{
//每个一百毫秒去重画子弹
while(true)
{
try{
Thread.sleep(100);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
for(inti=0;i { ShotmyShot=hero.ss.get(i); //判断子弹是否有效 if(myShot.isLive) { //取出每个坦克,与它判断 for(intj=0;j { //取出坦克 EnemyTanket=ets.get(j); if(et.isLive) { this.hitTank(myShot,et); } } } } this.repaint(); //判断是否需要给坦克加入新的子弹 for(inti=0;i { EnemyTanket=ets.get(i); if(et.isLive) { if(et.ss.size()<5&&(int)(100*Math.random())>75) { //每辆坦克的子弹少于5发的话 //添加 Shots=null; switch(et.direct) { case0: s=newShot(et.x+9,et.y-1,0); et.ss.add(s); break; case1: s=newShot(et.x+30,et.y+10,1); et.ss.add(s); break; case2: s=newShot(et.x+9,et.y+30,2); et.ss.add(s); break; case3: s=newShot(et.x-1,et.y+9,3); et.ss.add(s); break; } //启动子弹线程 Threadt=newThread(s); t.start(); } } } } } publicvoidpaint(Graphicsg) { super.paint(g); g.fillRect(0,0,400,300); //画出自己的坦克 this.drawTank(hero.getX(),hero.getY(),g,this.hero.direct,1); //从Vectorss中取出每一颗子弹,并画出 for(inti=0;i { ShotmyShot=hero.ss.get(i); //画出子弹,只画一颗子弹 if(myShot! =null&&myShot.isLive==true) { g.draw3DRect(myShot.x,myShot.y,1,1,false); } if(myShot.isLive==false) { //从ss中删除该子弹 hero.ss.remove(myShot); } } //画出炸弹 for(inti=0;i { //取出炸弹 Bombb=bombs.get(i); if(b.life>6) { g.drawImage(image1,b.x,b.y,30,30,this); } elseif(b.life>3) { g.drawImage(image2,b.x,b.y,30,30,this); } else { g.drawImage(image3,b.x,b.y,30,30,this); } //让b的生命值减小 b.lifeDown(); //如果炸弹的生命值为0,我们就剔除 if(b.life==0)bombs.remove(b); } //画出敌人的坦克 for(inti=0;i { EnemyTanket=ets.get(i); if(et.isLive) { this.drawTank(ets.get(i).getX(),ets.get(i).getY(),g,ets.get(i).getDirect(),0); //画出敌人的子弹 for(intj=0;j { //取出子弹 ShotenemyShot=et.ss.get(j); if(enemyShot.isLive) { g.draw3DRect(enemyShot.x,enemyShot.y,1,1,false); } else { //如果敌人的坦克死亡就从Vector去掉 et.ss.remove(enemyShot); } } } } } //写一个函数专门判断子弹是否击中敌人坦克 publicvoidhitTank(Shots,EnemyTanket) { //判断该坦克的方向 switch(et.direct) { //如果敌人的方向是上或者是下 case0: case2: if(s.x>et.x&&s.x<(et.x+20)&&s.y>et.y&&s.y<(et.y+30)) { //击中了 //子弹死亡 s.isLive=false; //敌人坦克也要死亡 et.isLive=false; //创建一个炸弹,放入Vector Bombb=newBomb(et.x,et.y); //放入Vector bombs.add(b); } case1: case3: if(s.x>et.x&&s.x<(et.x+30)&&s.y>et.y&&s.y<(et.y+20)) { //击中了 //子弹死亡 s.isLive=false; //敌人坦克也要死亡 et.isLive=false; //创建一个炸弹,放入Vector Bombb=newBomb(et.x,et.y); //放入Vector bombs.add(b); } } } //画出坦克函数(扩展) publicvoiddrawTank(intx,inty,Graphicsg,intdirect,inttype) { //判断类型 switch(type) { case0: g.setColor(Color.cyan);break; case1: g.setColor(Color.yellow);break; } //判断方向 switch(direct) { //向上 case0: //画出我的坦克(到时候再封装成一个函数) //1.画出左面的矩形 //g.drawRect(hero.getX(),hero.getY(),5,30); g.fill3DRect(x,y,5,30,false); //2.画出右边的矩形 g.fill3DRect(x+15,y,5,30,false); //3.画出坦克的中间矩形 g.fill3DRect(x+5,y+5,10,20,false); //画出中间的圆 g.fillOval(x+4,y+10,10,10); //画出线 g.drawLine(x+9,y+15,x+9,y); break; case1: //炮筒向右 //画出上面的矩形 g.fill3DRect(x,y,30,5,false); g.fill3DRect(x,y+15,30,5,false); g.fill3DRect(x+5,y+5,20,10,false); g.fillOval(x+10,y+5,10,10); g.drawLine(x+15,y+10,x+30,y+10); break; case2: //向下 g.fill3DRect(x,y,5,30,false); g.fill3DRect(x+15,y,5,30,false); g.fill3DRect(x+5,y+5,10,20,false); g.fillOval(x+4,y+10,10,10); g.drawLine(x+10,y+15,x+10,y+30); break; case3: //向左 g.fill3DRect(x,y,30,5,false); g.fill3DRect(x,y+15,30,5,false); g.fill3DRect(x+5,y+5,20,10,false); g.fillOval(x+10,y+5,10,10); g.drawLine(x+15,y+10,x,y+10); break; } } //定义三张图片,三张图片切换组成一颗炸弹 Imageimage1=null; Imageimage2=null; Imageimage3=null; //构造函数 publicMyPanel() { hero=newHero(100,100); //初始化敌人的坦克 for(inti=0;i { //创建敌人的坦克对象 EnemyTanket=newEnemyTank((i+1)*50,0); et.setColor(0); et.setDirect (2); //启动敌人的坦克 Threadt=newThread(et); t.start(); //给敌人坦克添加一颗子弹 Shots=newShot(et.x+10,et.y+30,2); et.ss.add(s); Threadt2=newThread(s); t2.start(); //加入 ets.add(et); } image1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/33.jpg")); image2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/22.jpg")); image3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/11.jpg")); } //键按下处理a表示左,s表示向下,w表示向上,d表示向右 publicvoidkeyPressed(KeyEvente) { if(e.getKeyCode()==KeyEvent.VK_W) { //设置我的坦克的方向 this.hero.setDirect(0); this.hero.moveUp(); } elseif(e.getKeyCode()==KeyEvent.VK_S) { this.hero.setDirect (2); this.hero.moveDown(); } elseif(e.getKeyCode()==KeyEvent.VK_D) { this.hero.setDirect (1); this.hero.moveRight(); } elseif(e.getKeyCode()==KeyEvent.VK_A) { this.hero.setDirect(3); this.hero.moveLeft(); } if(e.getKeyCode()==KeyEvent.VK_J) { this.hero.shotEnemy(); } //必须重新绘制Panel this.repaint(); } publicvoidkeyReleased(KeyEvente) { } publicvoidkeyTyped(KeyEvente) { } } classTank { //设置坦克的速度 intspeed=3; publicintgetSpeed() { returnspeed; } publicvoidsetSpeed(intspeed) { this.speed=speed; } //表示坦克的横坐标 intx=0; //坦克的纵坐标 inty=0; intdirect=0; intcolor; //坦克方向,0表示上,1表示右,2表示下,3表示左 publicintgetColor(){ returncolor; } publicvoidsetColor(intcolor){ this.color=color; } publicintgetDirect() { returndirect; } publicvoidsetDirect(intdirect) { this.direct=direct; } publicTank(intx,inty) { this.x=x; this.y=y; } publicintgetX() { returnx; } publicvoidsetX(intx) { this.x=x; } publicintgetY() { returny; } publicvoidsetY(inty) { this.y=y; } } classEnemyTankextendsTankimplementsRunnable { booleanisLive=true; //定义一个向量,可以存放敌人的子弹 Vector //敌人添加子弹应该在刚刚创建坦克和坦克子弹死亡之后 publicEnemyTank(intx,inty) { super(x,y); } publicvoidrun(){ while(true) {//移动前进 switch(this.direct) { case0: for(inti=0;i<(int)(100*Math.random());i++) { try { Thread.sleep(50); } catch(Exceptione) { e.printStackTrace(); } if(y>=speed) { y-=speed; } } break; case1: for(inti=0;i<(int)(100*Math.random());i++) { try { Thread.sleep(50); } catch(Exceptione) { e.printStackTrace(); } if(x<=400-(speed+30)) { x+=speed; } } break; case2: for(inti=0;i<(int)(100*Math.random());i++) { try { Thread.sleep(50); } catch(Exceptione) { e.printStackTrace(); } if(y<=300-(speed+30)) { y+=speed; } } break; case3: for(inti=0;i<(int)(100*Math.random());i++) { try { Thread.sleep(50); } catch(Exceptione) { e.printStackTrace(); } if(x>=speed) { x-=speed; } } break; } //让坦克随机产生一个新的方向 if(Math.random()>0.50) this.direct=(int)(Math.random()*4); //判断敌人坦克是否死亡 if(this.isLive==false) { //让坦克死亡后,退出线程 break; } } } } //我的坦克 classHeroextendsTank { //子弹 //Shots=null; Vector Shots=null; publicHero(intx,inty) { super(x,y); } //坦克向上移动 //坦克的开火的能力和动作 publicvoidshotEnemy() { switch(this.direct) { case0: s=newShot(x+9,y-1,0); ss.add(s); break; case1: s=newShot(x+30
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java练习坦克大战version 36 Java 练习 坦克 大战 version