java实现的坦克大战(整理代码)

2023-11-06

本科做的小项目,现在整理一下: 

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
		if(e.getActionCommand().equals("xyx")) {
			
			mp=new MyPanel();
			this.remove(gkmp);//删除旧面板
			
			
			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++;
			this.repaint();
			
			
		}
		
	}
	
}
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++) {
			
			DiTank dt=new DiTank((i)*55+5,0);
			dt.setFangxiang(2);
			//下两行时为了敌人的坦克随机动而添加的代码,画出一辆坦克,启动一个线程,画出一辆,启动一个线程
			Thread t2=new Thread(dt);
			t2.start();
			
			Zidan zd=new Zidan(dt.x+10,dt.y+30,2); 
			dt.dzd.add(zd);
			Thread t3=new Thread(zd);
			t3.start();
			
			dtk.add(dt);//不是太懂
			
		}
		//下三行子弹击中爆炸的代码
//		tp1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/tank1.jpg"));
//		tp2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/tank2.jpg"));
//		tp3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/tank3.jpg"));
		
		//再画一个坦克
		//mt1=new MyTank(300,100);
	}
	public void tjsj(Graphics g) {
		this.drawTank(80, 330, g, 0, 0);
		g.setColor(Color.black);
		g.drawString(Jilu.getMtsl()+"", 116, 350);//整型数据再后面加上双引号以后,会把正i选哪个数据转换成字符串
		this.drawTank(150, 330, g, 0, 1);
		g.setColor(Color.black);
		g.drawString(Jilu.getDtsl()+"", 186, 350);
		
	}
	public void paint(Graphics g) {
		super.paint(g);
		g.fillRect(0, 0, 400, 300);
		this.tjsj(g);
		//绘制画布,因为默认主界面是白色的,所以需要绘制填充矩形,填充矩形默认是黑色
		//g.setColor(Color.YELLOW);
		//g.fill3DRect(mt.getX(), mt.getY(), 5, 30, false);//坦克左边的一个矩形
		//g.fill3DRect(mt.getX()+15, mt.getY(), 5, 30, false);//坦克最右边的那个矩形
		//g.fill3DRect(mt.getX()+5, mt.getY()+5, 10, 20, false);//坦克中间的小矩形
		//g.fillOval(mt.getX()+5, mt.getY()+10, 10, 10);//坦克中间的椭圆
		//g.drawLine(mt.getX()+10, mt.getY()+15, mt.getX()+10, mt.getY()-3);
		//为了程序的扩展性,将画tank的函数单独出来
		if(mt.shengming) {
			this.drawTank(mt.getX(),mt.getY(),g,mt.fangxiang,0);//坦克的方向问题只需要在此传进去mt.fangxiang即可
		}
		
		
		//this.drawTank(mt1.getX(),mt1.getY(),g,0,1);	
		//绘制敌方坦克
		for(int i=0;i<dtk.size();i++) {
			DiTank dt=dtk.get(i);//自己编的
			if(dt.shengming) {
			this.drawTank(dt.getX(), dt.getY(), g, dt.fangxiang,1);
			for(int j=0;j<dt.dzd.size();j++) {
				Zidan dtzd=dt.dzd.get(j);
				if(dtzd.shengming) {
					g.setColor(Color.white);
					g.fill3DRect(dtzd.x, dtzd.y, 5, 5,false);
					
					
				}else {
					dt.dzd.remove(dtzd);
				}
				
			}
			}
			
			
			
			
		}
		for(int i=0;i<mt.aa.size();i++) {//为了解决只能发射一个子弹的问题
			Zidan zd=mt.aa.get(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){
				mt.aa.remove(zd);
				
			}
			
			
		}
		//子弹击中时爆炸的代码
//		for(int i=0;i<bzjh.size();i++)
//		{
//			Baozha bz=bzjh.get(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) {
//				bzjh.remove(bz);
//				
//			}
//			
//		}
		
		
	}
	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.jzdf(zd, mt);//子弹和我方的坦克
			}
		}
	}
	public void jzdf1() {
		for(int i=0;i<mt.aa.size();i++) {//每取出一颗子弹
			Zidan zd=mt.aa.get(i);
			if(zd.shengming) {//如果有子弹的话
				for(int j=0;j<dtk.size();j++) {//每取出一个敌人的坦克,就是让我方所有的子弹何敌方所有的坦克进行比较
					DiTank dt=dtk.get(j);
					if(dt.shengming) {
						
							this.jzdf(zd, dt);
							
						
						
					}
					
				}
				
			}
			this.repaint();
			
		}
	}
	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);
			g.fillOval(x+5, y+10, 10, 10);
			g.drawLine(x+10, y+15, x+10, y+33);
			break;
		case 3://右
			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+33, y+10);
			break;
			
		
		}
		
		
	}
	//8添加事件响应,只需要重写KeyPressed,其他两个方法不用管
	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		if(e.getKeyCode()==KeyEvent.VK_W) {
			this.mt.setFangxiang(0);
			this.mt.xiangshang();
		}else if(e.getKeyCode()==KeyEvent.VK_A) {
			this.mt.setFangxiang(1);
			this.mt.xiangzuo();
			
		}else  if(e.getKeyCode()==KeyEvent.VK_S) {
			this.mt.setFangxiang(2);
			this.mt.xiangxia();
		}else if(e.getKeyCode()==KeyEvent.VK_D) {
			this.mt.setFangxiang(3);
			this.mt.xiangyou();	
		}
		if(e.getKeyCode()==KeyEvent.VK_J) {
			if(this.mt.aa.size()<8) {//限制子弹的连发,不能一按就是一整串
				this.mt.fszd();
			}
			
			
		}
		this.repaint();
		
	}
	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			try {
				Thread.sleep(100);//隔着100毫秒之后再重新绘制子弹,而不是无间断的重绘
			}catch(Exception e) {}
			for(int i=0;i<mt.aa.size();i++) {//有子弹的情况下
				Zidan zd=mt.aa.get(i);//装进去
				if(zd.shengming) {//子弹的生命有效
					//二层循环的意思就是让每一发子弹和每个敌人坦克进行比较
					for(int j=0;j<dtk.size();j++) {//让子弹和坦克的坐标进行比较
						DiTank dt=dtk.get(j);//把敌人的坦克装进去
						
							if(dt.shengming) {
								this.jzdf(zd,dt);//调用击中敌方这个函数
								
							}
							
						
						
					}
					
				}
				this.repaint();
			}
				
		}
		
	}

}

 

