JAVA小白求救:坦克大战-多关卡咋做?没思路。。。

坦克大战-多关卡咋做:

自己代码如下:

//坦克大战:-换关卡,-IO声音流,把爆炸换成外面的图片,有BUG继续游戏的时候看不到爆炸一下才能看到地方坦克,
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
public class Tank1 extends JFrame implements ActionListener{
MyPanel mp=null;
StartPanel gkmp=null;
//Record record=null;
JMenuBar cd=null;//??不熟
JMenu cd1=null;//??不熟
JMenu cd2=null;
JMenuItem cd1xl1=null;//菜单栏1系列的1
JMenuItem cd1xl2=null;//菜单栏1系列的2
JMenuItem cd1xl3=null;//菜单栏1系列的1
JMenuItem cd1xl4=null;//菜单栏1系列的2

JMenuItem cd2xl1=null;//菜单栏2系列的1
JLabel imageJLabel=null;
String newGame="newGame";//?
//Image tp1=null;
public static void main(String[] args)
{
Tank1 t1=new Tank1();
}
public Tank1(){

gkmp=new StartPanel();
mp=new MyPanel(newGame);//??
Record record=new Record();//创建一个记录对象
Thread t=new Thread(gkmp);
t.start();

    cd=new JMenuBar();//菜单栏 不熟

    cd1=new JMenu("游戏(G)");//第一个菜单栏的第一个菜单 
    cd1.setMnemonic('G');//快界键

    cd2=new JMenu("设置(Z)");
    cd2.setMnemonic('Z');

    cd1xl1=new JMenuItem("开始新游戏(N)");//菜单系列 cdxl
    cd1xl1.setMnemonic('N');
    cd1xl1.addActionListener(this);//加组件监听
    cd1xl1.setActionCommand("newGame");//设置键值,和上文同名参数有啥关系没?
    cd1.add(cd1xl1);

    cd1xl2=new JMenuItem("继续游戏(H)");//菜单系列 cdxl
    cd1xl2.setMnemonic('H');
    cd1xl2.addActionListener(this);//加组件监听
    cd1xl2.setActionCommand("goonGame");//设置键值
    cd1.add(cd1xl2);

    cd1xl3=new JMenuItem("保存退出(S)");//菜单系列 cdxl
    cd1xl3.setMnemonic('S');
    cd1xl3.addActionListener(this);//加组件监听
    cd1xl3.setActionCommand("saveOut");//设置键值
    cd1.add(cd1xl3);

    cd1xl4=new JMenuItem("退出(Q)");
    cd1xl4.setMnemonic('Q');
    cd1xl4.addActionListener(this);//加组件监听
    cd1xl4.setActionCommand("exit");//设置键值
    cd1.add(cd1xl4);

    cd.add(cd1);//给菜单栏 cd 添加菜单 cd1

    cd2xl1=new JMenuItem("速度(F)");//菜单系列 cdxl 没做好效果?
    cd1xl4.setMnemonic('F');
    cd1xl4.addActionListener(this);//加组件监听
    cd1xl4.setActionCommand("FSpeed");//设置键值
    cd2.add(cd2xl1);
    cd.add(cd2);

    ImageIcon img = new ImageIcon("E:/Tank1/tankebig.PNG");
    JLabel imageJLabel = new JLabel(img);
    gkmp.add(imageJLabel);

    this.add(gkmp);
    this.setJMenuBar(cd);
    this.setTitle("坦克大战");

    ImageIcon tp1=new ImageIcon("E:/Tank1/tankexiao.PNG");//设置小图标地址要写全路径
    this.setIconImage(tp1.getImage());

    this.setSize(700,620);
    this.setLocation(300,80);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);//可见
    this.setResizable(false);//可调

// this.setResizable(true);

}
public void actionPerformed(ActionEvent e){
    //boolean flag=true;
    if(e.getActionCommand().equals("newGame"))
    {   
        this.remove(gkmp);//取消界面 gkmp
        if(mp.flag==false)//因为在主类构造函数开始就创建了mp,所以可以引用flag变量
        {
            this.remove(mp);
            mp=new MyPanel("newGame");
        }       
        this.add(mp);                       
        this.addKeyListener(mp);
        Thread t=new Thread(mp);//启动我的MyPanel模板对象mp的线程
        t.start();//叫醒线程
        this.setVisible(true);//因为默认的是不可见,必须写这个!!
        Record.bcjl();//????
    }else if(e.getActionCommand().equals("saveOut"))
    {
        Record record0=new Record();

// record0.setDtk(mp.dtk);
record0.cunpan();///??????
System.exit(0);//游戏退出

}else if(e.getActionCommand().equals("exit"))
{
Record.bcjl();
System.exit(0);//游戏退出
}else if(e.getActionCommand().equals("goonGame")){

this.remove(gkmp);
if(mp.flag==false)//因为在主类构造函数开始就创建了mp,所以可以引用flag变量
{
this.remove(mp);
mp=new MyPanel("goonGame");
}
Thread t=new Thread(mp);
t.start();
this.add(mp);
this.addKeyListener(mp);
this.setVisible(true);
}
}

class StartPanel extends JPanel implements Runnable //开始界面类
{
int time=0;
public void paint(Graphics g){
super.paint(g);

// g.fillRect(0, 0, 600, 500);//设置画布
g.setColor(Color.black);//设置颜色
Color mycolor1=new Color(250,50,0);//自定义红色
g.setFont(new Font("华文琥珀",Font.BOLD,80));//设置字体//?
g.drawString("坦克大战",190 , 460);//绘字符串
g.setColor(Color.black);//设置颜色
g.setFont(new Font("黑体",1,14));//设置字体
g.drawString("李晋祥",648 , 552);//绘字符串
if(time%2==0)
{

g.setColor(Color.white);//设置颜色
g.setFont(new Font("华文行楷",3,35));//字体:华康楷体, Ravie, OCR A Extended
g.drawString("准备战斗",270 , 345);//绘字符串

}
}
StartPanel(){
}
public void run(){
while(true){
try{
Thread.sleep(400);
}catch(Exception e){}
time++;
this.repaint();
}
}
}

