java实现的坦克⼤战(整理代码)本科做的⼩项⽬,现在整理⼀下:
package T1;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.util.Vector;
//1
public class Tank1 extends JFrame implements ActionListener{//1
MyPanel mp=null;
GuankaPanel gkmp=null;
JMenuBar cdl=null;
JMenu cd1=null;
JMenuItem cdxl=null;
public static void main(String[] args) {
Tank1 t1=new Tank1();
}
public Tank1(){
//  mp=new MyPanel();
//
//  this.add(mp);
//  //9,事件响应写完后,必须添加⼀个监听,否则坦克是动不起来的
/
/  this.addKeyListener(mp);
//  Thread t=new Thread(mp);//⼦弹可以⾃⼰运动,⽽不是随着坦克运动
//  t.start();
cdl=new JMenuBar();
cd1=new JMenu("游戏(G)");
cd1.setMnemonic('G');
cdxl=new JMenuItem("新游戏(N)");
cdxl.addActionListener(this);
cdxl.setActionCommand("xyx");
cd1.add(cdxl);
cdl.add(cd1);
gkmp=new GuankaPanel();
Thread t=new Thread(gkmp);
t.start();
this.setJMenuBar(cdl);
this.add(gkmp);
this.setTitle("坦克⼤战");
this.setSize(600, 500);
this.setLocation(300, 280);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
ActionCommand().equals("xyx")) {
this.add(mp);
//9,事件响应写完后,必须添加⼀个监听,否则坦克是动不起来的
this.addKeyListener(mp);
Thread t=new Thread(mp);//⼦弹可以⾃⼰运动,⽽不是随着坦克运动
t.start();
this.setVisible(true);
}
}
}
class  GuankaPanel extends JPanel implements Runnable{
int times=0;
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, 400, 300);
if(times%2==0) {
g.setColor(Color.YELLOW);
Font myFont=new Font("华⽂⾏楷",Font.BOLD,38);
g.setFont(myFont);
g.drawString("第⼀关", 140, 140);
}
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
try {
Thread.sleep(600);
}catch(Exception e) {}
times++;
}
}
}
class MyPanel extends JPanel implements KeyListener,Runnable{//4
MyTank mt=null;
Vector<DiTank> dtk=new Vector<DiTank>();
//下⼀⾏⼦弹击中爆炸的diamagnetic
//Vector<Baozha> bzjh=new Vector<Baozha>();
//这个集合类只能放敌⽅坦克,所以⽤了泛型,避免强转
/
/敌⽅坦克是要编成坦克组的,所以需要集合类,Vector和ArrayList类似,但是ArrayList是单线程的 //全部由⽤户可控制⽤单线程ArrayList,随机性⽤多线程Vector
int tksl=3;
//下三⾏⼦弹击中爆炸的代码
// Image tp1=null;
// Image tp2=null;
// Image tp3=null;
//MyTank mt1=null;可以画第⼆个坦克,3,4,5,6,
public MyPanel() {
mt=new MyTank(140,232);
for(int i=0;i<tksl;i++) {
Thread t2=new Thread(dt);
t2.start();
Zidan zd=new Zidan(dt.x+10,dt.y+30,2);
dt.dzd.add(zd);简单的java游戏代码
Thread t3=new Thread(zd);
t3.start();
dtk.add(dt);//不是太懂
}
//下三⾏⼦弹击中爆炸的代码
//  DefaultToolkit().getImage(Resource("/tank1.jpg"));
//  DefaultToolkit().getImage(Resource("/tank2.jpg"));
//  DefaultToolkit().getImage(Resource("/tank3.jpg"));
/
/再画⼀个坦克
//mt1=new MyTank(300,100);
}
public void tjsj(Graphics g) {
this.drawTank(80, 330, g, 0, 0);
g.setColor(Color.black);
g.Mtsl()+"", 116, 350);//整型数据再后⾯加上双引号以后,会把正i选哪个数据转换成字符串  this.drawTank(150, 330, g, 0, 1);
g.setColor(Color.black);
g.Dtsl()+"", 186, 350);
}
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, 400, 300);
this.tjsj(g);
//绘制画布,因为默认主界⾯是⽩⾊的,所以需要绘制填充矩形,填充矩形默认是⿊⾊
//g.setColor(Color.YELLOW);
//g.X(), mt.getY(), 5, 30, false);//坦克左边的⼀个矩形
//g.X()+15, mt.getY(), 5, 30, false);//坦克最右边的那个矩形
//g.X()+5, mt.getY()+5, 10, 20, false);//坦克中间的⼩矩形
//g.X()+5, mt.getY()+10, 10, 10);//坦克中间的椭圆
//g.X()+10, mt.getY()+15, mt.getX()+10, mt.getY()-3);
//为了程序的扩展性,将画tank的函数单独出来
if(mt.shengming) {
this.X(),mt.getY(),g,mt.fangxiang,0);//坦克的⽅向问题只需要在此传进去mt.fangxiang即可  }
//this.X(),Y(),g,0,1);
//绘制敌⽅坦克
for(int i=0;i<dtk.size();i++) {
DiTank (i);//⾃⼰编的
if(dt.shengming) {
this.X(), dt.getY(), g, dt.fangxiang,1);
for(int j=0;j<dt.dzd.size();j++) {
Zidan dtzd=(j);
if(dtzd.shengming) {
g.setColor(Color.white);
g.fill3DRect(dtzd.x, dtzd.y, 5, 5,false);
}else {
ve(dtzd);
}
}
for(int i=0;i<mt.aa.size();i++) {//为了解决只能发射⼀个⼦弹的问题
Zidan zd=(i);
if(zd!=null&&zd.shengming==true) {//这个⼦弹不⽤mt.zd,直接⽤for循环⾥⾯的⼦弹
g.setColor(Color.RED);
g.fill3DRect(zd.x, zd.y, 5, 5, false);
}
if(zd.shengming==false){
ve(zd);
}
}
//⼦弹击中时爆炸的代码
//  for(int i=0;i<bzjh.size();i++)
//  {
//  Baozha (i);
//  if(bz.shengcunqi>6)
//  {
/
/    g.drawImage(tp1, bz.x, bz.y, 30, 30, this);
//
//  }else if(bz.shengcunqi>3)
//  {
//    g.drawImage(tp2, bz.x, bz.y, 30,30, this);
//
//  }else {
//    g.drawImage(tp3, bz.x, bz.y, 30, 30, this);
//  }
//  bz.suqsd();
//  if(bz.shengcunqi==0) {
/
/    ve(bz);
//
//  }
//
//  }
}
public void jzwf() {
for(int i=0;i<this.dtk.size();i++) {//敌⽅的坦克⼀个⼀个取出来
DiTank (i);
for(int j=0;j<dt.dzd.size();j++) {//敌⽅的⼦弹⼀个⼀个取出来
Zidan zd=(j);
this.jzdf(zd, mt);//⼦弹和我⽅的坦克
}
}
}
public void jzdf1() {
for(int i=0;i<mt.aa.size();i++) {//每取出⼀颗⼦弹
Zidan zd=(i);
if(zd.shengming) {//如果有⼦弹的话
for(int j=0;j<dtk.size();j++) {//每取出⼀个敌⼈的坦克,就是让我⽅所有的⼦弹何敌⽅所有的坦克进⾏⽐较    DiTank (j);
if(dt.shengming) {
this.jzdf(zd, dt);
}
}
private void jzdf(Zidan zd, Tank dt) {//必须放在MyPanel类中,因为如果没击中需要重绘  // TODO Auto-generated method stub
switch(dt.fangxiang) {
//上和下是⼀样的
case 0:
case 2:
if(zd.x>dt.x && zd.x<dt.x+20 && zd.y>dt.y && zd.y<dt.y+30) {
zd.shengming=false;
dt.shengming=false;
Jilu.dtjs();
//    Baozha bz=new Baozha(dt.x,dt.y);
//    bzjh.add(bz);
}
break;
case 1:
case 3:
if(zd.x>dt.x && zd.x<dt.x+30 && zd.y>dt.y && zd.y<dt.y+20) {
zd.shengming=false;
dt.shengming=false;
Jilu.dtjs();
}
}
}
public void drawTank(int x,int y,Graphics g,int fangxiang,int leixing) {//5
//参数中必须传⼀个画笔进来
switch(leixing){
case 0://我的坦克
g.setColor(Color.YELLOW);
break;
case 1://敌⼈的坦克
g.setColor(Color.GREEN);
break;
}
switch(fangxiang) {
case 0://上
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+5,y+10, 10, 10);
g.drawLine(x+10, y+15, x+10, y-3);
break;
case 1://左
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-3,y+10);
break;
case 2://下
g.fill3DRect(x, y, 5, 30, false);
g.fill3DRect(x+15, y, 5, 30, false);
g.fill3DRect(x+5, y+5, 10,20, false);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。