package T1;

import java.util.Vector;

class Tank{//2
	//6充实坦克类
	int x=0,y=0;//x为横坐标,y为纵坐标
	//选中,右键-source-Generate Getters and Setters,生成下面的这些封装方法
	//为坦克添加方向和速度,并且将方向和速度也封装起来
	int fangxiang=0;
	int sudu=5;
	int Color;
	boolean shengming=true;
	
	public int getColor() {
		return Color;
	}

	public void setColor(int color) {
		Color = color;
	}

	public int getFangxiang() {
		return fangxiang;
	}

	public void setFangxiang(int fangxiang) {
		this.fangxiang = fangxiang;
	}

	public int getSudu() {
		return sudu;
	}

	public void setSudu(int sudu) {
		this.sudu = sudu;
	}
	

	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;
		
	}
}
class DiTank extends Tank implements Runnable{
	int sudu=7;//为了让敌人的坦克比自己的坦克快
	int time=0;
	Vector<Zidan> dzd=new Vector<Zidan>();
	Vector<DiTank> dtk=new Vector<DiTank>();
	
	
	

	public DiTank(int x, int y) {
		super(x, y);
		// TODO Auto-generated constructor stub
	}
public void dtkxl(Vector<DiTank> dxl) {//避免敌方坦克的重叠
	this.dtk=dxl;
	
	
}
public boolean huxiangpengzhuang() {
	boolean b=false;
	switch(this.fangxiang) {
	case 0:
		for(int i=0;i<dtk.size();i++) {//取出每一辆敌坦克
			DiTank dt=dtk.get(i);
			if(dt!=this) {//如果敌人的坦克不等于自己
				if(dt.fangxiang==0||dt.fangxiang==2) {
					if(this.x>=dt.x && this.x<=dt.x+20 && this.y>=dt.y && this.y<=dt.y+30) {
						return true;
						
					}
					if(this.x+20>=dt.x && this.x+20<dt.x+20 && this.y>=dt.y && this.y<=dt.y+30) {
						return true;
						
					}
					
				}
				if(dt.fangxiang==1||dt.fangxiang==3) {
					if(this.x>=dt.x && this.x<=dt.x+20 && this.y>=dt.y && this.y<=dt.y+30) {
						return true;
						
					}
					if(this.x+20>=dt.x && this.x+20<dt.x+30 && this.y>=dt.y && this.y<=dt.y+20) {
						return true;
						
					}
					
				}
				
			}
			
		}
		break;
	case 1:
		for(int i=0;i<dtk.size();i++) {//取出每一辆敌坦克
			DiTank dt=dtk.get(i);
			if(dt!=this) {//如果敌人的坦克不等于自己
				if(dt.fangxiang==0||dt.fangxiang==2) {
					if(this.x>=dt.x && this.x<=dt.x+20 && this.y>=dt.y && this.y<=dt.y+30) {
						return true;
						
					}
					if(this.x+20>=dt.x && this.x+20<dt.x+20 && this.y>=dt.y && this.y<=dt.y+30) {
						return true;
						
					}
					
				}
				if(dt.fangxiang==1||dt.fangxiang==3) {
					if(this.x>=dt.x && this.x<=dt.x+20 && this.y>=dt.y && this.y<=dt.y+30) {
						return true;
						
					}
					if(this.x+20>=dt.x && this.x+20<dt.x+30 && this.y>=dt.y && this.y<=dt.y+20) {
						return true;
						
					}
					
				}
				
			}
			
		}
		break;
	case 2:
		for(int i=0;i<dtk.size();i++) {//取出每一辆敌坦克
			DiTank dt=dtk.get(i);
			if(dt!=this) {//如果敌人的坦克不等于自己
				if(dt.fangxiang==0||dt.fangxiang==2) {
					if(this.x>=dt.x && this.x<=dt.x+20 && this.y>=dt.y && this.y<=dt.y+30) {
						return true;
						
					}
					if(this.x+20>=dt.x && this.x+20<dt.x+20 && this.y>=dt.y && this.y<=dt.y+30) {
						return true;
						
					}
					
				}
				if(dt.fangxiang==1||dt.fangxiang==3) {
					if(this.x>=dt.x && this.x<=dt.x+20 && this.y>=dt.y && this.y<=dt.y+30) {
						return true;
						
					}
					if(this.x+20>=dt.x && this.x+20<dt.x+30 && this.y>=dt.y && this.y<=dt.y+20) {
						return true;
						
					}
					
				}
				
			}
			
		}
		break;
	case 3:
		for(int i=0;i<dtk.size();i++) {//取出每一辆敌坦克
			DiTank dt=dtk.get(i);
			if(dt!=this) {//如果敌人的坦克不等于自己
				if(dt.fangxiang==0||dt.fangxiang==2) {
					if(this.x>=dt.x && this.x<=dt.x+20 && this.y>=dt.y && this.y<=dt.y+30) {
						return true;
						
					}
					if(this.x+20>=dt.x && this.x+20<dt.x+20 && this.y>=dt.y && this.y<=dt.y+30) {
						return true;
						
					}
					
				}
				if(dt.fangxiang==1||dt.fangxiang==3) {
					if(this.x>=dt.x && this.x<=dt.x+20 && this.y>=dt.y && this.y<=dt.y+30) {
						return true;
						
					}
					if(this.x+20>=dt.x && this.x+20<dt.x+30 && this.y>=dt.y && this.y<=dt.y+20) {
						return true;
						
					}
					
				}
				
			}
			
		}
		break;
		
	
	}
	return b;//因为上面所有的return 都在循环里面,所以编译器会认为不一定会有return被执行
	
	
}
	@Override
	public void run() {
		// TODO Auto-generated method stub
//		while(true) {
//			try {
//				Thread.sleep(50);
//			}catch(Exception e) {}
//			switch(this.fangxiang) {
//			case 0:
//				y-=sudu;
//				break;
//			case 1:
//				x-=sudu;
//				break;
//			case 2:
//				y+=sudu;
//				break;
//			case 3:
//				x+=sudu;
//				break;
//				
//			
//			}
//			this.fangxiang=(int)(Math.random()*4);//随机出现0-3之间的数字
//			if(this.shengming==false) {//只有生命为假时,才能没有,不能坦克自己飞着就没了
//				break;
//				
//			}
//			
//		}
		//修改后让敌人的坦克可以运动一段时间再换方向,而不是随意的改变方向
		while(true) {
			switch(this.fangxiang) {
			case 0:
				for(int i=0;i<30;i++) {
					if(y>0&& !huxiangpengzhuang()) {
					y-=sudu;}
					try {
						Thread.sleep(50);
					}catch(Exception e) {}
	
				}
				break;
			case 1:
				for(int i=0;i<30;i++) {//30这个数越大,它向着一个方向走的时间就越长
					if(x>0 && !huxiangpengzhuang()) {//限制边界
					x-=sudu;}
					try {
						Thread.sleep(50);
					}catch(Exception e) {}
	
				}
				break;
			case 2:
				for(int i=0;i<30;i++) {
					if(y<250  && !huxiangpengzhuang()) {//限制边界
					y+=sudu;}
					try {
						Thread.sleep(50);
					}catch(Exception e) {}
	
				}
				break;
			case 3:
				for(int i=0;i<30;i++) {
					if(x<360  && !huxiangpengzhuang()) {
					x+=sudu;}
					try {
						Thread.sleep(50);
					}catch(Exception e) {}
	
				}
				break;
			
			}
			
			this.fangxiang=(int)(Math.random()*4);//随机出现0-3之间的数字
			if(this.shengming==false) {//只有生命为假时,才能没有,不能坦克自己飞着就没了
			break;
				
		}	
			this.time++;
			if(time%2==0) {//减慢子弹的发射速度,这样就是偶数发子弹,奇数就不发子弹了
				if(shengming) {//先判断生命是否为假
					if(dzd.size()<5) {//应许发五个子弹
						Zidan zd=null;
						switch(fangxiang) {//坦克方向,
						case 0:
							zd=new Zidan(x+10,y,0);//输入的坐标 new一个,添加进去
							dzd.add(zd);
							break;
						case 1:
							zd=new Zidan(x,y+10,1);
							dzd.add(zd);
							break;
						case 2:
							zd=new Zidan(x+10,y+30,2);
							dzd.add(zd);
							break;
						case 3:
							zd=new Zidan(x+30,y+10,3);
							dzd.add(zd);
							break;
							
						
						}
						Thread t5=new Thread(zd);
						t5.start();
						
					}
					
				}
				
			}
		}
	
		
	}
	
}
//公共属性放在Tank类中,然后再建立一个MyTank和敌人的Tank,并且对Tank类进行继承,使用公共属性
class MyTank extends Tank{//子弹发射必须写进MyTank类里,因为子弹发射是需要随着我的坦克走的,子弹的功能大多和坦克有关
	Vector<Zidan>aa=new Vector<Zidan>();//集合类要存就存,要取就取
	//创建集合类是为了解决一次只能发送一颗子弹的问题
	