class MyPanel extends JPanel implements KeyListener,Runnable
{
//Vector mts=new Vector();//建立一个我的坦克集合类可以出无限个坦克
MyTank mt=null;
MyTank mt0=null;
MyTank mt01=null;
MyTank mt02=null;
Vector dtk=new Vector();//建立一个敌坦克集合类
Props props=null;
Vector bzjh=new Vector();//创建一个爆炸类的集合
Vector wzjh=new Vector();//建立一个位置集合类,为啥建立这集合类
int tksl=3;//坦克数量
int a=122;
int b=455;
int n=10;
int myzdNum=4;//?
int propsSort=5;
int time=0;
boolean flag=true;//标记是不是已经创建过MyPanel类
boolean b1=false;
int x=1;//总关卡数?
int rocket=1;//没用?
int huopao=0;//?
Color mycolor1=new Color(250,50,0);//自定义红色
Color mycolor2=new Color(0,250,50);//自定义绿色
Color mycolor3=new Color(0,50,250);//自定义兰色
Color mycolor11=new Color(130,200,0);//自定义土黄
Color mycolor31=new Color(0,100,200);//自定义兰色
Color mycolor21=new Color(0,250,0);//自定义绿色
JLabel imageJLabel0=null;
JLabel imageJLabel1=null;
ImageIcon img0=null;//?
ImageIcon img1=null;//?
public MyPanel(String ss)
{
ImageIcon img0 = new ImageIcon("e:/Tank1/background.jpg");
JLabel imageJLabel0 = new JLabel(img0);
this.add(imageJLabel0);
Record.dqjl();//?
mt=new MyTank(600,280);//new多个可改为多个坦克,循环数组
mt0=new MyTank(550,280);//new多个可改为多个坦克,循环数组
mt01=new MyTank(550,330);//new多个可改为多个坦克,循环数组
mt02=new MyTank(600,330);//new多个可改为多个坦克,循环数组
props=new Props(30,30);//没有实际意义,为了new对象,必须要有个参数?
if(ss.equals("newGame")){
// record=new Record();
for(int i=0;i<tksl;i++){
DiTank dt=new DiTank((i)*a,b);//添加出场敌坦
// dt.dtkxl(dtk);///???是不是敌人坦克血量
dt.setFangxiang(1);//给一个初始值,调drawTank()赋初值要用
Thread t2=new Thread(dt);
t2.start();
Zidan zd=new Zidan(dt.x,dt.y,1);//?这是干啥加子弹元素吗?
Thread t3=new Thread(zd);//?
t3.start();
dtk.add(dt);
}
}else if(ss.equals("goongame")){//继续游戏有问题 感觉读取存盘信息有问题
wzjh=Record.dupan();
for(int i=0;i<wzjh.size();i++){
Weizhi wz=wzjh.get(i);
DiTank dt=new DiTank(wz.x,wz.y);//添加出场敌坦
dt.setFangxiang(wz.fangxiang);
// dt.dtkxl(dtk);//?敌坦克血量,好像暂时用不着
// dt.setFangxiang(1);//给一个初始值,调drawTank()赋初值要用
Thread t2=new Thread(dt);
t2.start();
Zidan zd=new Zidan(dt.x,dt.y,1);//?这是干啥加子弹元素吗?
Thread t3=new Thread(zd);//?
t3.start();
dtk.add(dt);
}
}
flag=false;//MyPanel类的mp创建过一次就标记为假
// this.repaint();

// Record.next();
// if(Record.next()%2!=0){
// Record.reMtNum();//需要吗?
// Record.reDtNum();//需要吗?
// Record.reAddMtNum();
// }
}
public void outNum(Graphics g)//画出统计数据的方法也即使显示数量的函数
{
g.setColor(Color.cyan);
this.drawTank(500,150,g,0,0);//引用drawtank()的不能是g,而是this
this.drawTank(570,150,g,0,1);
this.drawTank(500,70,g,0,1);

    g.setColor(Color.black);
    g.setFont(new Font("仿宋",2,20));//??换换字体效果
    g.drawString(Record.getDtNum()+"",600,170);
    if((Record.getMtNum()+Record.getAddMtNum())>=0){
        g.drawString((Record.getMtNum()+Record.getAddMtNum())+"",530,170);//
    }else{
        g.drawString((Record.getAddMtNum())+"",530,170);
    }

    g.setColor(Color.blue);
    g.setFont(new Font("方正小标宋",1,17));
    g.drawString("干掉的坦克总数:",510,40);

    g.setColor(Color.black);
    g.setFont(new Font("仿宋",2,20));
    g.drawString(Record.getSumDtNum()+"",530,90);

    g.setColor(Color.MAGENTA);//设置颜色
    g.setFont(new Font("隶书",0,20));//设置字体
    g.drawString("第"+x+"关",500 , 200);//绘字符串
}
public void paint(Graphics g){//这个方法每当窗口激活,最小化,调用repaint()方法都会运行,线程中调用就一直显示
    super.paint(g);

// g.fillRect(0,0,400,300);//做个背景画布,默认黑色
this.outNum(g);//调用显示数量的函数
g.setColor(Color.red);//设置颜色
g.fillRect(530, 210, 30, 20);
g.setColor(Color.black);//设置颜色
g.drawLine(530, 210, 530, 320);
g.setColor(mycolor11);//设置颜色
if(mt.live==true){
this.drawTank(mt.getX(),mt.getY(),g,mt.fangxiang,0);
}
if(mt0.live==true){
this.drawTank(mt0.getX(),mt0.getY(),g,mt0.fangxiang,2);
}
if(mt01.live==true){
this.drawTank(mt01.getX(),mt01.getY(),g,mt01.fangxiang,2);
}
if(mt02.live==true){
this.drawTank(mt02.getX(),mt02.getY(),g,mt02.fangxiang,2);
}
if(mt.getLive()==false){
g.setColor(mycolor11);//设置颜色
g.setFont(new Font("Gill Sans Ultra Bold Condensed",1,40));//字体:华康楷体, Ravie, OCR A Extended
g.drawString("game over...",200 , 220);//绘字符串
this.repaint();
}
if(Record.getDtNum()%6==0&&(Record.getDtNum()>10)){
// if(time%2==0)
// {

g.setColor(Color.blue);//设置颜色
g.setFont(new Font("华文行楷",1,35));//字体:华康楷体, Ravie, OCR A Extended
g.drawString("你行不行?",310 , 265);//绘字符串

// }
}
if(Record.getDtNum()==0){
g.setColor(Color.red);//设置颜色
g.setFont(new Font("华文行楷",1,35));//字体:华康楷体, Ravie, OCR A Extended
g.drawString("过关!",300 , 265);//绘字符串

}
for(int i=0;i {
DiTank dt=dtk.get(i);
if(dt.live==true){
this.drawTank(dt.getX(),dt.getY(),g,dt.fangxiang,1);//??!!注意用法用dtk 还是dt调用
}
}
for(int i=0;i {
Zidan zd=mt.aa.get(i);
if(mt.zd!=null&&mt.zd.live==true) //???画子弹的条件
{
//g.fill3DRect((mt.zd.x-2),(mt.zd.y-2), 8, 8, false); //???画子弹火力圈
g.setColor(Color.black);//子弹颜色设置为白色
g.fillOval(zd.x+1,zd.y+1, 4,4);
}
if(zd.live==false)
{
mt.aa.remove(zd);
}
}
//this.repaint();//?
for(int i=0;i {
DiTank dt=dtk.get(i);
for(int j=0;j {
Zidan zd=dt.dzd.get(j);
if(zd!=null&&dtk.get(i).live==true)
{
g.setColor(Color.red);//子弹颜色设置为红色,次处不进循环是不是更好?
g.fillOval(zd.x+1,zd.y+1, 4,4);
}
if(zd.live==false)//删除生命为假的敌人子弹????
{
dt.dzd.remove(zd);
}
}
}
for(int i=0;i {
Baozha bz=bzjh.get(i);
if(bzjh.get(i).livetime>140){
g.setColor(Color.red);
g.fillOval(bz.x, bz.y+5, 20,20 );//代替上面的句子
//g.fillOval(bz.x, bz.y, 20,5 );//可以用来做合成图形,但是要定好坐标点
}else if((bzjh.get(i).livetime<=100)&&(bzjh.get(i).livetime>50)){
g.setColor(Color.orange);
g.fillOval(bz.x+4, bz.y+9, 12,12 );
}else if((bzjh.get(i).livetime<=50)&&(bzjh.get(i).livetime>20)){
g.setColor(Color.yellow);
g.fillOval(bz.x+7, bz.y+11,5,5 );
}else{
g.setColor(Color.pink);
g.fillOval(bz.x+10, bz.y+13,2,2 );
}
bz.ltjs(); //生存时间减少函数
if(bz.livetime==0){
bzjh.remove(bz);
}
}
//
if(props.live==true){//画道具
this.drawProps(props.getX(),props.getY(),g,props.getleixing());
}
//}
this.repaint();//教学视频少了这句,子弹无法自主运行,主类启动线程后仍然可动
}
public void keyPressed(KeyEvent e)//键盘输入事件
{
if(mt.getLive()==true){
if(e.getKeyCode()==KeyEvent.VK_W){
this.mt.setFangxiang(0);
this.mt.xiangshang();
}else if(e.getKeyCode()==KeyEvent.VK_S){
this.mt.setFangxiang(1);
this.mt.xiangxia();
}else if(e.getKeyCode()==KeyEvent.VK_A){
this.mt.setFangxiang(2);
this.mt.xiangzuo();
}else if(e.getKeyCode()==KeyEvent.VK_D){
this.mt.setFangxiang(3);
this.mt.xiangyou();
}
if(e.getKeyCode()==KeyEvent.VK_J)
{
if((mt.aa.size()<myzdNum)&&(mt.live==true))//子弹设置最多 myzdNum 发
{
this.mt.fszd();//调用发射子弹函数
}
}
}
}
public void crash(){

}
public boolean addprops(Props props,MyTank mt)//吃道具触发 方法 (道具功能触发模型为边长20的正方形)
{
    boolean b2=false;
    switch(props.leixing){
    case 0://我的坦克速度提高//mt.fangxiang 0\1\2\3
        if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){
            props.live=false;
            mt.sudu=20;
            b2=true;
        }
        break;
    case 1://效果回到出生地
        if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){
            props.live=false;
            mt.setX(630);
            mt.setY(280);
            b2=true;
        }
        break;
    case 2://提高我可以发射的子弹数目
        //mt.fangxiang 0\1\2\3
        if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){
            props.live=false;
            this.myzdNum=30;
            this.huopao=1;
            this.n=4;
            b2=true;
        }
        break;
    case 3://显示的敌人坦克全死,但实际效果是..是不出敌方坦克了!!!!
        if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){
            props.live=false;
            for(int i=0;i<dtk.size();i++){
                if(dtk.get(i).live==true){
                    dtk.get(i).live=false;
                    Record.setDtNum();//有几个活坦克生命变假,就累计几辆dtNum
                }
            }
            b1=true;
            b2=true;
        }
        break;
    case 4://吃道具加命
        if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){
            props.live=false;
            Record.setAddMtNum();
            b2=true;

// System.out.println("吃道具加命程序,正常运行");
}
break;
}
return b2;

}

// addMyTank++;
//MyTank mt1=new MyTank(mt.getX(),mt.getY());//??创建另一个MyTank对象
// public void setAddMytank(){
// addMyTank++;
// };
// public static int getAddMytank(){
// return addMyTank;
// };
public void run() //我的画板的 线程函数
{
while(true){
try{
Thread.sleep(50);//
}catch(Exception e){}
for(int i=0;i<mt.aa.size();i++)//我的子弹集中敌坦克的线程
{
Zidan myzd=mt.aa.get(i);

            if(myzd.live){
                for(int j=0;j<dtk.size();j++){
                    DiTank dt=dtk.get(j);
                    //  Zidan zd=dt.dzd.get(j);//为啥dzd可以直接用,不用创建//   ||(b1==true&&Record.getDtNum()>0)
                    if(dt.live)//内关联敌人坦克重生的一种情况,有敌人坦克被打中
                    {
                        if(this.jzsf(myzd,dt)&&((Record.getDtNum()-tksl)>=0)){//调用jzsf(),打中同时,坦克定点?及时重生

                                DiTank dt0=new DiTank((int)(Math.random()*50+5)*10,(int)(Math.random()*100+450));
                                Thread t2=new Thread(dt0);
                                t2.start();
                                Zidan zd0=new Zidan(dt0.x,dt0.y,dt0.fangxiang);
                                Thread t3=new Thread(zd0);
                                t3.start();
                                dt0.dzd.add(zd0);
                                dtk.add(dt0);

                        }
                    }
                }
            }
        }

            if(Record.getDtNum()>=tksl&&b1==true){ //炸弹爆炸,敌坦克按条件重生,
                for(int i=0;i<tksl;i++){
                    DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450));
                    Thread t6=new Thread(dt1);
                    t6.start();
                    Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang);
                    Thread t7=new Thread(zd1);
                    t7.start();
                    dt1.dzd.add(zd1);
                    dtk.add(dt1);
                }
                b1=false;
            }
            if((Record.getDtNum()==(tksl-1))&&(b1==true)){
                for(int i=0;i<tksl-1;i++){
                    DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450));
                    Thread t6=new Thread(dt1);
                    t6.start();
                    Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang);
                    Thread t7=new Thread(zd1);
                    t7.start();
                    dt1.dzd.add(zd1);
                    dtk.add(dt1);
                    }
                b1=false;
            }
            if((Record.getDtNum()==(tksl-2))&&(b1==true)){

// for(int i=0;i DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450));
Thread t6=new Thread(dt1);
t6.start();
Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang);
Thread t7=new Thread(zd1);
t7.start();
dt1.dzd.add(zd1);
dtk.add(dt1);
b1=false;
}
for(int j=0;j {
DiTank dt=dtk.get(j);//取出所有敌方坦克
for(int i=0;i {
Zidan zd=dt.dzd.get(i);//?
if(zd.live)
{
if(this.jzsf(zd,mt)==true){//调用 击中敌坦 函数
}
}
}
}
if((this.time%120)==0){//6秒发生1次 道具随机重置//draw mt hit props
props.live=true;
// props.leixing=2;
props.leixing=(int)(Math.random()*propsSort);
props.x=(int)(Math.random()*370);
props.y=(int)(Math.random()*270);
props.livetime=100;//道具生存期
}
if(props.livetime>0){//道具生存期变化
props.livetime--;
}else{
props.live=false;
}
if(mt.live==true&&props.live==true){//调用 吃道具 方法
this.addprops(props,mt);
}
time++;
// if(SaveData.getSumDtNum()%20==0){
// Record.next();
// }
this.repaint();//线程运行中重绘??
}
}
public void jzwf()//敌人子弹集中我方坦克的方法
{
for(int i=0;i<this.dtk.size();i++){
DiTank dt=dtk.get(i);
for(int j=0;j<dt.dzd.size();j++){
Zidan zd=dt.dzd.get(j);
this.jzsf(zd, mt);
}
}
}

