坦克大战源码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

坦克大战源码
根据韩顺平老师视频所作
/**坦克大战4.0
* 防重叠
*/
package com.TankGame5;
import java.awt.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.IOException;
import java.util.Vector;
public class MyTankGame5 extends JFrame implements ActionListener{
//提示面板
MyStartPanel msp=null;
//游戏面板
MyPanel mp=null;
//游戏菜单
//开始游戏
JMenuBar jmb=null;
JMenu jm1=null;
//开始游戏
JMenuItem jmi1=null;
//退出游戏
JMenuItem jmi2=null;
//存盘退出
JMenuItem jmi3=null;
//继续上一局
JMenuItem jmi4=null;
public static void main(String[] args) {
// TODO Auto-generated method stub
MyTankGame5 bn=new MyTankGame5(); }
//构造函数
public MyTankGame5()
{
//创建菜单栏选项
jmb=new JMenuBar();
jm1=new JMenu("游戏(G)");
//创建快捷方式
jm1.setMnemonic('G');
jmi1=new JMenuItem("开始新游戏(N)");
jmi1.setMnemonic('N');
//注册监听jmi1
jmi1.addActionListener(this);
jmi1.setActionCommand("newgame");
jmi2=new JMenuItem("退出该局游戏(Q)");
jmi2.setMnemonic('Q');
//注册监听jmi2
jmi2.addActionListener(this);
jmi2.setActionCommand("exit");
jmi3=new JMenuItem("存盘退出游戏(C)");
jmi3.setMnemonic('C');
//注册监听jmi3
jmi3.addActionListener(this);
jmi3.setActionCommand("saveExit");
jmi4=new JMenuItem("继续上一局(R)");
jmi4.setMnemonic('R');
//注册监听jmi4
jmi4.addActionListener(this);
jmi4.setActionCommand("continue");
jm1.add(jmi1);
jm1.add(jmi4);//添加的顺序就是菜单的顺序jm1.add(jmi3);
jm1.add(jmi2);
jmb.add(jm1);
this.setJMenuBar(jmb);
//先启动提示框
msp=new MyStartPanel();
this.add(msp);
Thread t1=new Thread(msp);
t1.start();
// mp=new MyPanel();
// this.add(mp);
// //注册监听
// this.addKeyListener(mp);
//
// //启动mp线程
// Thread t2=new Thread(mp);
// t2.start();
//窗口大小
this.setSize(MyPanel.bx1+230,MyPanel.by1+150);
this.setTitle("坦克横行");
ImageIcon icon = new ImageIcon("Images/yan.png");
this.setIconImage(icon.getImage());
this.setLocation(250,150);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
if(arg0.getActionCommand().equals("newgame"))
{
//System.out.println("英雄的到来");
//创建战场
mp=new MyPanel("newgame");
this.add(mp);
//注册监听
this.addKeyListener(mp);
//启动mp线程
Thread t2=new Thread(mp);
t2.start();
this.remove(msp);
this.setVisible(true);
}
//简单退出
else if(arg0.getActionCommand().equals("exit")) {
//用户点击退出
//保存击毁的敌人
Recorder.keepRecording();
System.exit(0);
}
//存盘退出处理
else if(arg0.getActionCommand().equals("saveExit")) {
//System.out.print("111");
//获取当前值
Recorder.setEts(mp.ets);
//保存击毁的敌人和敌人的坐标
Recorder.keepRecAndEnemyTank();
//退出
System.exit(0);
}
//继续上一局
else if(arg0.getActionCommand().equals("continue")) {
//创建战场
mp=new MyPanel("continue");
this.add(mp);
//注册监听
this.addKeyListener(mp);
//启动mp线程
Thread t2=new Thread(mp);
t2.start();
this.remove(msp);
this.setVisible(true);
}
}
}
//开始提示面板
class MyStartPanel extends JPanel implements Runnable
{
int times=0;
public void paint(Graphics g)
{
super.paint(g);
g.fillRect(0, 0, MyPanel.bx1, MyPanel.by1);
if(times%2==0&&times<=30)
{
//提示信息
Font myFont=new Font("华文新魏",Font.BOLD,30);
g.setFont(myFont);
g.setColor(Color.YELLOW);
g.drawString("READY? GO!", 100, 120);
}
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
try {
Thread.sleep(500);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
times++;
//重画闪烁效果
this.repaint();
}
}
}
//我的面板
class MyPanel extends JPanel implements KeyListener,Runnable {
static int h=300;//坦克初始位置
static int z=200;
//暂停开始开关
static int power=2;
//背景区域大小
static int bx1=400;
static int by1=300;
//声音控制
static int audio=0;
//定义一个我的坦克
Hero hero=null;
//定义地方的坦克组
Vector<EnemyTank> ets=new Vector<EnemyTank>();
static int ensize=10;//敌人个数
//定义炸弹集合
Vector<Bomb> bombs=new Vector<Bomb>();
//信息集合
Vector<Node> nodes=new V ector<Node>();
//定义2个图片,一起组成爆炸效果
Image image1=null;
Image image2=null;
Image image3=null;
//构造函数
public MyPanel(String flag)
{
//恢复记录
Recorder.getRecording();
//播放声音
AePlayWave ap=new AePlayWave("D:\\CHEN\\ks.wav");
ap.start();
//构造我的坦克
hero=new Hero(h,z);
//构造初始敌人
this.startEnemyTank(flag);
//初始化图片
//下面的方法第一个爆炸效果不明显
image1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/beng.png"));
image2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/beng2.png"));
image3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/beng3.png"));
// try {
// image1=ImageIO.read(new File("shanshui.jpg"));
// image2=ImageIO.read(new File("beng2.png"));
// image3=ImageIO.read(new File("beng3.png"));
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
public void startEnemyTank(String flag)
{
if(flag.equals("newgame"))
{
//构造敌方坦克
for(int i=0;i<ensize;i++)
{
//创建敌方坦克敌人的初始位置
EnemyTank et=new EnemyTank((i+1)*35,0);
et.setColor(0); //???
et.setDirect(2);
//将MyPanel创建的坦克交给该敌人
et.setEts(ets);
//加入向量组
ets.add(et);
//给敌人添加子弹
Shot s=new Shot(et.x+10,et.y+30,2);
et.ss1.add(s);
Thread t2=new Thread(s);
t2.start();
//启动敌人坦克
Thread t=new Thread(et);
t.start();
}
}
else
{
nodes=new Recorder().getNodesAndEnemy();
//构造敌方坦克
for(int i=0;i<nodes.size();i++)
{
//取出Node
Node node=nodes.get(i);
//创建敌方坦克敌人的初始位置
EnemyTank et=new EnemyTank(node.x,node.y);
et.setColor(0); //???
et.setDirect(node.direct);
//将MyPanel创建的坦克交给该敌人
et.setEts(ets);
//加入向量组
ets.add(et);
//给敌人添加子弹
Shot s=new Shot(et.x+10,et.y+30,2);
et.ss1.add(s);
Thread t2=new Thread(s);
t2.start();
//启动敌人坦克
Thread t=new Thread(et);
t.start();
}
}
}
//函数的重载,用于重复产生敌人(int)(Math.random()*270),(int)(Math.random()*360) public void startEnemyTank()
{
//构造敌方坦克
//创建敌方坦克敌人的初始位置位置随机
EnemyTank et=new EnemyTank((int)(Math.random()*370),(int)(Math.random()*270));
et.setColor(0); //???
et.setDirect(2);
//将MyPanel创建的坦克交给该敌人
et.setEts(ets);
//加入向量组
ets.add(et);
//给敌人添加子弹
Shot s=new Shot(et.x+10,et.y+30,2);
et.ss1.add(s);
Thread t2=new Thread(s);
t2.start();
//启动敌人坦克
Thread t=new Thread(et);
t.start();
}
//画提示信息的坦克
public void showInfo(Graphics g)
{
//提示信息
this.drawTank(80, 330, g,0, 1);
g.setColor(Color.black);
g.drawString(Recorder.getEnlife()+"", 115, 350);
this.drawTank(180, 330, g,0, 0);
g.setColor(Color.black);
g.drawString(Recorder.getMylife()+"", 220, 350);
Font f=new Font("宋体",Font.BOLD,25);
g.setFont(f);
g.drawString("您的总成绩", 415, 40);
this.drawTank(440, 90, g,0, 1);
g.drawString("*", 470, 112);
g.drawString(Recorder.getDeadenemy()+"", 500, 110);
//判断结束提示消息
//Hero输了
if(Hero.counter==Hero.newlife)
{
Font f1=new Font("宋体",Font.BOLD,40);
g.setFont(f1);
g.setColor(Color.RED);
g.drawString("GAME OVER", 110, 150);
for(int i=0;i<this.ets.size();i++)
{
//取出各个坦克速度
int esp0=ets.get(i).getSpeed();
//设其速度为0
ets.get(i).setSpeed(0);
//取出各个坦克
EnemyTank et=ets.get(i);
//再取出每一颗子弹
for(int j=0;j<et.ss1.size();j++)
{
//取出各个子弹速度
int ess0=et.ss1.get(j).getSpeed();
//设其速度为0
et.ss1.get(j).setSpeed(0);
}
}
}
//HERO 胜利!
//没有敌人了就赢了
else if(Recorder.getEnlife()==MyPanel.ensize-EnemyTank.newlife) {
Font f1=new Font("宋体",Font.BOLD,40);
g.setFont(f1);
g.setColor(Color.RED);
g.drawString("WINNER", 120, 150);
for(int i=0;i<this.ets.size();i++)
{
//取出各个坦克速度
int esp0=ets.get(i).getSpeed();
//设其速度为0
ets.get(i).setSpeed(0);
//取出各个坦克
EnemyTank et=ets.get(i);
//再取出每一颗子弹
for(int j=0;j<et.ss1.size();j++)
{
//取出各个子弹速度
int ess0=et.ss1.get(j).getSpeed();
//设其速度为0
et.ss1.get(j).setSpeed(0);
}
}
}
}
//重写paint
public void paint(Graphics g)
{
super.paint(g);
g.fillRect(0, 0, bx1, by1); //填充背景颜色
this.showInfo(g);
if(hero.isLive&&Hero.counter!=Hero.newlife)
{
//画我的坦克
this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 0);
}
else if(!hero.isLive&&Hero.counter<Hero.newlife)
{
hero.isLive=true;
Hero.counter++;
//画我的坦克
this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 0);
}
//遍历Vector画出子弹&&Hero.counter!=Hero.newlife
for(int i=0;i<hero.ss.size();i++)
{
Shot myshot=hero.ss.get(i);
//画一颗子弹
if(myshot!=null&&myshot.isLive)
{
g.setColor(Color.yellow);
g.fill3DRect(myshot.x, myshot.y, 3, 3, false);
//g.fillOval(myshot.x-1, myshot.y, 5, 5);
}
if(myshot.isLive==false)
{
//删除死亡的子弹
hero.ss.remove(myshot);
}
}
//画出炸弹
for(int i=0;i<bombs.size();i++)
{
//取出炸弹
Bomb b=bombs.get(i);
if(b.life>2)
{
g.drawImage(image3, b.x, b.y, 30, 30, this);
}
else if(b.life>1)
{
g.drawImage(image1, b.x, b.y, 30, 30, this);
}
else
{
g.drawImage(image2, b.x, b.y, 30, 30, this);
}
//播放爆炸声音
AePlayWave ap1=new AePlayWave("D:\\CHEN\\bz.wav");
ap1.start();
//Hero输了
if (Hero.counter == Hero.newlife )
{//提示声音
AePlayWave ap = new AePlayWave("D:\\CHEN\\gameover.wav");
ap.start();
audio++;
}
//HERO 胜利!
//没有敌人了就赢了
else if (Recorder.getEnlife() == MyPanel.ensize - EnemyTank.newlife && audio == 0)
{ //提示声音
AePlayWave ap = new AePlayWave("D:\\CHEN\\winner.wav");
ap.start();
audio++;
}
//让b的生命值减小
b.lifeDown();
//减小到0就去掉
if(b.life==0)
{
bombs.remove(b);
}
}
//画敌方坦克
for(int i=0;i<ets.size();i++)
{
EnemyTank et=ets.get(i);
if(et.isLive)
{
this.drawTank(et.getX(), et.getY(), g, et.getDirect(), 1);
//画出敌人子弹
for(int j=0;j<et.ss1.size();j++)
{
//取出子弹
Shot enemyshot=et.ss1.get(j);
if(enemyshot.isLive)
{
g.setColor(Color.RED);
g.fill3DRect(enemyshot.x-1, enemyshot.y, 3, 3, false);
}
else
{
//如果敌人子弹死亡就把他从Vector中去掉
et.ss1.remove(enemyshot);
}
}
}
//有敌人被消灭就在画一个,而且不能超过10个
if(!et.isLive&&EnemyTank.counter<EnemyTank.newlife)
{
et.ets.remove(et);
//重载
this.startEnemyTank();
EnemyTank.counter++;
}
}
}
//判断子弹是否击中敌方坦克
public void hitTank(Shot s,Tank et)
{
//判断敌人坦克方向
switch(et.direct)
{
case 0:
case 2:
if(s.x>et.x&&s.x<et.x+20&&s.y>et.y&&s.y<et.y+30)
{
//创建炸弹
Bomb b=new Bomb(et.x, et.y);
//放入Vector
bombs.add(b);
//击中
//子弹死亡
s.isLive=false;
//敌人死亡
et.isLive=false;
if(et!=hero)
{
//敌人数目减少
Recorder.reduceEnlife();
//记录我的战绩
Recorder.deadenemy();
}
//减少我的生命
else if(et==hero)
{
Recorder.reduceMylife();
}
}
break;
case 1:
case 3:
if(s.x>et.x&&s.x<et.x+30&&s.y>et.y&&s.y<et.y+20)
{
//创建炸弹
Bomb b=new Bomb(et.x, et.y);
//放入Vector
bombs.add(b);
//击中
//子弹死亡
s.isLive=false;
//敌人死亡
et.isLive=false;
if(et!=hero)
{
//敌人数目减少
Recorder.reduceEnlife();
//记录我的战绩
Recorder.deadenemy();
}
else if(et==hero)
{
Recorder.reduceMylife();
}
}
break;
}
}
//判断敌人是否击中我
public void hitMe()
{
//取出敌人的坦克
for(int i=0;i<this.ets.size();i++)
{
//取出坦克
EnemyTank et=ets.get(i);
//取出每一颗子弹
for(int j=0;j<et.ss1.size();j++)
{
//取出子弹
Shot enemyshot=et.ss1.get(j);
if(hero.isLive)
{
this.hitTank(enemyshot, hero);
}
}
}
}
//判断是否击中了敌人
public void hitenemytank()
{
//判断是否击中
for(int i=0;i<hero.ss.size();i++)
{
//取出子弹
Shot myshot=hero.ss.get(i);
//判断是否有效
if(myshot.isLive)
{
//取出每个坦克与他判断
for(int j=0;j<ets.size();j++)
{
//取出坦克
EnemyTank et=ets.get(j);
if(et.isLive)
{
this.hitTank(myshot, et);
}
}
}
// //播放爆炸声音
//
// AePlayWave ap1=new AePlayWave("D:\\CHEN\\fs.wav");
// ap1.start();
}
}
//画坦克的函数
public void drawTank(int x,int y,Graphics g, int direct, int type)//direct方向,type类型{
switch(type)
{
case 1:
g.setColor(Color.CY AN);
break;
case 0:
g.setColor(Color.yellow);
break;
}
//判断方向
switch(direct)
{
//向上
case 0:
//画上方向的坦克有五个部件构成
//1.左边的矩形
g.fill3DRect(x, y, 5, 30,false);
//2.y右边的矩形
g.fill3DRect(x+15, y, 5, 30,false);
//中间矩形
g.fill3DRect(x+5, y+6, 10, 19,false);
//g.fillRect(x+5, y+6, 10, 19);
//中间圆
g.setColor(Color.GRAY);
g.fillOval(x+5, y+9, 10, 10);
//炮筒
g.setColor(Color.DARK_GRAY);
g.fill3DRect(x+10, y-4, 2, 21,false);
g.setColor(Color.blue);
g.fill3DRect(x+8, y-8, 5, 3,false);
break;
case 1:
//画向右的坦克
g.fill3DRect(x, y, 30, 5,false);//上轮
g.fill3DRect(x, y+15, 30, 5,false);//下轮
g.fill3DRect(x+5, y+6, 19, 10,false);//中间
g.setColor(Color.GRAY);
g.fillOval(x+9, y+5, 10, 10);//中间圆
g.setColor(Color.DARK_GRAY);
g.fill3DRect(x+12, y+9, 21, 2,false);//炮筒
g.setColor(Color.blue);
g.fill3DRect(x+33, y+8, 3, 5,false);
break;
case 2:
//向下
//1.左边的矩形
g.fill3DRect(x, y, 5, 30,false);//hero.getX(),hero.getY()用x y换了
//2.y右边的矩形
g.fill3DRect(x+15, y, 5, 30,false);
//中间矩形
g.fill3DRect(x+5, y+4, 10, 19,false);
//g.fillRect(x+5, y+6, 10, 19);
//中间圆
g.setColor(Color.GRAY);
g.fillOval(x+5, y+9, 10, 10);
//炮筒
g.setColor(Color.DARK_GRAY);
g.fill3DRect(x+10, y+14, 2, 20,false);
g.setColor(Color.blue);
g.fill3DRect(x+8, y+33, 5, 3,false);
break;
case 3:
//向左
g.fill3DRect(x, y, 30, 5,false);//上轮
g.fill3DRect(x, y+15, 30, 5,false);//下轮
g.fill3DRect(x+7, y+6, 19, 10,false);//中间
g.setColor(Color.GRAY);
g.fillOval(x+9, y+5, 10, 10);//中间圆
g.setColor(Color.DARK_GRAY);
g.fill3DRect(x-6, y+9, 21, 2,false);//炮筒
g.setColor(Color.blue);
g.fill3DRect(x-7, y+8, 3, 5,false);
break;
}
}
//键按下处理
//a表示向左,s向下,d向右,w向上;或者用方向键也行
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
if(arg0.getKeyCode()==KeyEvent.VK_W||arg0.getKeyCode()==KeyEvent.VK_UP) {
//System.out.println("ok");
//设置我的坦克方向向上
if(hero.isLive)
{
this.hero.setDirect(0);
this.hero.moveUp();
}
}
else if (arg0.getKeyCode()==KeyEvent.VK_D||arg0.getKeyCode()==KeyEvent.VK_RIGHT)
{
//向右
if(hero.isLive)
{
this.hero.setDirect(1);
this.hero.moveRight();
}
}
else if (arg0.getKeyCode()==KeyEvent.VK_S||arg0.getKeyCode()==KeyEvent.VK_DOWN)
{
//向下
if(hero.isLive)
{
this.hero.setDirect(2);
this.hero.moveDown();
}
}
else if (arg0.getKeyCode()==KeyEvent.VK_A||arg0.getKeyCode()==KeyEvent.VK_LEFT)
{
//向左
if(hero.isLive)
{
this.hero.setDirect(3);
this.hero.moveLeft();
}
}
//判断开火空格键发射
if(arg0.getKeyCode()==KeyEvent.VK_SPACE)
{
//只能连发5发子弹
if(hero.ss.size()<=4&&hero.isLive)
{
//开火
this.hero.shotEnemy();
}
}
// //暂停/继续游戏
// if(arg0.getKeyCode()==KeyEvent.VK_P)
// {
// for(int i=0;i<this.ets.size();i++)
// {
// if(power%2==0)
// {
// //取出各个坦克速度
// int esp0=ets.get(i).getSpeed();
// //记住该速度
// tempspeed=esp0;
// //设其速度为0
// ets.get(i).setSpeed(0);
//
//
// //取出各个坦克
// EnemyTank et=ets.get(i);
// //再取出每一颗子弹
// for(int j=0;j<et.ss1.size();j++)
// {
// //取出各个子弹速度
// int ess0=et.ss1.get(j).getSpeed(); // //记住该速度
// int ess1=ess0;
// //设其速度为0
// et.ss1.get(j).setSpeed(0);
// }
//
// }
// else
// {
// ets.get(i).setSpeed(esp1);
//
// //et.ss1.get(j).setSpeed(0);
// }
//
// }
// power++;
// }
//
//调用repaint重画
this.repaint();
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void run() {
// TODO Auto-generated method stub
//每100毫秒重绘
while(true)
{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//判断是否添加新子弹
for(int i=0;i<ets.size();i++)
{
EnemyTank et=ets.get(i);
if(et.isLive)
{
//ets.size()为敌人可以连发子弹的数目
if(et.ss1.size()<2)
{
Shot s=null;
//没有子弹,添加
switch(et.direct)
{
case 0:
s=new Shot(et.x+9,et.y-10,0);
et.ss1.add(s);
break;
case 1:
s=new Shot(et.x+35,et.y+9,1);
et.ss1.add(s);
break;
case 2:
s=new Shot(et.x+10,et.y+35,2);
et.ss1.add(s);
break;
case 3:
s=new Shot(et.x-9,et.y+9,3);
et.ss1.add(s);
break;
}
//创建线程对象
Thread t=new Thread(s);
//启动
t.start();
}
}
}
this.hitenemytank();
this.hitMe();
//重绘
this.repaint();
}
}
}
package com.TankGame5;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.io.*;
import java.util.Vector;
import javax.sound.sampled.*;
import javax.swing.JPanel;
class Node
{
int x;
int y;
int direct;
public Node(int x,int y,int direct)
{
this.x=x;
this.y=y;
this.direct=direct;
}
}
//记录坦克信息的类
class Recorder
{
//记录敌人和我的坦克数量
private static int enlife=20;
private static int mylife=10;
private static int deadenemy=0;
private static FileWriter fw=null;
private static BufferedWriter bw=null;
private static FileReader fr=null;
private static BufferedReader br=null;
private static Vector<EnemyTank> ets=new Vector<EnemyTank>();
//从文件恢复记录
static Vector<Node> nodes=new Vector<Node>();
//完成读取
public Vector<Node> getNodesAndEnemy()
{
try {
//创建
fr=new FileReader("d:\\chen\\AllRecording.txt");
br=new BufferedReader(fr);
String n="";
//先读取第一行
n=br.readLine();
deadenemy=Integer.parseInt(n);
//用split分割从第二行开始取
while((n=br.readLine())!=null)
{
//字符串str中从第一个字符起,
//每遇到一个空格则切割为一个元素,
//放入[]xyd数组中
String []xyd=n.split(" ");//这里的空格数与keepRecAndEnemyTank()中
//写入(String record=et.x+" "+et.y+" "+et.direct;)
//!!!!!!!!!!!!!! //的空格数要对应,否则会报错!
Node node1=new Node(Integer.parseInt(xyd[0]),Integer.parseInt(xyd[1]),Integer.parseInt(xyd[2]));
nodes.add(node1);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
//关闭文件
//谁先开,谁后关!
try {
br.close();
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return nodes;
}
public static Vector<EnemyTank> getEts() {
return ets;
}
public static void setEts(Vector<EnemyTank> ets) { Recorder.ets = ets;
}
//保存击毁敌人的数目和敌人坐标,存盘退出
public static void keepRecAndEnemyTank()
{
try {
//创建
fw=new FileWriter("d:\\chen\\AllRecording.txt");
bw=new BufferedWriter(fw);
bw.write(deadenemy+"\r\n");
//保存当前敌人的数目和坐标
for(int i=0;i<ets.size();i++)
{
//取出第一个坦克
EnemyTank et=ets.get(i);
//保存活的
if(et.isLive)
{
String record=et.x+" "+et.y+" "+et.direct;
//写入
bw.write(record+"\r\n");
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
//关闭文件
//谁先开,谁后关!
try {
bw.close();
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//保存击毁的敌人数目
public static void keepRecording()
{
try {
//创建
fw=new FileWriter("d:\\chen\\TankRecording.txt");
bw=new BufferedWriter(fw);
bw.write(deadenemy+"\r\n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
//关闭文件
//谁先开,谁后关!
try {
bw.close();
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//读取出上一局击毁的敌人数目
public static void getRecording()
{
try {
//创建
fr=new FileReader("d:\\chen\\TankRecording.txt");
br=new BufferedReader(fr);
String n=br.readLine();
deadenemy=Integer.parseInt(n);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
//关闭文件
//谁先开,谁后关!
try {
br.close();
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static int getEnlife() {
return enlife;
}
public static void setEnlife(int enlife) {
Recorder.enlife = enlife;
}
public static int getMylife() {
return mylife;
}
public static void setMylife(int mylife) {
Recorder.mylife = mylife;
}
//减少数量
public static void reduceMylife() {
Recorder.mylife--;
}
public static void reduceEnlife() {
Recorder.enlife--;
}
public static void deadenemy() {
Recorder.deadenemy++;
}
public static int getDeadenemy() {
return deadenemy;
}
}
class Tank
{
//坦克的横坐标
int x=0;
//纵坐标
int y=0;
//暂停速度
int tempspeed;
public int getTempspeed() {
return tempspeed;
}
public void setTempspeed(int tempspeed) { this.tempspeed = tempspeed;
}
//颜色
int color;
boolean isLive=true;
public boolean isLive() {
return isLive;
}
public void setLive(boolean isLive) { this.isLive = isLive;
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public Tank (int x,int y)
{
this.x=x;
this.y=y;
}
//坦克方向
//0上,1右,2下,3左
int direct=0;
public int getDirect() {
return direct;
}
public void setDirect(int direct) {
this.direct = direct;
}
//坦克的速度
int speed=3;
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
}
//敌方坦克
class EnemyTank extends Tank implements Runnable {
//设敌人可以复活10次
static int newlife=10;
//计数器
static int counter=0;
//让坦克随机产生步数
//每次走多少步
int steps=(int)(Math.random()*50+10);
int sleeptime=200; //睡眠时间
//定义一个向量存放敌人子弹
Vector<Shot> ss1=new Vector<Shot>();
//在敌人创建和子弹死亡后在创建子弹
public EnemyTank(int x,int y)
{
super(x,y);
}
//定义一个向量,访问MyPanel的所有敌人坦克
Vector<EnemyTank> ets=new Vector<EnemyTank>();
//得到MyPanel的所有敌人坦克
public void setEts(Vector<EnemyTank> vv)
{
this.ets=vv;
}
//判断是否撞到了别的敌人坦克
public boolean isTouchotherEnemy()
{
boolean b=false;
//判断
switch(this.direct)
{
case 0:
//向上
//取出敌人所有坦克
for(int i=0;i<ets.size();i++)
{
//取出第一个坦克
EnemyTank et=ets.get(i);
//如果不是自己
if(et!=this)
{
//如果敌人方向是向上或者向下
if(et.direct==0||et.direct==2)
{
if(this.x>=et.x&&this.x<=et.x+20&&this.y>=et.y&&this.y<=et.y+30)
{
return true;
}
if(this.x+20>=et.x&&this.x+20<=et.x+20&&this.y>=et.y&&this.y<=et.y+30)
{
return true;
}
}
//如果敌人方向是向左或者向右
if(et.direct==1||et.direct==3)
{
if(this.x>=et.x&&this.x<=et.x+30&&this.y>=et.y&&this.y<=et.y+20)
{
return true;
}
if(this.x+20>=et.x&&this.x+20<=et.x+30&&this.y>=et.y&&this.y<=et.y+20)
{
return true;
}
}
}
}
break;
case 1:
//向右
//取出敌人所有坦克
for(int i=0;i<ets.size();i++)
{
//取出第一个坦克
EnemyTank et=ets.get(i);
//如果不是自己
if(et!=this)
{
//如果敌人方向是向上或者向下
if(et.direct==0||et.direct==2)
{
if(this.x+30>=et.x&&this.x+30<=et.x+20&&this.y>=et.y&&this.y<=et.y+30)
{
return true;
}
if(this.x+30>=et.x&&this.x+30<=et.x+20&&this.y+20>=et.y&&this.y+20<=et.y+30)
{
return true;
}
}
//如果敌人方向是向左或者向右
if(et.direct==1||et.direct==3)
{
if(this.x>=et.x&&this.x<=et.x+30&&this.y>=et.y&&this.y<=et.y+20)
{
return true;
}
if(this.x+30>=et.x&&this.x+30<=et.x+30&&this.y+20>=et.y&&this.y+20<=et.y+20)
{
return true;
}
}
}
}
break;
case 2:
//向下
//取出敌人所有坦克
for(int i=0;i<ets.size();i++)
{
//取出第一个坦克
EnemyTank et=ets.get(i);
//如果不是自己
if(et!=this)
{
//如果敌人方向是向上或者向下
if(et.direct==0||et.direct==2)
{
if(this.x>=et.x&&this.x<=et.x+20&&this.y+30>=et.y&&this.y+30<=et.y+30)
{
return true;
}
if(this.x+20>=et.x&&this.x+20<=et.x+20&&this.y+30>=et.y&&this.y+30<=et.y+30)
{
return true;
}
}
//如果敌人方向是向左或者向右
if(et.direct==1||et.direct==3)
{
if(this.x>=et.x&&this.x<=et.x+30&&this.y+30>=et.y&&this.y+30<=et.y+20)
{
return true;
}
if(this.x+20>=et.x&&this.x+20<=et.x+30&&this.y+30>=et.y&&this.y+30<=et.y+20)
{
return true;
}
}
}
}
break;
case 3:
//向左
//取出敌人所有坦克
for(int i=0;i<ets.size();i++)
{
//取出第一个坦克
EnemyTank et=ets.get(i);
//如果不是自己
if(et!=this)
{
//如果敌人方向是向上或者向下
if(et.direct==0||et.direct==2)
{
if(this.x>=et.x&&this.x<=et.x+20&&this.y>=et.y&&this.y<=et.y+30)
{
return true;
}
if(this.x>=et.x&&this.x<=et.x+20&&this.y+20>=et.y&&this.y+20<=et.y+30)
{
return true;
}
}
//如果敌人方向是向左或者向右
if(et.direct==1||et.direct==3)
{
if(this.x>=et.x&&this.x<=et.x+30&&this.y>=et.y&&this.y<=et.y+20)
{
return true;
}
if(this.x>=et.x&&this.x<=et.x+30&&this.y+20>=et.y&&this.y+20<=et.y+20)
{
return true;
}
}
}
}
break;
}
return b;
}
public void run() {
// TODO Auto-generated method stub
while(true)
{
switch(this.direct)
{
case 0:
//继续让他再走几步
for(int i=0;i<steps;i++)
{
if(y>0&&!isTouchotherEnemy())
{
y-=speed;
}
// //撞到墙或者队友就转弯||isTouchotherEnemy()
// else if(y<=0)
// {
// //让坦克变向
// this.direct=(direct+1)%4;
// }
try {
Thread.sleep(sleeptime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
case 1:
//继续让他再走几步
for(int i=0;i<steps;i++)
{
if(x<MyPanel.bx1-20&&!isTouchotherEnemy())
{
x+=speed;
}
// //撞到墙或者队友就转弯
// else if(x>=MyPanel.bx1-20)
// {
// //让坦克变向
// this.direct=(direct+1)%4;
// }
try {
Thread.sleep(sleeptime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
case 2:
//继续让他再走几步
for(int i=0;i<steps;i++)
{
if(y<MyPanel.by1-20&&!isTouchotherEnemy())
{
y+=speed;
}
//撞到墙或者队友就转弯
// else if(y>=MyPanel.by1-20)
// {
// //让坦克变向
// this.direct=(direct+1)%4;
// }。

相关文档
最新文档