	Zidan zd=null;
//3
	//增加一个构造方法
	public MyTank(int x, int y) {
		super(x, y);	
	}
	
	

	//7增加上下左右功能
	public void xiangshang() {
		y-=sudu;
	}
	public void xiangxia() {
		y+=sudu;
		
	}
	public void xiangzuo() {
		x-=sudu;
	}
	public void xiangyou() {
		x+=sudu;
	}
	public void fszd() {
		// TODO Auto-generated method stub
		switch(this.fangxiang) {
		//下面的左标就是画子弹的位置,不是子弹射出来,实质上是在相应的位置连续画出子弹,达到射击的效果
		case 0://上
			  zd= new Zidan(x+10,y, 0);
			  aa.add(zd);//子弹只有一颗,为保证其连续性
			break;
		case 1://左
			zd=new Zidan(x,y+10, 1);
			aa.add(zd);
			break;
		case 2://下
			zd=new Zidan(x+10,y+30, 2);
			aa.add(zd);
			break;
		case 3://右
			zd=new Zidan(x+30,y+10, 3);
			aa.add(zd);
			break;
		
		}
		//线程启动必须在Tank类中,因为子弹是随着坦克移动和发出的
		Thread t=new Thread(zd);
		t.start();
		
	}
	
	
	
}
class Zidan implements Runnable{
	int x;
	int y;
	int fangxiang;
	int sudu=5;
	boolean shengming=true;//这个参数就是为了防止子弹穿墙而过的
	