public void jzdf() //我的子弹击中坦克的方法
{
for(int i=0;i<mt.aa.size();i++){
Zidan zd=mt.aa.get(i);//从我的子弹集合类取我的各个子弹
if(zd.live==true){
for(int j=0;j<dtk.size();j++){
DiTank dt=dtk.get(j);//从敌坦克集合类取出各个敌坦克
if(dt.live){
this.jzsf(zd,dt);
// levelDtNum--;
}
}
}
this.repaint();
}

}
public boolean jzsf(Zidan zd,Tank tk)//击中双方的方法
{
    boolean b2=false;
    switch(tk.fangxiang)
    {
    case 0:
    case 1:
        if(zd.x>tk.x&&zd.x<tk.x+20&&zd.y>tk.y&&zd.y<tk.y+30)//分辨率判断?
        {

            if(tk instanceof DiTank){//只改这就实现 判断tk是不是DiTank的实例
                Record.setDtNum();
                Record.setSumDtNum();

// Record.setAddMtNum();
tk.live=false;

b2=true;
}else{
// System.out.println("Record.getMtNum()="+Record.getMtNum());
Record.setMtNum();//Record.getSumMtNum()一直小于0 ?bug
if(Record.getMtNum()+1<=0){
Record.lowAddMtNum();
}
// System.out.println("Record.getMtNum()="+Record.getMtNum());
// System.out.println("Record.AddMtNum()="+Record.getAddMtNum());
if(Record.getMtNum()+Record.getAddMtNum()>0){//bug 被打一下就游戏结束 已经解决
mt.setX(140);
mt.setY(232);
}
if(Record.getMtNum()+Record.getAddMtNum()<=0){

tk.live=false;
}
}
zd.live=false;
Baozha bz=new Baozha(tk.x,tk.y);
bzjh.add(bz);
}
break;
case 2:
case 3:
if(zd.x>tk.x&&zd.xtk.y&&zd.y if(tk instanceof DiTank){//只改这就实现 判断tk是不是DiTank的实例
Record.setDtNum();//每次敌人坦克数量-1
Record.setSumDtNum();
// Record.setAddMtNum();
tk.live=false;
b2=true;
}else{
// System.out.println("Record.getMtNum()="+Record.getMtNum());
Record.setMtNum();//Record.getSumMtNum()一直小于0 ?bug
if(Record.getMtNum()+1 Record.lowAddMtNum();
}
// System.out.println("Record.getMtNum()="+Record.getMtNum());
// System.out.println("Record.AddMtNum()="+Record.getAddMtNum());
if(Record.getMtNum()+Record.getAddMtNum()>0){//bug 被打一下就游戏结束 已经解决
mt.setX(550);
mt.setY(270);
}
if(Record.getMtNum()+Record.getAddMtNum()<=0){

tk.live=false;
}
}
zd.live=false;
Baozha bz=new Baozha(tk.x,tk.y);
bzjh.add(bz);
}
break;
}
return b2;
}
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e){}
public void drawTank(int x,int y,Graphics g,int fangxiang,int leixing)//画坦克函数
{
int m=10;
//double n=1;
switch(leixing)//不同阵营坦克
{
case 0://我的坦克
g.setColor(Color.yellow);// 我的坦克颜色 黄色
// g.fillOval(170*huopao, 240*huopao, 30*huopao, 30*huopao);
m=11;
break;
case 1://敌人的坦克
g.setColor(mycolor3);//敌人坦克颜色 蓝色
// m=15;
break;
case 2://玩家2的坦克
g.setColor(mycolor1);//敌人坦克颜色 绿色
break;
}
switch(fangxiang)//不同方向的坦克(0,1,2,3)分别代表上下左右,中心原点不变做坐标变换
{
case 0://上
g.fill3DRect(x,y,5,30,true);
g.fill3DRect(x+15,y,5,30,true);
g.fill3DRect(x+5,y+5,10,20,true);
g.drawLine(x+10,y-5,x+10,(y+10));
g.setColor(Color.black);
g.fillOval(x+5,y+10,10,10);
break;
case 1://下
g.fill3DRect(x,y,5,30,true);
g.fill3DRect(x+15,y,5,30,true);
g.fill3DRect(x+5,y+5,10,20,true);
g.drawLine(x+10,y+10,x+10,(y+35));
g.setColor(Color.black);
g.fillOval(x+5,y+10,10,10);
break;
case 2://左
g.fill3DRect(x-5,y+5,30,5,true);
g.fill3DRect(x-5,y+20,30,5,true);
g.fill3DRect(x,y+10,20,10,true);
g.drawLine((x-10)+n-m,y+15,(x+10),(y+15));
g.setColor(Color.black);
g.fillOval(x+5,y+10,10,10);
break;
case 3://右
g.fill3DRect(x-5,y+5,30,5,true);
g.fill3DRect(x-5,y+20,30,5,true);
g.fill3DRect(x,y+10,20,10,true);
g.drawLine((x+10)-n+m,y+15,(x+30),(y+15));
g.setColor(Color.black);
g.fillOval(x+5,y+10,10,10);
break;
}
}
public void drawProps(int x,int y,Graphics g,int leixing)//画道具
{
if(time%8==0){
switch(leixing)
{
case 0://画车轮对应坦克加速
g.setColor(Color.white);
g.fillOval(x, y, 21, 21);
g.setColor(Color.black);
g.fillOval(x+2,y+2,16,16);
g.setColor(Color.white);
g.drawOval(x+2,y+2,16,16);
g.drawLine(x+2,y+10,x+18,y+10);
g.drawLine(x+10,y+2,x+10,y+18);
g.drawLine(x+16,y+4,x+4,y+16);
g.drawLine(x+4,y+4,x+16,y+16);
break;
case 1://画回出生地道具图标
g.setColor(Color.white);
g.drawRoundRect(x, y, 20, 20, 5, 5);
g.setColor(mycolor3);
g.fillRoundRect(x+5, y+5, 10, 10, 5, 5);
break;
case 2://画增加子弹数目道具//?
g.setColor(mycolor2);
g.fill3DRect(x-15,y+8,30,5,false);
g.fill3DRect(x-15,y+6,10,10,true);
g.fillOval(x+15,y+7,7,7);
break;
case 3://画炸弹
g.setColor(mycolor2);
g.fillRect(x, y, 21, 21);
g.setColor(Color.black);
g.fillRect(x+8,y+6,6,2);
g.fillOval(x+3,y+7,14,14);
g.drawLine(x+11, y+3, x+11, y+6);
g.setColor(Color.white);
g.drawLine(x+11, y+15, x+8, y+14);
break;
case 4://画小坦克道具
g.setColor(Color.yellow);
g.fill3DRect(x,y,20,3,true);
g.fill3DRect(x,y+10,20,3,true);
g.fill3DRect(x+3,y+3,14,7,false);
g.fillOval(x+6,y+3,7,7);
g.drawLine(x-7,y+6,x+7,y+6);
break;
}
}
}
}
}

