Java练习坦克大战version 36.docx

上传人:b****6 文档编号:4267351 上传时间:2022-11-28 格式:DOCX 页数:27 大小:38.85KB
下载 相关 举报
Java练习坦克大战version 36.docx_第1页
第1页 / 共27页
Java练习坦克大战version 36.docx_第2页
第2页 / 共27页
Java练习坦克大战version 36.docx_第3页
第3页 / 共27页
Java练习坦克大战version 36.docx_第4页
第4页 / 共27页
Java练习坦克大战version 36.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

Java练习坦克大战version 36.docx

《Java练习坦克大战version 36.docx》由会员分享,可在线阅读,更多相关《Java练习坦克大战version 36.docx(27页珍藏版)》请在冰豆网上搜索。

Java练习坦克大战version 36.docx

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;

//定义敌人的坦克组

Vectorets=newVector();

intenSize=5;

//定义炸弹集合

Vectorbombs=newVector();

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;

//定义一个向量,可以存放敌人的子弹

Vectorss=newVector();

//敌人添加子弹应该在刚刚创建坦克和坦克子弹死亡之后

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;

Vectorss=newVector();

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1