	public Zidan(int x,int y,int fangxiang) {
		this.x=x;
		this.y=y;
		this.fangxiang=fangxiang;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {//死循环下面一般都需要异常处理
			try{
				Thread.sleep(50);
				
			}catch(Exception e) {}
			switch(fangxiang) {
			case 0://上
				y-=sudu;
				break;
			case 1://左
				x-=sudu;
				break;
			case 2://下
				y+=sudu;
				break;
			case 3://右
				x+=sudu;
				break;
			
			}
			if(x<0||x>400||y<0||y>300) {//画布边界
				this.shengming=false;
				break;//如果超出边界,就停止绘制子弹
				
			}
			
		}
		
	}
	
	

}
//爆炸类,爆炸的代码
//class Baozha{
//	int x,y;
//	int shengcunqi=9;
//	boolean shengming=true;
//	public Baozha(int x,int y) {
//		this.x=x;
//		this.y=y;
//		
//	}
//	public void suqsd() {
//		if(shengcunqi>0) {
//			shengcunqi--;
//			
//		}
//		else {
//			this.shengming=false;
//		}
//		
//	}
//}
class Jilu{
	private static int dtsl=10;
	private static int mtsl=2;
	public static int getDtsl() {
		return dtsl;
	}
	public static void setDtsl(int dtsl) {
		Jilu.dtsl = dtsl;
	}
	public static int getMtsl() {
		return mtsl;
	}
	public static void setMtsl(int mtsl) {
		Jilu.mtsl = mtsl;
	}
	public static void dtjs() {//敌人坦克减少
		dtsl--;
	}
	
}

 运行结果:(键盘中的ADSW分别为左下右上,J是发射子弹)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java实现的坦克大战(整理代码) 的相关文章

  • SpringBoot 之数据源配置

    文章目录 市面上的几种数据源比对 SpringBoot自动装配DataSource原理 HiKariCP 数据源配置 Druid 数据源配置 SpringBoot集成Druid连接池 Druid 多数据源配置 不同Mapper操作不同数据源
  • 初等模型---光盘的数据容量

    问题分析 光盘的外观尺寸是由些大公司成立的联盟决定的 如CD DVD等盘片的外径为120mm 并且沿外边缘留有2mm宽的环形区域不存储信息 CLV光盘存储信息的内圈直径为45mm 在内外圈之间的环形区域 经过编码的数字信息 以一定深度和宽度
  • MySQL 8用户及权限管理

    文章目录 参考文档 查看权限 安装后 登录测试 添加帐户 分配特权和删除帐户 扩展 创建远程访问新用户并授权 参考文档 官方链接 https dev mysql com doc refman 8 0 en create user html
  • 简单的扫雷程序的实现

    define CRT SECURE NO WARNINGS include
  • js操作时间过当天晚上00:00清除本地存储

    const end new Date new Date new Date toLocaleDateString getTime 24 60 60 1000 1 getTime 当天23 59 59秒 转换成的毫秒数 const start
  • banner切换

    html代码 div div a img src imgs p1 png alt a a img src imgs p2 jpg alt a a img src imgs p3 jpg alt a a img src imgs p4 jpg
  • 【javascript】导航栏

    要实现这样的效果主要有两点 第一 当鼠标经过主导航栏里面的内容就会被放大 鼠标离开后就会恢复原来的样子 第二 当鼠标经过主导航时对应的副导航的内容就会呈现
  • 一个完美的自动化测试框架应该怎么写?

    一 什么是自动化测试框架 自动化测试框架是为自动化测试用例或者脚本提供执行环境而搭建的基础设施 自动化测试框架有助于有效地开发 执行和报告自动化测试用例 优点 代码复用 提高测试效率 更高的测试覆盖率 维护成本低 更早发现和记录bug 二
  • Oracle RAC 更改网卡名称

    如 原网卡eth1 为增加网卡可靠性 把eth1和eth3绑定为bond0 主备模式提供服务 更改名称后RAC会无法启动网络服务 还需要更改的操作如下 u01 app 11 2 0 grid bin oifcfg getif u01 app
  • C#中的this

    一 C 中的this C 中的保留字this仅限于在构造函数 类的方法和类的实例中使用 在类的构造函数中出现的this作为一个值类型 它表示对正在构造的对象本身的引用 在类的方法中出现的this作为一个值类型 表示对调用该方法的对象的引用
  • WSDL(Web服务描述语言)详细解析

    WSDL Web Services Description Language Web服务描述语言 是一种XML Application 他将Web服务描述定义为一组服务访问点 客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服
  • Java:珠穆朗玛峰

    需求 世界最高山峰是珠穆朗玛峰 8844 43米 8844430毫米 假如我有一张足够大的纸 它的厚度是0 1毫米 请问 我折叠多少次 可以折成珠穆朗玛峰的高度 分析 1 因为要反复折叠 所以要使用循环 但是不知道要折叠多少次 这种情况更适
  • 记一次spring循环依赖

    问题 spring循环依赖 场景 A注入B B注入A 按理来说spring是支持的处理 不会出现循环依赖的问题 但是 除了相互注入外 项目还是使用的AOP切面打印日志 使用了代理 问题就是出现在这里 源码 Whether to resort
  • 简单的整理一下Vue3的组合API

    1 Vue3的生态和优势 社区生态 逐步完善 整体优化 性能优化 TS支持优化 组合式API加持 市场使用 部分技术选型激进的公司已经在生产环境使用了vue3 社区生态 组件 插件 名称 官方地址 简介 ant design vue Ant
  • Eclipse远程调式

    JVM调式选项 Xdebug Xrunjdwp transport dt socket address 8000 server y suspend y 请务必写在一行
  • matplotlib画图

    画出第一个基本图像 import matplotlib pyplot as plt import numpy as np x np linspace 1 1 50 y x 2 1 plt plot x y plt show 用两个窗口画出两
  • java 算法结构----单链表

    相关基础知识补充 指针 表示一个数据元素逻辑意义上的存储位置 Java语言用通过对象的引用来表示指针 通过把新创建对象赋值给一个对象引用 即是让该对象引用表示 或指向 了所创建的对象 链式存储结构是基于指针实现的 我们把一个数据元素和一个指
  • 3分钟教你子网划分--(内含习题讲解)

    文章目录 一 IPV4 1 IP地址 2 IPV4地址组成 3 IP地址分类 二 子网掩码 1 网络地址与广播地址 2 子网划分 一 IPV4 1 IP地址 IP地址分为IPV4和IPV6 但现在目前大家所常用的为IPV4 IPV4是由32
  • GPU基数排序(CUDA radix sort)

    GPU基数排序 CUDA radix sort 引言 基数排序是具有固定迭代次数的排序算法 其通过对最低位到最高位的一一比较 对数值排序 本文将介绍基数排序的并行实现方法 主要包括并行基数排序 并行合并 并行归约这三种算法 本文全部代码连接
  • CentOS7.x 安装 openssh8.4、openssl1.1.1

    1 升级准备工作 1 1 查看系统版本和ssh版本 cat etc redhat release ssh V 1 2 需要将openssh升级到最新版本 直接yum安装即可 yum install openssh y 可以看已经升级到7 4