//坦克大战: 不会做多关卡??!!
//IO声音流没做,IO流存储也有点问题,有BUG继续游戏的时候看不到爆炸一下才能看到地方坦克,
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
public class Tank1 extends JFrame implements ActionListener{
MyPanel mp=null;
StartPanel gkmp=null;
//Record record=null;
JMenuBar cd=null;//??不熟
JMenu cd1=null;//??不熟
JMenu cd2=null;
JMenuItem cd1xl1=null;//菜单栏1系列的1
JMenuItem cd1xl2=null;//菜单栏1系列的2
JMenuItem cd1xl3=null;//菜单栏1系列的1
JMenuItem cd1xl4=null;//菜单栏1系列的2

JMenuItem cd2xl1=null;//菜单栏2系列的1
JLabel imageJLabel=null;
String newGame="newGame";//?
//Image tp1=null;
public static void main(String[] args)
{
Tank1 t1=new Tank1();
}
public Tank1(){

gkmp=new StartPanel();
mp=new MyPanel(newGame);//??
Record record=new Record();//创建一个记录对象
Thread t=new Thread(gkmp);
t.start();

    cd=new JMenuBar();//菜单栏 不熟

    cd1=new JMenu("游戏(G)");//第一个菜单栏的第一个菜单 
    cd1.setMnemonic('G');//快界键

    cd2=new JMenu("设置(Z)");
    cd2.setMnemonic('Z');

    cd1xl1=new JMenuItem("开始新游戏(N)");//菜单系列 cdxl
    cd1xl1.setMnemonic('N');
    cd1xl1.addActionListener(this);//加组件监听
    cd1xl1.setActionCommand("newGame");//设置键值,和上文同名参数有啥关系没?
    cd1.add(cd1xl1);

    cd1xl2=new JMenuItem("继续游戏(H)");//菜单系列 cdxl
    cd1xl2.setMnemonic('H');
    cd1xl2.addActionListener(this);//加组件监听
    cd1xl2.setActionCommand("goonGame");//设置键值
    cd1.add(cd1xl2);

    cd1xl3=new JMenuItem("保存退出(S)");//菜单系列 cdxl
    cd1xl3.setMnemonic('S');
    cd1xl3.addActionListener(this);//加组件监听
    cd1xl3.setActionCommand("saveOut");//设置键值
    cd1.add(cd1xl3);

    cd1xl4=new JMenuItem("退出(Q)");
    cd1xl4.setMnemonic('Q');
    cd1xl4.addActionListener(this);//加组件监听
    cd1xl4.setActionCommand("exit");//设置键值
    cd1.add(cd1xl4);

    cd.add(cd1);//给菜单栏 cd 添加菜单 cd1

    cd2xl1=new JMenuItem("速度(F)");//菜单系列 cdxl 没做好效果?
    cd1xl4.setMnemonic('F');
    cd1xl4.addActionListener(this);//加组件监听
    cd1xl4.setActionCommand("FSpeed");//设置键值
    cd2.add(cd2xl1);
    cd.add(cd2);

    ImageIcon img = new ImageIcon("E:/Tank1/tankebig.PNG");
    JLabel imageJLabel = new JLabel(img);
    gkmp.add(imageJLabel);

    this.add(gkmp);
    this.setJMenuBar(cd);
    this.setTitle("坦克大战");

    ImageIcon tp1=new ImageIcon("E:/Tank1/tankexiao.PNG");//设置小图标地址要写全路径
    this.setIconImage(tp1.getImage());

    this.setSize(700,620);
    this.setLocation(300,80);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);//可见
    this.setResizable(false);//可调

// this.setResizable(true);

}
public void actionPerformed(ActionEvent e){
    //boolean flag=true;
    if(e.getActionCommand().equals("newGame"))
    {   
        this.remove(gkmp);//取消界面 gkmp
        if(mp.flag==false)//因为在主类构造函数开始就创建了mp,所以可以引用flag变量
        {
            this.remove(mp);
            mp=new MyPanel("newGame");
        }       
        this.add(mp);                       
        this.addKeyListener(mp);
        Thread t=new Thread(mp);//启动我的MyPanel模板对象mp的线程
        t.start();//叫醒线程
        this.setVisible(true);//因为默认的是不可见,必须写这个!!
        Record.bcjl();//????
    }else if(e.getActionCommand().equals("saveOut"))
    {
        Record record0=new Record();

// record0.setDtk(mp.dtk);
record0.cunpan();///??????
System.exit(0);//游戏退出

}else if(e.getActionCommand().equals("exit"))
{
Record.bcjl();
System.exit(0);//游戏退出
}else if(e.getActionCommand().equals("goonGame")){

this.remove(gkmp);
if(mp.flag==false)//因为在主类构造函数开始就创建了mp,所以可以引用flag变量
{
this.remove(mp);
mp=new MyPanel("goonGame");
}
Thread t=new Thread(mp);
t.start();
this.add(mp);
this.addKeyListener(mp);
this.setVisible(true);
}
}

class StartPanel extends JPanel implements Runnable //开始界面类
{
int time=0;
public void paint(Graphics g){
super.paint(g);

// g.fillRect(0, 0, 600, 500);//设置画布
g.setColor(Color.black);//设置颜色
Color mycolor1=new Color(250,50,0);//自定义红色
g.setFont(new Font("华文琥珀",Font.BOLD,80));//设置字体//?
g.drawString("坦克大战",190 , 460);//绘字符串
g.setColor(Color.black);//设置颜色
g.setFont(new Font("黑体",1,14));//设置字体
g.drawString("李晋祥",648 , 552);//绘字符串
if(time%2==0)
{

g.setColor(Color.white);//设置颜色
g.setFont(new Font("华文行楷",3,35));//字体:华康楷体, Ravie, OCR A Extended
g.drawString("准备战斗",270 , 345);//绘字符串

}
}
StartPanel(){
}
public void run(){
while(true){
try{
Thread.sleep(400);
}catch(Exception e){}
time++;
this.repaint();
}
}
}

