java写的坦克大战简易版.docx
《java写的坦克大战简易版.docx》由会员分享,可在线阅读,更多相关《java写的坦克大战简易版.docx(44页珍藏版)》请在冰豆网上搜索。
java写的坦克大战简易版
MyTankGame2.java
packagetest;
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.*;
//importjava.io.*;
importjava.util.*;
classMyTankGame2extendsJFrameimplementsActionListener
{
MyPanelmp=null;
//定义一个开始的面板
MyStartPanelmsp=null;
//做出我需要的菜单
JMenuBarjmb=null;
//开始游戏
JMenujm1=null;
JMenuItemjmi1=null;
//退出系统
JMenuItemjmi2=null;
//存盘退出
JMenuItemjmi3=null;
JMenuItemjmi4=null;
publicstaticvoidmain(String[]args)
{
//System.out.println("HelloWorld!
");
MyTankGame2mtg=newMyTankGame2();
}
//构造方法
publicMyTankGame2()
{
//创建菜单及菜单选项
jmb=newJMenuBar();
jm1=newJMenu("游戏(G)");
//设置助记符
jm1.setMnemonic('G');
jmi1=newJMenuItem("开始新游戏(N)");
jmi2=newJMenuItem("退出游戏(E)");
jmi3=newJMenuItem("存盘退出游戏");
jmi4=newJMenuItem("继续上局游戏");
jmi4.addActionListener(this);
jmi4.setActionCommand("continueGame");
jmi3.addActionListener(this);
jmi3.setActionCommand("saveExit");
jmi2.setMnemonic('E');
//对jmi1进行响应
jmi1.addActionListener(this);
jmi1.setActionCommand("newGame");
jmi2.addActionListener(this);
jmi2.setActionCommand("exit");
jm1.add(jmi1);
jm1.add(jmi2);
jm1.add(jmi3);
jm1.add(jmi4);
jmb.add(jm1);
msp=newMyStartPanel();
Threadt=newThread(msp);
t.start();
this.setJMenuBar(jmb);
this.add(msp);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(600,450);
this.setVisible(true);
}
@Override
publicvoidactionPerformed(ActionEvente){
//对用户不同的点击进行不同的处理
if(e.getActionCommand().equals("newGame"))
{
mp=newMyPanel("newGame");
Threadt=newThread(mp);
t.start();
//先删除旧的面板
this.remove(msp);
this.add(mp);
//注册监听
this.addKeyListener(mp);
//显示
this.setVisible(true);
}
elseif(e.getActionCommand().equals("exit"))
{//保存击毁敌人的数量
Recorder.keepRecording();
System.exit(0);
}
//对存盘退出做处理
elseif(e.getActionCommand().equals("saveExit"))
{
//工作
Recorderre=newRecorder();
re.setEts(mp.ets);
//保存击毁敌人的数量和敌人的坐标
re.keepRecAndEnemyTank();
//退出
System.exit(0);
}
elseif(e.getActionCommand().equals("continueGame"))
{//
mp=newMyPanel("con");
//mp.flag=;
Threadt=newThread(mp);
t.start();
//先删除旧的面板
this.remove(msp);
this.add(mp);
//注册监听
this.addKeyListener(mp);
//显示
this.setVisible(true);
}
}
}
classMyStartPanelextendsJPanelimplementsRunnable
{inttimes=0;
publicvoidpaint(Graphicsg)
{
super.paint(g);
g.fillRect(0,0,400,300);
//提示信息
if(times%2==0)
{
g.setColor(Color.yellow);
//开关信息的字体
FontmyFont=newFont("华文新魏",Font.BOLD,30);
g.setFont(myFont);
g.drawString("stage:
1",150,140);
}
}
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
while(true)
{
//休眠
try{
Thread.sleep(100);
}catch(Exceptione){
//TODO:
handleexception
}
times++;
//重画
this.repaint();
}
}
}
//我的面板
classMyPanelextendsJPanelimplementsKeyListener,Runnable
{
//定义我的坦克
Herohero=null;
//判断继续上局还是新游戏
//定义敌人的坦克组
Vectorets=newVector();
Vectornodes=newVector();
//定义炸弹集合
Vectorbombs=newVector();
intenSize=5;
//定义三张图片
Imageimage1=null;
Imageimage2=null;
Imageimage3=null;
//构造方法
publicMyPanel(Stringflag)
{
//恢复记录
Recorder.getRecording();
hero=newHero(30,231);
if(flag.equals("newGame"))
{
//初始化敌人的坦克
for(inti=0;i{//创建一辆敌人的坦克对象
EnemyTanket=newEnemyTank((i+1)*50,0);
et.setColor(0);
et.setDirect
(2);
//将MyPanel的敌人坦克向量交给该敌人坦克
et.setEts(ets);
//启动敌人的坦克
Threadt=newThread(et);
t.start();
//给敌人的坦克添加一颗子弹
Shots=newShot(et.x+10,et.y+30,2,1);
et.ss.add(s);
newThread(s).start();
ets.add(et);//加入
}
}
else
{
nodes=newRecorder().getNodesAndEnNums();
//初始化敌人的坦克
for(inti=0;i{
Nodenode=nodes.get(i);
//创建一辆敌人的坦克对象
EnemyTanket=newEnemyTank(node.x,node.y);
et.setColor(0);
et.setDirect(node.direct);
//将MyPanel的敌人坦克向量交给该敌人坦克
et.setEts(ets);
//启动敌人的坦克
Threadt=newThread(et);
t.start();
//给敌人的坦克添加一颗子弹
Shots=newShot(et.x+10,et.y+30,2,1);
et.ss.add(s);
newThread(s).start();
ets.add(et);//加入
}
}
/*try{
image1=ImageIO.read(newFile("/bomb_1.gif"));
image2=ImageIO.read(newFile("/bomb_2.gif"));
image3=ImageIO.read(newFile("/bomb_3.gif"));
}catch(Exceptione){
e.printStackTrace();
//TODO:
handleexception
}*/
//播放开战声音
AePlayWaveapw=newAePlayWave("F:
\\myjava\\day9\\坦克大战\\TankGamae13\\src\\111.wav");
apw.start();
//初始化图片
image1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_1.gif"));
image2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_2.gif"));
image3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_3.gif"));
}
//画出提示信息
publicvoidshowInfo(Graphicsg)
{
//画出提示信息坦克(该坦克不参与战斗)
this.drawTank(100,320,g,0,0);
g.setColor(Color.black);
g.drawString(Recorder.getEnNum()+"",128,343);
this.drawTank(165,320,g,0,1);
g.setColor(Color.black);
g.drawString(Recorder.getMyLife()+"",195,343);
//画出玩家的总成绩
g.setColor(Color.black);
Fontf=newFont("宋体",Font.BOLD,20);
g.setFont(f);
g.drawString("您的总成绩",410,25);
this.drawTank(420,60,g,0,0);
g.setColor(Color.black);
g.drawString(Recorder.getAllEnNum()+"",455,80);
}
//重写paint函数
publicvoidpaint(Graphicsg)
{
super.paint(g);
g.fillRect(0,0,400,300);
//画出提示信息
this.showInfo(g);
//画出自己的坦克
if(hero.isLive)
{
this.drawTank(hero.getX(),hero.getY(),g,hero.getDirect(),1);
}
//从ss中取出每一颗子弹并绘制
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();
if(b.life==0)
{//把炸弹从向量中去掉
bombs.remove(b);
}
}
//画出敌人的坦克
for(inti=0;i{EnemyTanket=ets.get(i);
if(et.isLive)
{
this.drawTank(et.getX(),et.getY(),g,et.getDirect(),0);
//顺便画出敌人的子弹
for(intj=0;j{
//取出子弹
ShotenemyShot=et.ss.get(j);
if(enemyShot.isLive)
{
g.draw3DRect(enemyShot.x,enemyShot.y,1,1,false);
}
else
{//如果死亡了,就从Vextor中删除掉
et.ss.remove(enemyShot);
}
}
}
}
}
//判断我的子弹是否会击中敌人的坦克
publicvoidhitEnemyTank()
{
//判断是否会击中
for(inti=0;i{
//取出子弹
ShotmyShot=hero.ss.get(i);
//判断子弹是否有效
if(myShot.isLive)
{
//取出每一个敌人坦克与之匹配
for(intj=0;j{
//取出坦克
EnemyTanket=ets.get(j);
if(et.isLive)
{
if(this.hitTank(myShot,et))
{//减少敌人数量
Recorder.reduceEnNum();
//增加我的记录
Recorder.addEnEnum();
}
}
}
}
}
}
//我是否被击中
publicvoidhitMe()
{
//取出每一个敌人的坦克
for(inti=0;i{
//取出坦克
EnemyTanket=ets.get(i);
//取出每颗子弹
for(intj=0;j{//取出子弹
ShotenemyShot=et.ss.get(j);
if(hero.isLive)
{
if(this.hitTank(enemyShot,hero))
{
//待写
}
}
}
}
}
//画出一个专门判断子弹是否击中敌人坦克的函数
publicbooleanhitTank(Shots,Tanket)
{
booleanb2=false;
//判断该坦克的方向
switch(et.direct)
{
//敌人坦克的方向是向上或者向下
case0:
case2:
if(s.x>et.x&&s.xet.y&&s.y{
//击中
//子弹死亡
s.isLive=false;
//敌人坦克死亡
et.isLive=false;
b2=true;
//System.out.println("hytfyfrujyg");
//创建一颗炸弹放入Vector
Bombb=newBomb(et.x,et.y);
bombs.add(b);
}
break;
case1:
case3:
if(s.x>et.x&&s.xet.y&&s.y{
//击中
//子弹死亡
s.isLive=false;
//敌人坦克死亡
et.isLive=false;
b2=true;
Bombb=newBomb(et.x,et.y);
bombs.add(b);
}
break;
}
returnb2;
}
//画出坦克的函数(扩展)
publicvoiddrawTank(intx,inty,Graphicsg,intdirection,inttype)
{
//判断类型
switch(type)
{
case0:
g.setColor(Color.CYAN);break;
case1:
g.setColor(Color.yellow);break;
}
//判断方向
switch(direction)
{
//向上走
case0:
//g.setColor(Color.CYAN);
//画出我的坦克(到时再封装成一个函数)
//1.画出左边的矩形
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);
//4画圆形
g.fillOval(x+5,y+10,10,10);
//5.画出线
g.drawLine(x+10,y+15,x+10,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);
//2.画出右边边的矩形
g.fill3DRect(x+15,y,5,30,false);
//3画出中间的矩形
g.fill3DRect(x+5,y+5,10,20,false);
//4画圆形
g.fillOval(x+5,y+10,10,10);
//5.画出线
g.drawLine(x+10,y+15,x+10,y+30);
break;
case3:
//向左
g.fill3DRect(x,y,30,5,