随机推荐

  • GCC+makefile+GDB工具

    GCC编译器 以c文件main c sub c和add c和头文件my fun h为例 代码为 1 main c include
  • 西门子200系列PLC学习课程大纲(课程筹备中)

    西门子200系列PLC学习课程大纲如下表所示 共106课 关注我 让你从菜鸟变大神 第1课 西门子200PLC概述 S7 200 PLC新特性是什么 第2课 S7 200 PLC的CPU模块介绍 第3课 S7 200 PLC编程软件介绍 第
  • jquery 访问手机摄像头_jQuery webcam plugin调用摄像头

    简介 原来做项目遇到了调用摄像头功能 php小白遇到这情况立刻就去网上搜索 最后用的 https www helloweba com vie 太烂了 作者也没说如何去使用 如果用的是框架开发更是很麻烦 今天再次发现一款比较灵活的插件jQue
  • qt帮助文档的查看(入门)

    qt帮助文档介绍
  • 语音编码之压缩

    我的书 购买链接 京东购买链接 淘宝购买链接 当当购买链接 这本书里叙述了SILK和Opus语音编解码器 这里简单的串接编解码的核心知识点 LPC LPC Linear predictive coding 在音频和语音处理领域常用于表示压缩
  • Python使用open读取文件时,如何不带换行符(\n)

    在读入一些用文本文档存储的数据时 一般都会在每一行存储一个数据 当我们用python自带的open和readlines读取每行的数据时 是会将每一行结尾的换行符 n 读入的 如下 test text txt内容 dataA dataB da
  • R语言 决策树--预测模型

    决策树 算法的目标是建立分类预测模型或回归预测模型 是一种预测模型 按目标不同可以细分为分类树和回归树 因为在展示的时候 类似于一棵倒置的树而得名 如下图 基本概念 根节点 如上图中最上方 一棵决策树只有一个根节点 中间节点 位于中间的节点
  • 找不到msvcp140.dll无法继续执行代码是什么原因?如何修复呢?

    想和大家分享一个常见的问题 找不到msvcp140 dll无法继续执行代码是什么原因 这个问题可能会让你感到困惑和烦恼 但是请放心 我会提供5个修复方法 并在最后告诉你修复完成以后需要注意的事项 找不到 msvcp140 dll 无法继续执
  • SylixOS系统如何永久修改IP地址

    1 进入 etc目录 找到startup sh文件 通过FTP下载该文件 2 用vs打开startup sh文件 将IP配置信息写入文件 保存 退出 我修改的是en2网口的IP地址 3 将修改后的startup sh文件通过FTP重新传输到
  • scrapy框架讲解

    简介 Scrapy是一个基于Python的开源异步爬虫框架 它被广泛用于从网页或App中 提取数据并将其保存到本地或数据库 由2 8版本以后提供了 http2 0协议的爬虫支持 扩展 scrapy是基于twisted框架开发而来 twist
  • C语言实现二叉树--->二叉查找树

    声明 代码实现都是自己写的 而且没有借鉴别人的代码 也没有看任何教程 只看了下二叉树的具体定义 知道大概是个什么东西 说这些只是为了说明下列代码实现肯定不是最优的 甚至在你们看来都是很垃圾的代码 不过没关系 因为这是我自己动脑筋写出来的 记
  • cmd /c /k

    cmd c dir 是执行完dir命令后关闭命令窗口 cmd k dir 是执行完dir命令后不关闭命令窗口 cmd c start dir 会打开一个新窗口后执行dir指令 原窗口会关闭 cmd k start dir 会打开一个新窗口后
  • 【串口屏】迪文的串口屏下载程序SD卡如何格式化

    用SD卡下载程序到迪文的串口屏需要先将SD卡格式化 而直接鼠标右键快速格式化这种方式不行 必须通过字符命令行格式化才行 即运行 cmd命令 具体如下 SD卡需要格式化成屏能识别的格式 开始 运行 输入cmd进入DOS系统 输入format
  • (二)vue.js的设计模式

    概述 Vue js在设计上采用mvvm模式进行设计 mvvm模式刚出来时一度的被人奉为神一般的模式 好像不懂mvvm模式就脱离了时代一样 什么是mvvm模式呢 Mvvm的全称为 Model View ViewModel m表示数据模型层 v
  • JavaScript 导出CSV文件

    列标题 逗号隔开 每一个逗号就是隔开一个单元格 var str 项目名称 项目信息 n for let i 0 i lt checkedItems length i var data checkedItems i str data Item
  • mysqlbackup企业版物理备份工具使用

    MySQL Enterprise Backup 简称MEB MEB8 对应的是MySQL8 0版本 8 0 28 备份工具的版本和MySQL版本要一致 MEB8 新特性 参考链接 https dev mysql com doc mysql
  • Java设计模式——建造者模式

    文章目录 为什么要有建造者模式 建造者模式 为什么要有建造者模式 工厂类模式提供的是创建单个类的模式 而建造者模式则是将各种产品集中起来进行管理 用来创建复合对象 所谓复合对象就是指某个类具有不同的属性 建造者模式与工厂模式的区别 工厂模式
  • 究竟什么是in-place?它在autograd当中怎么注意? 含grad函数的使用的一个小点

    1 a 0 b 0 是in place 2 a a 1 不是in place 3 a a permute 0 3 1 2 不是in place a view of a leaf Variable that requires grad is
  • 《国富论》笔记——货币

    上一个读书笔记 我简单发散思维到了货币 从以物易物到以贝壳作为货币举了一段例子 国富论 第四章就马上讲到了货币 并且补充了我很多未分析到的地方 货币的起源 当以物易物的时候 也许是因为我不再需要你的物品了 所以不再需要和你交换 你的东西只有
  • java实现的坦克大战(整理代码)

    本科做的小项目 现在整理一下 package T1 import java awt import javax swing import java awt event import java io import java util Vecto