class MyPanel extends JPanel implements KeyListener,Runnable
{
//Vector mts=new Vector();//建立一个我的坦克集合类可以出无限个坦克
MyTank mt=null;
MyTank mt0=null;
MyTank mt01=null;
MyTank mt02=null;
Vector dtk=new Vector();//建立一个敌坦克集合类
Props props=null;
Vector bzjh=new Vector();//创建一个爆炸类的集合
Vector wzjh=new Vector();//建立一个位置集合类,为啥建立这集合类
int tksl=3;//坦克数量
int a=122;
int b=455;
int n=10;
int myzdNum=4;//?
int propsSort=5;
int time=0;
boolean flag=true;//标记是不是已经创建过MyPanel类
boolean b1=false;
int x=1;//总关卡数?
int rocket=1;//没用?
int huopao=0;//?
Color mycolor1=new Color(250,50,0);//自定义红色
Color mycolor2=new Color(0,250,50);//自定义绿色
Color mycolor3=new Color(0,50,250);//自定义兰色
Color mycolor11=new Color(130,200,0);//自定义土黄
Color mycolor31=new Color(0,100,200);//自定义兰色
Color mycolor21=new Color(0,250,0);//自定义绿色
JLabel imageJLabel0=null;
JLabel imageJLabel1=null;
ImageIcon img0=null;//?
ImageIcon img1=null;//?
public MyPanel(String ss)
{
ImageIcon img0 = new ImageIcon("e:/Tank1/background.jpg");
JLabel imageJLabel0 = new JLabel(img0);
this.add(imageJLabel0);
Record.dqjl();//?
mt=new MyTank(600,280);//new多个可改为多个坦克,循环数组
mt0=new MyTank(550,280);//new多个可改为多个坦克,循环数组
mt01=new MyTank(550,330);//new多个可改为多个坦克,循环数组
mt02=new MyTank(600,330);//new多个可改为多个坦克,循环数组
props=new Props(30,30);//没有实际意义,为了new对象,必须要有个参数?
if(ss.equals("newGame")){
// record=new Record();
for(int i=0;i<tksl;i++){
DiTank dt=new DiTank((i)*a,b);//添加出场敌坦
// dt.dtkxl(dtk);///???是不是敌人坦克血量
dt.setFangxiang(1);//给一个初始值,调drawTank()赋初值要用
Thread t2=new Thread(dt);
t2.start();
Zidan zd=new Zidan(dt.x,dt.y,1);//?这是干啥加子弹元素吗?
Thread t3=new Thread(zd);//?
t3.start();
dtk.add(dt);
}
}else if(ss.equals("goongame")){//继续游戏有问题 感觉读取存盘信息有问题
wzjh=Record.dupan();
for(int i=0;i<wzjh.size();i++){
Weizhi wz=wzjh.get(i);
DiTank dt=new DiTank(wz.x,wz.y);//添加出场敌坦
dt.setFangxiang(wz.fangxiang);
// dt.dtkxl(dtk);//?敌坦克血量,好像暂时用不着
// dt.setFangxiang(1);//给一个初始值,调drawTank()赋初值要用
Thread t2=new Thread(dt);
t2.start();
Zidan zd=new Zidan(dt.x,dt.y,1);//?这是干啥加子弹元素吗?
Thread t3=new Thread(zd);//?
t3.start();
dtk.add(dt);
}
}
flag=false;//MyPanel类的mp创建过一次就标记为假
// this.repaint();

// Record.next();
// if(Record.next()%2!=0){
// Record.reMtNum();//需要吗?
// Record.reDtNum();//需要吗?
// Record.reAddMtNum();
// }
}
public void outNum(Graphics g)//画出统计数据的方法也即使显示数量的函数
{
g.setColor(Color.cyan);
this.drawTank(500,150,g,0,0);//引用drawtank()的不能是g,而是this
this.drawTank(570,150,g,0,1);
this.drawTank(500,70,g,0,1);

    g.setColor(Color.black);
    g.setFont(new Font("仿宋",2,20));//??换换字体效果
    g.drawString(Record.getDtNum()+"",600,170);
    if((Record.getMtNum()+Record.getAddMtNum())>=0){
        g.drawString((Record.getMtNum()+Record.getAddMtNum())+"",530,170);//
    }else{
        g.drawString((Record.getAddMtNum())+"",530,170);
    }

    g.setColor(Color.blue);
    g.setFont(new Font("方正小标宋",1,17));
    g.drawString("干掉的坦克总数:",510,40);

    g.setColor(Color.black);
    g.setFont(new Font("仿宋",2,20));
    g.drawString(Record.getSumDtNum()+"",530,90);

    g.setColor(Color.MAGENTA);//设置颜色
    g.setFont(new Font("隶书",0,20));//设置字体
    g.drawString("第"+x+"关",500 , 200);//绘字符串
}
public void paint(Graphics g){//这个方法每当窗口激活,最小化,调用repaint()方法都会运行,线程中调用就一直显示
    super.paint(g);

// g.fillRect(0,0,400,300);//做个背景画布,默认黑色
this.outNum(g);//调用显示数量的函数
g.setColor(Color.red);//设置颜色
g.fillRect(530, 210, 30, 20);
g.setColor(Color.black);//设置颜色
g.drawLine(530, 210, 530, 320);
g.setColor(mycolor11);//设置颜色
if(mt.live==true){
this.drawTank(mt.getX(),mt.getY(),g,mt.fangxiang,0);
}
if(mt0.live==true){
this.drawTank(mt0.getX(),mt0.getY(),g,mt0.fangxiang,2);
}
if(mt01.live==true){
this.drawTank(mt01.getX(),mt01.getY(),g,mt01.fangxiang,2);
}
if(mt02.live==true){
this.drawTank(mt02.getX(),mt02.getY(),g,mt02.fangxiang,2);
}
if(mt.getLive()==false){
g.setColor(mycolor11);//设置颜色
g.setFont(new Font("Gill Sans Ultra Bold Condensed",1,40));//字体:华康楷体, Ravie, OCR A Extended
g.drawString("game over...",200 , 220);//绘字符串
this.repaint();
}
if(Record.getDtNum()%6==0&&(Record.getDtNum()>10)){
// if(time%2==0)
// {

g.setColor(Color.blue);//设置颜色
g.setFont(new Font("华文行楷",1,35));//字体:华康楷体, Ravie, OCR A Extended
g.drawString("你行不行?",310 , 265);//绘字符串

// }
}
if(Record.getDtNum()==0){
g.setColor(Color.red);//设置颜色
g.setFont(new Font("华文行楷",1,35));//字体:华康楷体, Ravie, OCR A Extended
g.drawString("过关!",300 , 265);//绘字符串

}
for(int i=0;i {
DiTank dt=dtk.get(i);
if(dt.live==true){
this.drawTank(dt.getX(),dt.getY(),g,dt.fangxiang,1);//??!!注意用法用dtk 还是dt调用
}
}
for(int i=0;i {
Zidan zd=mt.aa.get(i);
if(mt.zd!=null&&mt.zd.live==true) //???画子弹的条件
{
//g.fill3DRect((mt.zd.x-2),(mt.zd.y-2), 8, 8, false); //???画子弹火力圈
g.setColor(Color.black);//子弹颜色设置为白色
g.fillOval(zd.x+1,zd.y+1, 4,4);
}
if(zd.live==false)
{
mt.aa.remove(zd);
}
}
//this.repaint();//?
for(int i=0;i {
DiTank dt=dtk.get(i);
for(int j=0;j {
Zidan zd=dt.dzd.get(j);
if(zd!=null&&dtk.get(i).live==true)
{
g.setColor(Color.red);//子弹颜色设置为红色,次处不进循环是不是更好?
g.fillOval(zd.x+1,zd.y+1, 4,4);
}
if(zd.live==false)//删除生命为假的敌人子弹????
{
dt.dzd.remove(zd);
}
}
}
for(int i=0;i {
Baozha bz=bzjh.get(i);
if(bzjh.get(i).livetime>140){
g.setColor(Color.red);
g.fillOval(bz.x, bz.y+5, 20,20 );//代替上面的句子
//g.fillOval(bz.x, bz.y, 20,5 );//可以用来做合成图形,但是要定好坐标点
}else if((bzjh.get(i).livetime<=100)&&(bzjh.get(i).livetime>50)){
g.setColor(Color.orange);
g.fillOval(bz.x+4, bz.y+9, 12,12 );
}else if((bzjh.get(i).livetime<=50)&&(bzjh.get(i).livetime>20)){
g.setColor(Color.yellow);
g.fillOval(bz.x+7, bz.y+11,5,5 );
}else{
g.setColor(Color.pink);
g.fillOval(bz.x+10, bz.y+13,2,2 );
}
bz.ltjs(); //生存时间减少函数
if(bz.livetime==0){
bzjh.remove(bz);
}
}
//
if(props.live==true){//画道具
this.drawProps(props.getX(),props.getY(),g,props.getleixing());
}
//}
this.repaint();//教学视频少了这句,子弹无法自主运行,主类启动线程后仍然可动
}
public void keyPressed(KeyEvent e)//键盘输入事件
{
if(mt.getLive()==true){
if(e.getKeyCode()==KeyEvent.VK_W){
this.mt.setFangxiang(0);
this.mt.xiangshang();
}else if(e.getKeyCode()==KeyEvent.VK_S){
this.mt.setFangxiang(1);
this.mt.xiangxia();
}else if(e.getKeyCode()==KeyEvent.VK_A){
this.mt.setFangxiang(2);
this.mt.xiangzuo();
}else if(e.getKeyCode()==KeyEvent.VK_D){
this.mt.setFangxiang(3);
this.mt.xiangyou();
}
if(e.getKeyCode()==KeyEvent.VK_J)
{
if((mt.aa.size()<myzdNum)&&(mt.live==true))//子弹设置最多 myzdNum 发
{
this.mt.fszd();//调用发射子弹函数
}
}
}
}
public void crash(){

}
public boolean addprops(Props props,MyTank mt)//吃道具触发 方法 (道具功能触发模型为边长20的正方形)
{
    boolean b2=false;
    switch(props.leixing){
    case 0://我的坦克速度提高//mt.fangxiang 0\1\2\3
        if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){
            props.live=false;
            mt.sudu=20;
            b2=true;
        }
        break;
    case 1://效果回到出生地
        if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){
            props.live=false;
            mt.setX(630);
            mt.setY(280);
            b2=true;
        }
        break;
    case 2://提高我可以发射的子弹数目
        //mt.fangxiang 0\1\2\3
        if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){
            props.live=false;
            this.myzdNum=30;
            this.huopao=1;
            this.n=4;
            b2=true;
        }
        break;
    case 3://显示的敌人坦克全死,但实际效果是..是不出敌方坦克了!!!!
        if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){
            props.live=false;
            for(int i=0;i<dtk.size();i++){
                if(dtk.get(i).live==true){
                    dtk.get(i).live=false;
                    Record.setDtNum();//有几个活坦克生命变假,就累计几辆dtNum
                }
            }
            b1=true;
            b2=true;
        }
        break;
    case 4://吃道具加命
        if((mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15<props.getY()+20&&mt.getY()+15>props.getY())||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+10>props.getX()&&mt.getX()+10<props.getX()+20&&mt.getY()+15>props.getY()&&mt.getY()+15<props.getY()+20)||(mt.getX()+15>props.getX()&&mt.getX()+15<props.getX()+20&&mt.getY()+10>props.getY()&&mt.getY()+10<props.getY()+20)){
            props.live=false;
            Record.setAddMtNum();
            b2=true;

// System.out.println("吃道具加命程序,正常运行");
}
break;
}
return b2;

}

// addMyTank++;
//MyTank mt1=new MyTank(mt.getX(),mt.getY());//??创建另一个MyTank对象
// public void setAddMytank(){
// addMyTank++;
// };
// public static int getAddMytank(){
// return addMyTank;
// };
public void run() //我的画板的 线程函数
{
while(true){
try{
Thread.sleep(50);//
}catch(Exception e){}
for(int i=0;i<mt.aa.size();i++)//我的子弹集中敌坦克的线程
{
Zidan myzd=mt.aa.get(i);

            if(myzd.live){
                for(int j=0;j<dtk.size();j++){
                    DiTank dt=dtk.get(j);
                    //  Zidan zd=dt.dzd.get(j);//为啥dzd可以直接用,不用创建//   ||(b1==true&&Record.getDtNum()>0)
                    if(dt.live)//内关联敌人坦克重生的一种情况,有敌人坦克被打中
                    {
                        if(this.jzsf(myzd,dt)&&((Record.getDtNum()-tksl)>=0)){//调用jzsf(),打中同时,坦克定点?及时重生

                                DiTank dt0=new DiTank((int)(Math.random()*50+5)*10,(int)(Math.random()*100+450));
                                Thread t2=new Thread(dt0);
                                t2.start();
                                Zidan zd0=new Zidan(dt0.x,dt0.y,dt0.fangxiang);
                                Thread t3=new Thread(zd0);
                                t3.start();
                                dt0.dzd.add(zd0);
                                dtk.add(dt0);

                        }
                    }
                }
            }
        }

            if(Record.getDtNum()>=tksl&&b1==true){ //炸弹爆炸,敌坦克按条件重生,
                for(int i=0;i<tksl;i++){
                    DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450));
                    Thread t6=new Thread(dt1);
                    t6.start();
                    Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang);
                    Thread t7=new Thread(zd1);
                    t7.start();
                    dt1.dzd.add(zd1);
                    dtk.add(dt1);
                }
                b1=false;
            }
            if((Record.getDtNum()==(tksl-1))&&(b1==true)){
                for(int i=0;i<tksl-1;i++){
                    DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450));
                    Thread t6=new Thread(dt1);
                    t6.start();
                    Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang);
                    Thread t7=new Thread(zd1);
                    t7.start();
                    dt1.dzd.add(zd1);
                    dtk.add(dt1);
                    }
                b1=false;
            }
            if((Record.getDtNum()==(tksl-2))&&(b1==true)){

// for(int i=0;i DiTank dt1=new DiTank((int)(Math.random()*20)*10,(int)(Math.random()*100+450));
Thread t6=new Thread(dt1);
t6.start();
Zidan zd1=new Zidan(dt1.x,dt1.y,dt1.fangxiang);
Thread t7=new Thread(zd1);
t7.start();
dt1.dzd.add(zd1);
dtk.add(dt1);
b1=false;
}
for(int j=0;j {
DiTank dt=dtk.get(j);//取出所有敌方坦克
for(int i=0;i {
Zidan zd=dt.dzd.get(i);//?
if(zd.live)
{
if(this.jzsf(zd,mt)==true){//调用 击中敌坦 函数
}
}
}
}
if((this.time%120)==0){//6秒发生1次 道具随机重置//draw mt hit props
props.live=true;
// props.leixing=2;
props.leixing=(int)(Math.random()*propsSort);
props.x=(int)(Math.random()*370);
props.y=(int)(Math.random()*270);
props.livetime=100;//道具生存期
}
if(props.livetime>0){//道具生存期变化
props.livetime--;
}else{
props.live=false;
}
if(mt.live==true&&props.live==true){//调用 吃道具 方法
this.addprops(props,mt);
}
time++;
// if(SaveData.getSumDtNum()%20==0){
// Record.next();
// }
this.repaint();//线程运行中重绘??
}
}
public void jzwf()//敌人子弹集中我方坦克的方法
{
for(int i=0;i<this.dtk.size();i++){
DiTank dt=dtk.get(i);
for(int j=0;j<dt.dzd.size();j++){
Zidan zd=dt.dzd.get(j);
this.jzsf(zd, mt);
}
}
}

