坦克大战,咋做下一关
//坦克大战:-换关卡,IO声音流没做,还有写BUG,没做完 ,本人纯外行自学的,不知道怎么做下一关,请大家指导一下,比一般坦克大战加了小道具
包1如下:
Tank1
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);//调用显示数量的函数