public void jzdf() //我的子弹击中坦克的方法
{
for(int i=0;i<mt.aa.size();i++){
Zidan zd=mt.aa.get(i);//从我的子弹集合类取我的各个子弹
if(zd.live==true){
for(int j=0;j<dtk.size();j++){
DiTank dt=dtk.get(j);//从敌坦克集合类取出各个敌坦克
if(dt.live){
this.jzsf(zd,dt);
// levelDtNum--;
}
}
}
this.repaint();
}

}
public boolean jzsf(Zidan zd,Tank tk)//击中双方的方法
{
    boolean b2=false;
    switch(tk.fangxiang)
    {
    case 0:
    case 1:
        if(zd.x>tk.x&&zd.x<tk.x+20&&zd.y>tk.y&&zd.y<tk.y+30)//分辨率判断?
        {

            if(tk instanceof DiTank){//只改这就实现 判断tk是不是DiTank的实例
                Record.setDtNum();
                Record.setSumDtNum();

// Record.setAddMtNum();
tk.live=false;

b2=true;
}else{
// System.out.println("Record.getMtNum()="+Record.getMtNum());
Record.setMtNum();//Record.getSumMtNum()一直小于0 ?bug
if(Record.getMtNum()+1<=0){
Record.lowAddMtNum();
}
// System.out.println("Record.getMtNum()="+Record.getMtNum());
// System.out.println("Record.AddMtNum()="+Record.getAddMtNum());
if(Record.getMtNum()+Record.getAddMtNum()>0){//bug 被打一下就游戏结束 已经解决
mt.setX(140);
mt.setY(232);
}
if(Record.getMtNum()+Record.getAddMtNum()<=0){

tk.live=false;
}
}
zd.live=false;
Baozha bz=new Baozha(tk.x,tk.y);
bzjh.add(bz);
}
break;
case 2:
case 3:
if(zd.x>tk.x&&zd.xtk.y&&zd.y if(tk instanceof DiTank){//只改这就实现 判断tk是不是DiTank的实例
Record.setDtNum();//每次敌人坦克数量-1
Record.setSumDtNum();
// Record.setAddMtNum();
tk.live=false;
b2=true;
}else{
// System.out.println("Record.getMtNum()="+Record.getMtNum());
Record.setMtNum();//Record.getSumMtNum()一直小于0 ?bug
if(Record.getMtNum()+1 Record.lowAddMtNum();
}
// System.out.println("Record.getMtNum()="+Record.getMtNum());
// System.out.println("Record.AddMtNum()="+Record.getAddMtNum());
if(Record.getMtNum()+Record.getAddMtNum()>0){//bug 被打一下就游戏结束 已经解决
mt.setX(550);
mt.setY(270);
}
if(Record.getMtNum()+Record.getAddMtNum()<=0){

tk.live=false;
}
}
zd.live=false;
Baozha bz=new Baozha(tk.x,tk.y);
bzjh.add(bz);
}
break;
}
return b2;
}
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e){}
public void drawTank(int x,int y,Graphics g,int fangxiang,int leixing)//画坦克函数
{
int m=10;
//double n=1;
switch(leixing)//不同阵营坦克
{
case 0://我的坦克
g.setColor(Color.yellow);// 我的坦克颜色 黄色
// g.fillOval(170*huopao, 240*huopao, 30*huopao, 30*huopao);
m=11;
break;
case 1://敌人的坦克
g.setColor(mycolor3);//敌人坦克颜色 蓝色
// m=15;
break;
case 2://玩家2的坦克
g.setColor(mycolor1);//敌人坦克颜色 绿色
break;
}
switch(fangxiang)//不同方向的坦克(0,1,2,3)分别代表上下左右,中心原点不变做坐标变换
{
case 0://上
g.fill3DRect(x,y,5,30,true);
g.fill3DRect(x+15,y,5,30,true);
g.fill3DRect(x+5,y+5,10,20,true);
g.drawLine(x+10,y-5,x+10,(y+10));
g.setColor(Color.black);
g.fillOval(x+5,y+10,10,10);
break;
case 1://下
g.fill3DRect(x,y,5,30,true);
g.fill3DRect(x+15,y,5,30,true);
g.fill3DRect(x+5,y+5,10,20,true);
g.drawLine(x+10,y+10,x+10,(y+35));
g.setColor(Color.black);
g.fillOval(x+5,y+10,10,10);
break;
case 2://左
g.fill3DRect(x-5,y+5,30,5,true);
g.fill3DRect(x-5,y+20,30,5,true);
g.fill3DRect(x,y+10,20,10,true);
g.drawLine((x-10)+n-m,y+15,(x+10),(y+15));
g.setColor(Color.black);
g.fillOval(x+5,y+10,10,10);
break;
case 3://右
g.fill3DRect(x-5,y+5,30,5,true);
g.fill3DRect(x-5,y+20,30,5,true);
g.fill3DRect(x,y+10,20,10,true);
g.drawLine((x+10)-n+m,y+15,(x+30),(y+15));
g.setColor(Color.black);
g.fillOval(x+5,y+10,10,10);
break;
}
}
public void drawProps(int x,int y,Graphics g,int leixing)//画道具
{
if(time%8==0){
switch(leixing)
{
case 0://画车轮对应坦克加速
g.setColor(Color.white);
g.fillOval(x, y, 21, 21);
g.setColor(Color.black);
g.fillOval(x+2,y+2,16,16);
g.setColor(Color.white);
g.drawOval(x+2,y+2,16,16);
g.drawLine(x+2,y+10,x+18,y+10);
g.drawLine(x+10,y+2,x+10,y+18);
g.drawLine(x+16,y+4,x+4,y+16);
g.drawLine(x+4,y+4,x+16,y+16);
break;
case 1://画回出生地道具图标
g.setColor(Color.white);
g.drawRoundRect(x, y, 20, 20, 5, 5);
g.setColor(mycolor3);
g.fillRoundRect(x+5, y+5, 10, 10, 5, 5);
break;
case 2://画增加子弹数目道具//?
g.setColor(mycolor2);
g.fill3DRect(x-15,y+8,30,5,false);
g.fill3DRect(x-15,y+6,10,10,true);
g.fillOval(x+15,y+7,7,7);
break;
case 3://画炸弹
g.setColor(mycolor2);
g.fillRect(x, y, 21, 21);
g.setColor(Color.black);
g.fillRect(x+8,y+6,6,2);
g.fillOval(x+3,y+7,14,14);
g.drawLine(x+11, y+3, x+11, y+6);
g.setColor(Color.white);
g.drawLine(x+11, y+15, x+8, y+14);
break;
case 4://画小坦克道具
g.setColor(Color.yellow);
g.fill3DRect(x,y,20,3,true);
g.fill3DRect(x,y+10,20,3,true);
g.fill3DRect(x+3,y+3,14,7,false);
g.fillOval(x+6,y+3,7,7);
g.drawLine(x-7,y+6,x+7,y+6);
break;
}
}
}
}
}

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于使用JAVA实现坦克大战练习后的感想
首先,基础!基础!基础!用的全部都是基础的知识,只是连接了起来! 然后,思想!思想!思想!编程的思想一定要锻炼出来! 再就是,细节!细节!细节!很多语句及各种类/接口/枚举等使用上的细节务必注意!!!      只是做了一个Demo,因为生疏了,花了一天时间,想想就很气,尤其气自己平时的小聪明. The specification of Class/Interface  and method...
《Java小游戏实现》:坦克大战(最后一点附加功能的实现)
《Java小游戏实现》:坦克大战(最后一点附加功能的实现)相关博文《Java小游戏实现》:坦克大战http://blog.csdn.net/u010412719/article/details/51712663《Java小游戏实现》:坦克大战(续一):http://blog.csdn.net/u010412719/article/details/51723570《Java小游戏实现》:坦克大战(续二
HTML5 坦克大战游戏的制作思路
BattleCity(坦克大战) github地址 在线试玩(使用ES6完成,浏览器版本过低无法打开) 整个游戏为我个人独立完成,基本上复原了85版的游戏,因为一开始写这个游戏的时候说实话连canvas都不懂,一直都是边学边改的状态,所以花费了二十来天的时间才写好。现在回过头再去看这个游戏其实并不算多么的复杂,一些基本的问题处理好就行——这也是这篇文章所想要说明的东西。如果有同学也想要自己写一
java坦克大战游戏
3年前的一个秋天,我用java开发的一个经典小游戏 --坦克大战 。 (满满的儿时回忆呀有木有~~,突然想起十几年前,我们手里爱玩的小霸王红白机,魂斗罗、双截棍、唐老鸭、小蜜蜂等等,小伙伴们每天都能玩到天黑~~~) 该项目已经在github上开源了  github地址: https://github.com/jellyflu/tankwar  晒几张美图 ~~ 开始运行。  ...
java实现的坦克大战
《Java实现的坦克大战》 一.程序基本结构 二.实现的功能 1、单人模式 2、双人模式 3、通过深度优先算法实现的AI坦克寻路功能 4、局域网联机(半成品,以后补坑) 三.运行效果 四.遇到的问题 1.java的按键监听在响应按键长按时会有1-2秒的延迟,导致操作手感极差 解决方法:在坦克类中设置一个布尔属性以及整形变量储存键入的按键值,创建一个线程来响应按键 实
java制作简单的坦克大战
坦克大战是我们小时候玩红白机时代的经典游戏,看到有不少小伙伴都使用各种语言实现了一下,手痒痒,也使用java做的一个比较简单的坦克大战,主要面向于学过Java的人群,与学了一段时间的人,有利于面向对象思想的提高,推荐给大家。 详情请参照注释,这里就不多废话了,实现一下儿时的经典而已。 Blood.java ? 1 2 3 4 5 6 7 8
Java实现坦克大战【升级版】
笔者去各地打了一圈酱油,又忙一些离职换房子的事情,
JAVA实现坦克大战(八个方向移动,根据难度改变地图、玩家自定义地图)
心血来潮练练技术用Java编写了一个简单的坦克大战,实现单人攻关模式和双人对战模式。   游戏操作实现的主要功能有: 单人攻关模式: 1.玩家坦克可以上下左右、左上、左下、右上、右下八个方向移动。 2.击中坦克时,敌方坦克立即消失(玩家坦克掉血),显示爆炸效果,子弹击中鹰碉堡时,游戏结束,子弹击中墙壁时,子弹消失 3.移动过程中坦克与坦克,坦克与草地、河流、墙壁会根据实际通过或停止。 ...
坦克大战Java源码
一个用Java技术开发的坦克大战项目,喜欢的人可以下载玩一下
基于Java坦克大战小游戏设计 (2)
接下来继续完善element下物体类,以及添加有关整体游戏进程、配置、绘画相关的类。 game包:GameRunThread线程用来开始并处理游戏运行中出现的各种事件,继承thread类。 public void run() { // TODO Auto-generated method stub while(true) { try { Thread.sleep(G...
【Java_项目篇<1>】--JAVA实现坦克大战游戏--总结(七)
前期相关文章【Java_项目篇<1>】–JAVA实现坦克大战游戏–画出坦克(一) 【Java_项目篇<1>】–JAVA实现坦克大战游戏–坦克移动+添加敌方坦克(二) 【Java_项目篇<1>】–JAVA实现坦克大战游戏–坦克发射子弹(三) 【Java_项目篇<1>】–JAVA实现坦克大战游戏–子弹连发+爆炸效果(四) 【Java_项目篇<1>】–JAVA实现坦克大战游戏–赋予敌人行动和攻
基于java的坦克大战实例
原创性声明 此博文的出处 为 http://blog.csdn.net/zhujunxxxxx/article/details/39251241如果进行转载请注明出处。本文作者原创,邮箱zhujunxxxxx@163.com,如有问题请联系作者
Java坦克大战游戏源码解析 带声音 带道具 带地图编辑器
前段时间闲来无事,自己用Java语言仿照着FC版本的坦克大战自己实现了一个,希望给初学者,想用用java做桌面游戏的童鞋们一些参考,本游戏纯Java语言开发(原生Java),没有使用任何的游戏引擎, 演示视频地址:https://www.bilibili.com/video/av21952686/?p=2(部分完成版) 演示视频地址:https://www.bilibili.com/video...
java项目之——坦克大战26
本版本做最后的修正:敌人死光重新加入,主战坦克死掉F2重新开始。 1.主类中: 画方法里面判断,如果无敌方坦克,就添加。 if(tanks.size()<=0){ for(int i=0;i<10;i++){ tanks.add(new Tank(50+40*(i+1),50,false,Tank.Direction.D,this)); } } 2.坦克类中:
坦克大战,地图编辑
using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Collections.Generic; public class MapEditorUI : MonoBehaviour {     public static MapEditorUI instance;     /
坦克大战实现
先将常用的函数与头文件,宏定义等写到一个公共类中 #ifndef __Common_H__ #define __Common_H__ #include "cocos2d.h" #include "SimpleAudioEngine.h" #include "cocos-ext.h" USING_NS_CC; USING_NS_CC_EXT;#define winSize CCDirector:
C语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战
语言多关卡推箱子,兄台了解一下?没错,C语言完整简单项目实战C语言源代码计划2018.7.2我要分享很高兴你能光临小编寒舍 今天的菜是下面这道首先感谢百忙之中你能从万千文章中点小编得专属页面。这不是娱乐篇,这是学习道场。开始前,小编就做一个简单得自我介绍:(开启装逼模式)我就是传说中写文章通俗而不庸俗,说话风流而不下流,智慧与美貌并重,英雄与侠义得化身得小编老师。人间人爱,花见花开已不足以形容我得...
FC坦克大战原版整套图片(更新)
绝对原版,网上其他地方很难找得到了,供各种平台游戏程序练笔 不好意思上一次的上传出了问题,下这个
坦克大战,带自定义地图,各种道具生成
代码简单易懂,基于swing界面生成,适合新手 JAVA语言基础,JAVA语言数据结构和算法,JAVA图形SWING界面及监听
<坦克大战Java>开发中遇到的问题
01_编程方法问题 螺旋增加式:从0到1,不要急 脚踏实地: 不求快,只求能编出想要的结果,多打印,多显示 02_子弹发射数量问题 如果只是在fire方法中new一个missle,则玩来玩去只是一枚导弹 我们这时需要用容器。 在Yard类属性中添加一个ArrayList导弹链表,然后在paint重写方法中将其遍历,画出每一个missle对象 当然,我们也要在Tank方法中调用
java学习笔记-窗口绘图(坦克大战)
坦克大战,金典小霸王游戏。 主框架的搭建,,刚开始使用的是awt下的类来创建窗口,但在图片刷新的时候会卡,不知道怎么解决,然后就换了swing.Jframe来进行创建. AWT 是抽象窗口组件工具包,是 java 最早的用于编写图形节目应用程序的开发包,提供了一套与本地图形界面进行交互的接口,利用 AWT 来构件图形用户界面的时候,我们实际
JAVA实现经典坦克大战及源代码下载
一、简单介绍         这是一个功能相对全的JAVA版坦克大战,界面绘制是通过JAVA的图形化用户界面完成的,包括了菜单界面和游戏界面。其中菜单界面可以供玩家选择重新开始游戏、暂停、继续、是否播放背景音乐、帮助等操作;游戏界面绘制了坦克、河流、草地、鹰碉堡等经典坦克场景,玩家在游戏界面操作坦克开始对战。          本游戏使用的主要技术有Swing编程、面向对象编程、多线程编程。本...
Java开发的游戏之三 坦克大战 完整源代码
截图: 代码过长不在此贴出,所有的代码都打包在以下链接中压缩包里,包括背景图片。 源代码下载链接: http://download.csdn.net/detail/destiny19960207/9763751
C语言编写的坦克大战exe小游戏
C语言编写的坦克大战exe小游戏! (含有部分C++函数,不过不需要知道实现细节,主要用于键盘读取等) 适合初学者学习的坦克大战代码,无图片,游戏全部功能画面显示全部由 printf 打印的哦! C++视频跟笔记都是全网最新最全的,加群玖四捌,玖伍四,四捌四 C语言/C艹编程入门经典小游戏坦克大战! C语言/C艹编程入门经典小游戏坦克大战! game.h下的代码 #ifndef GAME #...
C#面向对象简单坦克大战(创意)
GIthub地址 TankDemo介绍 一个c#简单桌面应用(游戏)。 基本上实现了坦克大战的相应功能。 参考最下方的截图 特点 支持用户登录注册,保存成绩,成绩排名。(然并….) 关卡无限!因为一个个地做地图太麻烦了,不如随机生成地图…(参考下面截图) 迷雾模式!迷雾模式下视野有限,增加游戏难度…(会吗?) 敌人移动速度,发弹频率随着关卡变化提高….. 没了… 精简版 提供精简版下载,请进入bra
java视频 坦克大战制作
学习一门编程语言入门,什么方法比较快,那肯定是跟着老师一起来找一个项目入手了,下面是java  坦克大战制作视频链接地址,该视频报包裹了本地版坦克大战,局域网版坦克大战,网络版坦克大战,有需求的同学可以自行下载。 下面是视频的下载地址(百度云): 链接: http://pan.baidu.com/s/1qWTlKN6 密码: c2ai
java &坦克大战&有血杠,全方位攻击
java &坦克大战&有血杠(不至于一弹就死),很简单的JavaSE编写,坦克有血条,全方位攻击,单向攻击,如同开挂般豪爽。
Python小白求助大神
在做分布式进程时,创建服务进程与任务进程时,调试时总是出现10061错误。求大神解决 此为taskWorker.py   此为taskManager.py
超级坦克大战1990 - 坦克大战超难版
【简介】 还记得小时玩的坦克大战1990吗,《坦克大战超难版》在优化其普通模式的基础上,加入了更加刺激、更加困难的挑战模式,各种超难的关卡等着你来挑战! 【下载地址】 ios: android: 【游戏截图】 【游戏视频】 普通模式: 挑战模式: 【游戏介绍】 ·普通模式 在坦克大战1990的基础上,优化了摇杆控制及渲染效率,使玩家操作及游
【Java_项目篇<1>】--JAVA实现坦克大战游戏--坦克移动+添加敌方坦克(二)
控制小球移动 1.外部类 实现KeyListener监听接口 package com.test3; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing
基于Java坦克大战小游戏设计(3)
剩下的东西也就那样了,具体关卡的设置什么的也交给配置文件.pro来完成。 主要有一个读取配置文件的方法要注意,这个方法具体还没有去研究,估计也就是普通读文件那样来实现的吧。 public static Properties getProperties(String url) { InputStream in = GameStartUtil.class.getResourceAsStrea...
java [25] 图形化 坦克项目 同时生成多个敌方坦克
member : package tank1; //坦克类 class Tank{ //坦克的横坐标 int x =0; //坦克的纵坐标 int y =0; //坦克方向 //0表示上,1表示右,2表示下,3表示左 //坦克速度; int speed = 10; int color = 0; public int getColor() { ret...
Java课程设计 坦克大战 (源代码和实验报告)
目录 摘要 1 一、 概要设计 2 1.1 游戏规则 2 1.2 游戏界面和操作方式 2 1.3 程序的主要运行过程 2 1.4 本程序需要解决的有关技术问题 2 二、 系统详细设计 3 2.1构建游戏主类TankClient 3 2.2构建坦克类Tank 3 2.3添加炮弹Missile类 5 2.4实现坦克的互相攻击 5 2.4.1让主战打出炮弹 5 2.4.2实现坦克的互相开火 6 2.4.3添加多辆坦克 6 2.4.4让坦克更加智能 7 2.5创建Explode类 8 2.6添加药箱BloodBox 8 2.7添加Home 9 2.8 添加障碍物 9 2.8.1 添加金属墙 9 2.8.2 添加普通墙 10 2.8.3 添加河水 10 2.9添加树林 10 3.0加入图片替换主窗口中的各对象 10 三 游戏最终运行界面 11 四 总结 11 五 参考文献 12
【Java_项目篇<1>】--JAVA实现坦克大战游戏--修改BUG防止坦克重叠(六)
前期相关文章【Java_项目篇<1>】–JAVA实现坦克大战游戏–画出坦克(一) 【Java_项目篇<1>】–JAVA实现坦克大战游戏–坦克移动+添加敌方坦克(二) 【Java_项目篇<1>】–JAVA实现坦克大战游戏–坦克发射子弹(三) 【Java_项目篇<1>】–JAVA实现坦克大战游戏–子弹连发+爆炸效果(四) 【Java_项目篇<1>】–JAVA实现坦克大战游戏–赋予敌人行动和攻
用html语言做坦克大战
我的博客 给大家揭秘一下坦克大战是怎么做的吧,只有一部分!!看到文章底下!! 1、把这段代码复制到index.html中; 坦克大战主界面 body{ background:#cce8cf; margin-top: 5%; } $(function(){ var i=0; //用于判断音乐符号的标志 $("#music").c
QT(C++)游戏之坦克大战(一)
前言 坦克大战算是我们90后童年时的经典游戏了,当时是那种插卡游戏机。每次星期天,我都会玩游戏机,真的是童年的回忆了。我当时玩的是1990版坦克大战,如今学了QT,就想着实现一个我的坦克大战,致敬我的童年时光。 先上一幅图片: 实现 ...
坦克大战(基于java线程)
坦克大战(基于java线程)坦克大战是继五子棋后的新项目,基于java的图形化界面以及多线程来实现,主要是锻炼javaSE的基本能力
Java学习总结之坦克大战项目(完结版)
V1.0:
贴图技术入门——坦克大战地图
前天博客中用C语言写了个没有贴图的打字母小游戏,提及到贴图技术,那么今天的主题就是贴图技术入门级。 今天就以坦克大战地图为例,开启游戏贴图之旅。。。
pygame多关卡小游戏命悬一线之勇闯太空隧道_作者:李兴球_mask碰撞实例
import pygamefrom pygame.locals import *gamename = &quot;《命悬一线之勇闯太空隧道》&quot;pygame.init()pygame.mixer.init()screenWidth ,screenHeight=480,360screen = pygame.display.set_mode((screenWidth,screenHeight))pygame.di...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 坦克大战·java课程 坦克大战java课程设计