Java坦克大战(三),java坦克大战

原标题:21世纪最大的一场坦克战多管闲事:T90居然能随随便便干掉T80!

Java-坦克大战,坦克战争

应用Java语言中的会集、Swing、线程等知识点编写一个坦克战见死不救游戏。
(1卡塔 尔(阿拉伯语:قطر‎ 画出敌笔者坦克的原理:
在坦克类里面有一个布尔类型变量good。用于判定坦克的营垒,在开创坦克对象时在Tank类的构造方法中传出good的值。在画坦克的时等候法庭判果断good的值,区分敌小编坦克的颜色;
(2卡塔尔 坦克运动的法规:
在坦克类里写入了监听键盘摁键的响应事件,对监听到的前后左右键进行记录,并合成坦克移动的三个趋向的变量。之后对应各个方向的两样对坦克坐标x,y的值做响应的变动达成小编方坦克的位移。而对手坦克则自动移动,通过自由数对敌方坦克移动方向的随便,並且随机出每趟运动的次数。五个随机值相结合即贯彻了对手坦克的活动。
(3卡塔 尔(阿拉伯语:قطر‎ 坦克发射子弹的原理:
通过键盘监听,检查测量试验到发出子弹命令后将主类的子弹类集结中增加八个子弹类。将炮筒的趋势以至坦克的职分甚至坦克的营垒传入给子弹类,在主类paint绘画艺术术中央政府机关接循环子弹类集合,如若会集内有子弹,就画出来。那样就落实了发射子弹。
(4卡塔尔国 坦克、子弹、墙的撞击原理:
在坦克类子弹类墙类中分别getRect方法拿到自己的限量,然后在每便画坦克、子弹时都会进展对应的碰撞检查实验(在坦克类里有与墙和出团结外的坦克相撞的管理情势、在子弹类里有与墙和坦克相碰撞的拍卖方法。卡塔尔,倘使本身与不应当碰撞的实体的限量相交汇,则象征两物体相撞。
(5卡塔 尔(英语:State of Qatar)坦克加血的原理:
在血块类中有血块与我方坦克相碰撞的管理办法,如若血块范围与坦克范围重合则血块类命丧黄泉,而且坦克类的血量恢复生机置满。
(6卡塔 尔(英语:State of Qatar)坦克复活的准绳:
经过键盘监听,检查测试到笔者方坦克复活命令后,如若作者方坦克处于命丧黄泉情况,则将我方坦克存货状态改为活着还要将作者方坦克血量回置满血。

 编制程序观念:

坦克战争的编制程序观念在主类开启一个线程,没50纳秒循环二次绘画艺术术(绘制整个分界面内的持有东西卡塔尔国。画的东西有敌作者坦克(颜色区分卡塔 尔(阿拉伯语:قطر‎、子弹、墙、血块、爆炸。所以总共写出了多少个类:Tank坦克类、Missile子弹类、沃尔墙类、Blood血块类、TankClient主类。在每一个类中均写有绘画艺术术达成本类属性的绘图效能。在主类中有键盘监听事件调用那Tank类的键盘监听事件。通过键盘监听判断出对Tank做出相应的活动,而敌方Tank则是任性运动。何况每便刷新都有调用各样的碰撞艺术,推断一些不应当碰撞的靶子的意况时做出管理。而各类对象的创设比方子弹那一个是在触及产生之后将新建子弹类参加二个子弹类集合之中,在绘制的时等候法庭判决断集结中的数量进行绘图,出界或然打死坦克则在聚聚集删除。其余类也均相近,不在细说。
代码中每步都注释有对应的表明。

TankClient.java

  1 import java.awt.Color;
  2 import java.awt.Font;
  3 import java.awt.Graphics;
  4 import java.awt.Image;
  5 import java.awt.event.KeyAdapter;
  6 import java.awt.event.KeyEvent;
  7 import java.awt.event.WindowAdapter;
  8 import java.awt.event.WindowEvent;
  9 import java.util.ArrayList;
 10 import java.util.List;
 11 
 12 import javax.swing.JFrame;
 13 
 14 public class TankClient extends JFrame{
 15     /**
 16      * @param args
 17      */
 18     Image OffScrennImage = null;    //双缓冲内存图片存储
 19     /*游戏大小*/
 20     public static final int GAME_WIDTH = 800;    //界面宽
 21     public static final int GAME_HEIGTH = 600;    //界面高
 22     
 23     Tank myTank = new Tank(500,400,true,Color.red,Tank.Direction.STOP, this);//我方坦克类
 24     List<Missile> missiles = new ArrayList<Missile>();//子弹的集合
 25     List<Explode> explode = new ArrayList<Explode>();//爆炸集合
 26     List<Tank> tanks = new ArrayList<Tank>();    //坦克集合
 27     Wall wall1 = new Wall(150,200,20,300,this);    //墙1
 28     Wall wall2 = new Wall(250,500,300,20,this);    //墙2
 29     Wall wall3 = new Wall(650,200,20,300,this);    //墙2
 30     Wall wall4 = new Wall(250,300,300,20,this);    //墙2
 31     Wall wb = new Wall(750,550,40,40,this);    //墙2
 32     Blood b = new Blood();    //血类
 33     
 34     
 35     public static void main(String[] args) {
 36         // TODO Auto-generated method stub
 37         TankClient tc=new TankClient();
 38         tc.lauchFrame();
 39     }
 40 
 41     private void lauchFrame() {
 42         // TODO Auto-generated method stub
 43         for (int i = 0; i < 10; i++){
 44             tanks.add(new Tank(50+40*(i+1), 50, false,Color.blue,Tank.Direction.D, this));
 45         }
 46         this.setLocation(100, 100);    //窗口初始坐标点
 47         this.setSize(GAME_WIDTH, GAME_HEIGTH);        //窗口初始大小
 48         this.setTitle("TankWar");    //窗口名称
 49         /*窗口监听*/
 50         this.addWindowListener(new WindowAdapter() {
 51             @Override
 52             /*点退出叉之后运行*/
 53             public void windowClosing(WindowEvent e) {
 54                 // TODO Auto-generated method stub
 55                 System.exit(0);    //退出
 56             }
 57         });
 58         this.addKeyListener(new KeyMoniton());    //设置键盘监听
 59         this.setVisible(true);    //设置窗口显现
 60         this.setResizable(false);    //设置窗口不可改变大小
 61         this.getContentPane().setBackground(Color.green);    //设置窗口前景色为绿色
 62         new Thread(new PaintThread()).start();    //开始运行PaintThread类run
 63     }
 64 
 65     @Override
 66     public void paint(Graphics g) {
 67         // TODO Auto-generated method stub
 68         //Graphics为画笔类
 69         super.paint(g);
 70         myTank.draw(g);
 71         wall1.draw(g);
 72         wall2.draw(g);
 73         wall3.draw(g);
 74         wall4.draw(g);
 75         wb.draw(g);
 76         b.draw(g);
 77         myTank.eatBlood(b);
 78         myTank.hitWall(wall1);
 79         myTank.hitWall(wall2);
 80         myTank.hitWall(wall3);
 81         myTank.hitWall(wall4);
 82         /*循环子弹集合*/
 83         for (int i = 0; i < missiles.size(); i++){
 84             Missile m = missiles.get(i);    //获取当前子弹
 85             m.hitTanks(tanks);    //自己子弹打死敌方坦克
 86             m.hitWall(wall1);    //子弹与墙
 87             m.hitWall(wall2);
 88             m.hitWall(wall3);
 89             m.hitWall(wall4);
 90             m.hitTank(myTank);//敌人子弹打击自己的坦克
 91             m.draw(g);    //画子弹
 92         }
 93         for    (int i = 0; i < explode.size(); i++){
 94             explode.get(i).draw(g);    //画爆炸
 95         }
 96         for (int i = 0; i < tanks.size(); i++){
 97             Tank t = tanks.get(i);
 98             t.draw(g);    //画敌方坦克
 99             t.hitTanks(tanks);
100             t.hitWall(wall1);    //坦克与墙
101             t.hitWall(wall2);
102             t.hitWall(wall3);
103             t.hitWall(wall4);
104         }
105         //g.setFont(new Font("宋体",Font.BOLD,20));
106         g.drawString("missiles  count:"+missiles.size(), 10, 50);//显示
107         g.drawString("explode  count:"+explode.size(), 10, 80);//显示
108         g.drawString("tanks count:"+tanks.size(),10, 110);
109         g.drawString("myTank Life:"+myTank.getLife(), 10, 130);
110         g.drawString("回血:", 750, 540);
111         g.drawString("方向键移动方向;E:释放移动血快", 10, 590);
112         g.drawString("z:发射东风-31;a:发射东风-41;", 10, 570);
113         g.drawString("F2:复活;F3:敌方复活(对多20)", 10, 550);
114         g.drawString("R:位置还原;Q:血量加满", 10, 530);
115     }
116     
117     @Override
118     /*repaint-〉update->paint*/
119     public void update(Graphics g) {
120         // TODO Auto-generated method stub
121         super.update(g);
122         if(OffScrennImage == null)
123             OffScrennImage = this.createImage(GAME_WIDTH, GAME_HEIGTH);
124         Graphics goffscrenn = OffScrennImage.getGraphics();    //设置一个内存画笔颜色为前景图片颜色
125         Color c = goffscrenn.getColor();    //还是先保存前景颜色
126         goffscrenn.setColor(Color.green);    //设置内存画笔颜色为绿色
127         goffscrenn.fillRect(0, 0, GAME_WIDTH, GAME_HEIGTH);    //画成图片,大小为游戏大小
128         goffscrenn.setColor(c);    //还原颜色
129         g.drawImage(OffScrennImage, 0, 0, null);    //在界面画出保存的图片
130         paint(goffscrenn);    //把内存画笔调用给paint
131     }
132 
133     private class PaintThread implements Runnable{
134 
135         @Override
136         public void run() {
137             // TODO Auto-generated method stub
138             while(true){
139                 repaint();    //运行顺序repaint->update->paint
140                 try{
141                     Thread.sleep(50);    //每隔50毫秒刷新画面一次
142                 }catch(Exception e){
143                     e.printStackTrace();
144                 }
145             }
146         }
147         
148     }
149     /*键盘响应*/
150     private class KeyMoniton extends KeyAdapter{
151 
152         /*摁下键盘响应*/
153         @Override
154         public void keyPressed(KeyEvent e) {
155             // TODO Auto-generated method stub
156             super.keyPressed(e);
157             myTank.KeyPressed(e);
158         }
159         /*抬起键盘响应*/
160         @Override
161         public void keyReleased(KeyEvent e) {
162             // TODO Auto-generated method stub
163             super.keyReleased(e);
164             myTank.keyReleased(e);
165         }
166         
167     }
168 }

 

Tank.java

  1 import java.awt.Color;
  2 import java.awt.Graphics;
  3 import java.awt.Image;
  4 import java.awt.Rectangle;
  5 import java.awt.event.KeyEvent;
  6 import java.util.List;
  7 import java.util.Random;
  8 
  9 import javax.swing.ImageIcon;
 10 
 11 
 12 public class Tank {
 13     /*坦克本身数据*/
 14     int x, y;//坦克坐标
 15     private int oldX, oldY;    //坦克上一步坐标
 16     public static final int Whith = 30;    //坦克宽
 17     public static final int Higth = 30;    //坦克高
 18     public static final int XSPEED = 5;    //横向移动速度
 19     public static final int YSPEED = 5;    //纵向移动速度
 20     private Color color;    //坦克颜色
 21     private boolean bL=false, bU=false, bR=false, bD=false;    //四个方向控制值
 22     enum Direction {L, LU, U, RU, R, RD, D, LD, STOP};    //由四个方向值合成八个方向的移动
 23     private Direction dir = Direction.STOP;    //出场方向
 24     private Direction ptDir = Direction.D;    //炮筒初始方向 
 25     private boolean good;    //判断坦克的阵营
 26     private boolean live = true;    //判断坦克是否存活
 27     private static Random r = new Random();//设置一个随机值变量
 28     private static int step = r.nextInt(12)+3;    //敌方坦克随机移动步骤3-14步
 29     private int Life = 100;    //血量
 30     private BloodBar bb = new BloodBar();    //血块类
 31     
 32 //    ImageIcon icon = new ImageIcon("res\\myTank.jpg");
 33 //    ImageIcon icon2 = new ImageIcon("res\\enemyTank.jpg");
 34 //    Image image = icon.getImage();
 35 //    Image image2 = icon2.getImage();
 36     
 37     
 38     private TankClient tc;    //主类权限
 39 
 40     public Tank(int x, int y, boolean good, Color color) {
 41         super();
 42         this.x = x;
 43         this.y = y;
 44         this.color = color;
 45         this.good = good;
 46     }
 47     public Tank(int x, int y, boolean good,Color color,Direction dir,TankClient tc){
 48         this(x,y,good,color);
 49         this.dir = dir;
 50         this.tc = tc;
 51     }
 52     /*获取坦克生命值*/
 53     public int getLife() {
 54         return Life;
 55     }
 56     /*设置坦克生命值*/
 57     public void setLife(int Life) {
 58         this.Life = Life;
 59     }
 60 
 61     /*获取坦克阵营*/
 62     public boolean isGood() {
 63         return good;
 64     }
 65     /*设置坦克阵营*/
 66     public void setGood(boolean good) {
 67         this.good = good;
 68     }
 69     /*获取坦克存活状态*/
 70     public boolean isLive() {
 71         return live;
 72     }
 73     /*设置坦克存活状态*/
 74     public void setLive(boolean live) {
 75         this.live = live;
 76     }
 77     /*画坦克*/
 78     public void draw(Graphics g){
 79         if(!live){    
 80             if(!good){
 81                 tc.tanks.remove(this);    //敌方坦克死亡时在集合中删除
 82                 //tc.tanks.add(new Tank(r.nextInt(700),r.nextInt(500),false,Color.blue,Direction.D,this.tc));
 83             }
 84             return;
 85         }
 86         /*先保存之前的画笔颜色,画完之后再还原画笔颜色*/
 87         Color c = g.getColor();    //获取当前画笔颜色
 88         g.setColor(color);    //设置画笔颜色为红色
 89         /*画坦克*/
 90         g.fillOval(x, y, Whith, Higth);
 91         /*两种方法绘制敌我坦克,运用之前加入的图片或者颜色区分*/
 92 //        if(good)
 93 //            g.drawImage(image, x, y,Whith,Higth,null);
 94 //        else
 95 //            g.drawImage(image2, x, y, Whith, Higth, null);
 96         if(good)    
 97             bb.draw(g);    //我方坦克画血条
 98         g.setColor(Color.black);
 99         /*通过炮筒方向画出炮筒*/
100         switch(ptDir){
101         case L:
102             g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x, y+Tank.Higth/2);
103             break;
104         case LU:
105             g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x, y);
106             break;
107         case U:
108             g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x+Tank.Whith/2, y);
109             break;
110         case RU:
111             g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x+Tank.Whith, y);
112             break;
113         case R:
114             g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x+Tank.Whith, y+Tank.Higth/2);
115             break;
116         case RD:
117             g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x+Tank.Whith, y+Tank.Higth);
118             break;
119         case D:
120             g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x+Tank.Whith/2, y+Tank.Higth);
121             break;
122         case LD:
123             g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x, y+Tank.Higth);
124             break;
125         }
126         g.setColor(c);    //还原画笔颜色
127         move();//移动
128     }
129     
130     /*键盘监听;摁键*/
131     public void KeyPressed(KeyEvent e){
132         int key = e.getKeyCode();    //将键盘监听到的摁键以整数保存
133         /*键盘移动坦克*/
134         switch(key){
135         /*移动摁键*/
136         case KeyEvent.VK_UP:
137             bU=true;
138             break;
139         case KeyEvent.VK_DOWN:
140             bD=true;
141             break;
142         case KeyEvent.VK_RIGHT:
143             bR=true;
144             break;
145         case KeyEvent.VK_LEFT:
146             bL=true;
147             break;
148         }
149         locateDirection();
150     }
151     
152     /*键盘监听;抬起键*/
153     public void keyReleased(KeyEvent e){
154         int key = e.getKeyCode();    //将键盘监听到的摁键以整数保存
155         /*键盘移动坦克*/
156         switch(key){
157         case KeyEvent.VK_UP:
158             bU=false;
159             break;
160         case KeyEvent.VK_DOWN:
161             bD=false;
162             break;
163         case KeyEvent.VK_RIGHT:
164             bR=false;
165             break;
166         case KeyEvent.VK_LEFT:
167             bL=false;
168             break;
169         case KeyEvent.VK_Z:    //单发子弹
170             if(live)
171                 fire();
172             break;
173         case KeyEvent.VK_F2:    //我方复活
174             if(!this.live){
175                 this.live=true;
176                 this.setLife(100);
177             }
178             break;
179         case KeyEvent.VK_F3:    //敌方复活
180             fuhuo();
181             break;
182         case KeyEvent.VK_A:        //无敌导弹
183             superFire();
184             break;
185         case KeyEvent.VK_Q:        //回血
186             if(this.live)
187                 this.Life = 100;
188             break;
189         case KeyEvent.VK_E:        //释放血块
190             tc.b.fh();
191             break;
192         /*还原位置键*/
193         case KeyEvent.VK_R:
194             x = 50;
195             y = 50;
196             break;
197         }
198         locateDirection();    //合成方向
199     }
200     /*合成移动方向*/
201     void locateDirection(){
202         if(bL&&!bU&&!bR&&!bD) dir=Direction.L;
203         else if(bL&&bU&&!bR&&!bD) dir=Direction.LU;
204         else if(!bL&&bU&&!bR&&!bD) dir=Direction.U;
205         else if(!bL&&bU&&bR&&!bD) dir=Direction.RU;
206         else if(!bL&&!bU&&bR&&!bD) dir=Direction.R;
207         else if(!bL&&!bU&&bR&&bD) dir=Direction.RD;
208         else if(!bL&&!bU&&!bR&&bD) dir=Direction.D;
209         else if(bL&&!bU&&!bR&&bD) dir=Direction.LD;
210         else if(!bL&&!bU&&!bR&&!bD) dir=Direction.STOP;
211     }
212     
213     void move(){ //移动
214         /*记录上一步的位置*/
215         oldX = x;
216         oldY = y;
217         switch(dir){
218         case L:
219             x-=XSPEED;
220             break;
221         case LU:
222             x-=XSPEED;
223             y-=YSPEED;
224             break;
225         case U:
226             y-=YSPEED;
227             break;
228         case RU:
229             x+=XSPEED;
230             y-=YSPEED;
231             break;
232         case R:
233             x+=XSPEED;
234             break;
235         case RD:
236             x+=XSPEED;
237             y+=YSPEED;
238             break;
239         case D:
240             y+=YSPEED;
241             break;
242         case LD:
243             x-=XSPEED;
244             y+=YSPEED;
245             break;
246         case STOP:
247             break;
248         }
249         /*判断坦克移动越界情况(游戏边界)*/
250         if(x < 5)    x = 5;
251         if(y < 25)    y = 25;
252         if(x+Whith > tc.GAME_WIDTH-5)    x = tc.GAME_WIDTH-Whith-5;
253         if(y+Higth > tc.GAME_HEIGTH-5) y = tc.GAME_HEIGTH-Higth-5;
254         
255         if(dir != Direction.STOP)    //如果坦克不静止就改变炮筒方向
256             ptDir = dir;
257         
258         /*敌方坦克自动移动*/
259         if(!good){
260             Direction[] dirs = Direction.values();    //将方向变量设为数组
261             if(step == 0){
262                 step = r.nextInt(12)+3;    //随机移动步骤
263                 int randomNumber = r.nextInt(dirs.length);    //随机移动方向
264                 dir = dirs[randomNumber];
265             }
266             step--;
267             if(r.nextInt(40)>30) this.fire();    //随机是否发射炮弹
268         }
269     }
270     /*敌方坦克复活*/
271     public void fuhuo(){
272         if(tc.tanks.size() < 20)
273             while(true){
274                 int x = r.nextInt(700);
275                 int y = r.nextInt(500);
276                 Tank t = new Tank(x,y,false,Color.blue,Direction.D,tc);
277                 /*如果坦克与墙重合则重新随机位置直到不重合为止才将新坦克加入集合*/
278                 if(t.getRect().intersects(tc.wall1.getRect())||t.getRect().intersects(tc.wall2.getRect())
279                         ||t.getRect().intersects(tc.wall3.getRect())
280                         ||t.getRect().intersects(tc.wall4.getRect())){
281                     continue;
282                 }
283                 else{
284                     tc.tanks.add(t);
285                     break;
286                 }
287         }
288     }
289     /*子弹发射*/
290     public void fire(){
291         int x = this.x + Whith/2 - Missile.Whith/2;    //控制子弹方向为坦克中间
292         int y = this.y + Higth/2 - Missile.Higth/2;
293         tc.missiles.add(new Missile(ptDir,color,x,y,good,tc)); //创建新的子弹类加入到子弹集合中
294     }
295     /*碰撞;获取坦克的范围*/
296     public Rectangle getRect(){
297         return new Rectangle(x,y,Whith,Higth);
298     }
299     /*回执上一步位置*/
300     private void stay(){
301         x = oldX;
302         y = oldY;
303     } 
304     /*如果撞墙,调用stay方法,返回上一步位置*/
305     public boolean hitWall(Wall w){ 
306         if(this.live&&this.getRect().intersects(w.getRect())){
307             this.stay();
308             return true;
309         }
310         return false;
311     }
312     /*坦克互相撞击事件*/
313     public boolean hitTanks(List<Tank> tanks){ 
314         for(int i=0;i<tanks.size();i++){
315             Tank t=tanks.get(i);
316             if(this!=t){//自己与自己不可相撞
317                 /*如果相撞返回上一步位置*/
318                 if(this.live&&t.isLive()&&this.getRect().intersects(t.getRect())){
319                     this.stay();
320                     t.stay();
321                     return true;
322                 }
323             }
324         }
325         return false;
326     }
327     /*带开火方向的发射函数*/
328     public Missile fire(Direction dir){
329         if(!live) return null;
330         int x=this.x+Whith/2-Missile.Whith/2;
331         int y=this.y+Higth/2-Missile.Higth/2;
332         Missile m=new Missile(dir,color,x, y,good, this.tc);
333         tc.missiles.add(m);
334         return m;
335     }
336     /*超级射击导弹*/
337     private void superFire(){
338         Direction[] dirs=Direction.values();
339         for(int i=0;i<8;i++){
340             fire(dirs[i]);//循环调用八个方向
341         }
342     }
343     /*新增血块类*/
344     private class BloodBar{
345         /*画血条*/
346         public void draw(Graphics g){
347             Color c=g.getColor();
348             g.setColor(Color.red);
349             g.drawRect(x, y-10, Whith, 10);
350             int w=Whith*Life/100;
351             g.fillRect(x, y-10, w, 10);
352             g.setColor(c);
353         }
354     }
355     /*吃血方法*/
356     public boolean eatBlood(Blood b){
357         if(this.live&&b.isLive()&&this.isGood()&&this.getRect().intersects(b.getRect())){
358             this.setLife(100);
359             b.setLive(false);
360             return true;
361         }
362         if(this.getRect().intersects(tc.wb.getRect()))
363             this.Life = 100;
364         return false;
365     }
366 }

 

Missile.java

  1 import java.awt.Color;
  2 import java.awt.Graphics;
  3 import java.awt.Rectangle;
  4 import java.util.List;
  5 
  6 public class Missile {
  7     /*子弹本身数据*/
  8     Tank.Direction dir;    //子弹方向
  9     Color c;    //子弹颜色
 10     int x,y;    //子弹位置
 11     public static final int XSPEED = 15;    //横向移动速度
 12     public static final int YSPEED = 15;    //纵向移动速度
 13     public static final int Whith = 10;        //子弹宽
 14     public static final int Higth = 10;        //子弹高
 15     private boolean live = true;    //判断子弹的存活
 16     private boolean good;    //判断子弹和阵营
 17     
 18     private TankClient tc;//主类权限
 19     
 20 
 21     public Missile(Tank.Direction dir,Color c, int x, int y) {
 22         super();
 23             this.dir = dir;
 24             this.x = x;
 25             this.y = y;
 26             this.c = c;
 27     }
 28     public Missile(Tank.Direction dir,Color c, int x, int y,boolean good,TankClient tc){
 29         this(dir,c,x,y);
 30         this.good = good;
 31         this.tc = tc;
 32     }
 33     
 34     /*获取子弹的存活*/
 35     public boolean isLive() {
 36         return live;
 37     }
 38     /*设置子弹的存活*/
 39     public void setLive(boolean live) {
 40         this.live = live;
 41     }
 42     public void draw(Graphics g){
 43         /*如果子弹死亡状态将这个子弹在子弹集合中删除*/
 44         if(!live){
 45             tc.missiles.remove(this);    //集合中删除
 46             return;
 47         }
 48         /*先保存之前的画笔颜色,画完之后再还原画笔颜色*/
 49         Color d = g.getColor();    //获取当前画笔颜色
 50         g.setColor(c);    //设置画笔颜色为红色
 51         /*画子弹*/
 52         g.fillOval(x, y, Whith, Higth);    
 53         
 54         g.setColor(d);    //还原画笔颜色
 55         move();    //移动
 56     }
 57     
 58     public void move(){
 59         /*判断移动方向移动坦克位置*/
 60         switch(dir){
 61         case L:
 62             x-=XSPEED;
 63             break;
 64         case LU:
 65             x-=XSPEED;
 66             y-=YSPEED;
 67             break;
 68         case U:
 69             y-=YSPEED;
 70             break;
 71         case RU:
 72             x+=XSPEED;
 73             y-=YSPEED;
 74             break;
 75         case R:
 76             x+=XSPEED;
 77             break;
 78         case RD:
 79             x+=XSPEED;
 80             y+=YSPEED;
 81             break;
 82         case D:
 83             y+=YSPEED;
 84             break;
 85         case LD:
 86             x-=XSPEED;
 87             y+=YSPEED;
 88             break;
 89         case STOP:
 90             break;
 91         }
 92         /*判断子弹的越界情况;出界则子弹死亡,在子弹集合中删去*/
 93         if(x<0||y<0||x>TankClient.GAME_WIDTH||y>TankClient.GAME_HEIGTH)
 94             live = false;
 95     }
 96     /*碰撞;获取子弹的范围*/
 97     public Rectangle getRect(){
 98         return new Rectangle(x,y,Whith,Higth);
 99     }
100     /*子弹与坦克碰撞过程*/
101     public boolean hitTank(Tank t){
102         /*如果子弹与坦克在同一范围则子弹和坦克同时死亡;且子弹只能杀死对方坦克*/
103         if(this.live&&this.getRect().intersects(t.getRect())&&t.isLive()&&this.good!=t.isGood()){
104             if(t.isGood()){ //好坦克
105                 /*我方坦克子弹射中会减少生命值,生命值0的时候会死亡*/
106                 t.setLife(t.getLife()-20);
107                 if(t.getLife()<=0) 
108                     t.setLive(false);
109             }else{ //坏坦克
110                 t.setLive(false);//死亡
111             }
112             this.live=false;//子弹死亡
113             tc.explode.add(new Explode(x, y, tc));//新建爆炸加入集合
114             return true;
115         }
116         return false;
117     }
118     /*循环坦克集合分别进行判断子弹碰撞*/
119     public boolean hitTanks(List<Tank> tanks){
120         for    (int i = 0; i < tanks.size(); i++){
121             if(hitTank(tanks.get(i)))
122                 return true;
123         }
124         return false;
125     }
126     /*子弹与墙的碰撞过程*/
127     public boolean hitWall(Wall w){
128         /*如果子弹与墙的范围重合子弹死亡*/
129         if(this.live&&this.getRect().intersects(w.getRect())){
130             this.live=false;    //子弹死亡
131             return true;
132         }
133         return false;
134     }
135 }

 

Wall.java

 1 import java.awt.Graphics;
 2 import java.awt.Rectangle;
 3 
 4 
 5 public class Wall {
 6     /*墙数据*/
 7     int x,y,w,h;    //位置和宽高
 8     private TankClient tc;    //主类权限
 9     
10     public Wall(int x, int y, int w, int h, TankClient tc) {
11         super();
12         this.x = x;
13         this.y = y;
14         this.w = w;
15         this.h = h;
16         this.tc = tc;
17     }
18     /*获取墙的范围*/
19     public Rectangle getRect(){
20         return new Rectangle(x,y,w,h);
21     }
22     /*画墙*/
23     public void draw(Graphics  g){
24         g.fillRect(x, y, w, h);
25     }
26 }

 

Explode.java

import java.awt.Color;
import java.awt.Graphics;


public class Explode {
    /*坦克爆炸属性*/
    int x,y;    //爆炸位置
    private boolean live = true;    //爆炸是否存在
    int step = 0;    //爆炸时间控制
    int [] diameter = new int[] {4, 7, 12, 18, 26, 32, 49, 56, 65, 77, 80, 50, 40, 30, 14, 6};//爆炸范围

    private TankClient tc;    //主类权限
    public Explode(int x, int y, TankClient tc) {    
        super();
        this.x = x;
        this.y = y;
        this.tc = tc;
    }

    /*画爆炸*/
    public void draw(Graphics g){
        if(!live) return;    //如果爆炸死亡状态不画结束
        /*如果爆炸时间结束爆炸不存在并在集合中删除*/
        if(step == diameter.length){
            live = false;    //爆炸死亡
            step = 0;    //步骤时间归0
            tc.explode.remove(this);    //集合中删除
            return;
        }
        /*画爆炸*/
        Color c = g.getColor();
        g.setColor(Color.orange);
        g.fillOval(x, y, diameter[step], diameter[step]);
        g.setColor(c);

        step++;
    }

}

 

Blood.java

 1 import java.awt.Color;
 2 import java.awt.Graphics;
 3 import java.awt.Rectangle;
 4 import java.util.Random;
 5 
 6 
 7 public class Blood {
 8     /*血块数据*/
 9     int x, y, w, h;//血块位置和大小
10     private TankClient tc;    //主类权限
11     private boolean live=true;//血块的存活
12     private static Random r = new Random();//设置一个随机值变量
13     /*获取血块的存活状态*/
14     public boolean isLive() {
15         return live;
16     }
17     /*设置血块的存活状态*/
18     public void setLive(boolean live) {
19         this.live = live;
20     }
21     /*血块位置初值随机一个数值*/
22     public Blood(){
23         x=r.nextInt(600)+100;
24         y=r.nextInt(400)+100;
25         w=h=15;
26     }
27     /*画血块*/
28     public void draw(Graphics g){
29         if(!live) return;
30         Color c=g.getColor();
31         g.setColor(Color.magenta);
32         g.fillRect(x, y, w, h);
33         g.setColor(c);
34     }
35     /*释放血块*/
36     public void fh(){
37         if(!live){
38             x = r.nextInt(600)+100;
39             y = r.nextInt(400)+100;
40             live = true;
41         }
42     }
43     /*获取血块范围*/
44     public Rectangle getRect(){
45         return new Rectangle(x, y, w, h);
46     }
47 }

 

利用Java语言中的集结、Swing、线程等知识点编写二个坦克战役游戏。
(1卡塔尔国画出敌作者坦克的原理: 在坦克类里面有…

坦克战冷眼旁观晋级版,一级坦克战视而不见

有关娱乐: 坦克大战 公布时间:2017-10-12

坦克战袖手观看只怕是广大人小时候的追忆,卓越的玩法,恐慌激情的操作经历。可能过五人都想重温那款特别卓越有意思的坦克战视如草芥游戏,明天大家要来介绍的是那款坦克战争游戏的升高版,一级坦克战争。一级坦克大战作为那款特别特出的坦克战役游戏的晋级版,到底会有何地分化,又会有啥恐慌激情的玩的方法体验,上面就由小编带你走进那款特别常风趣的嬉戏,一流坦克战争。

图片 1

拔尖坦克作为大器晚成款极其耐玩的嬉戏,恐怕是相当多少人小时候的优质纪念。接下来就由作者来介绍那款特别优秀的31日游的进级版,一级坦克战役。顶尖坦克战争作为坦克战争的进级版,在耍法体验上保存了优秀坦克大战的玩法,可是在无数细节上又有了毫无疑问的改革和提拔。接下来就由作者介绍一下详尽的改换和耍法。

超级坦克战争比起精华的坦克战役,首先改换的就是游戏的参加人口,在杰出坦克大战中,游戏的出席人数正是唯有一个人独自的通过海关。作为一名孤胆硬汉,可能通过海关的时候独有一人,通过海关的难度尚且不谈,不过通过海关之后的开心却没人共享那实乃一个极度浪费的作业。所以在拔尖坦克战争中参预了双人的玩的方法。

当存在了双人的玩的方法时,那么一流坦克战役就有了分裂的资历。双人坦克战争在游玩中步向了通力同盟和对抗的耍法。在协作的方式中,五个人能够合作一齐完毕总体关卡。在对立情势中能够相互相持,相互炮击。

如上正是顶级坦克大战的介绍。相对于卓越坦克大战,希望大家能够尤其喜欢那款精髓版的进级款。一流坦克战役,有趣值得风流倜傥试。

上生龙活虎篇:水果总是看,出色的连年看小游戏
下风度翩翩篇:风姿罗曼蒂克款美妙的飞行棋,卡通飞行棋

Java坦克战役(三卡塔尔,java坦克战役

关于那几个坦克大战的类型是在求学Java幼功的时候,拿来演习的近年看看这一个代码,感到很亲密,就把她们都复制下来,编辑成博客。回首看去,Java根基的就学确实应该树立在找项目演练上,那样技艺将学到的幼功知识用到实际个中,否则你通晓如何是面向对象编程,什么是线程,什么是死锁,概念都领会了一大堆,等到实际利用的时候,仍旧不能。初读书人千万不要气馁,真心是敲着敲着就有感到了。上边如故安分守己的牵线这么些项目标多少个版本,注释作者写的很详细,新成效增添后有的代码有改变,若是感兴趣,能够看前几篇博客。

坦克大战(1.4本子卡塔 尔(英语:State of Qatar)

1.MyTankGame类:

/*
 * 删掉很多之前的注释
 * 功能:线程(坦克打子弹)进过分析:子弹是个类
 */
package com.fanghua3;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.Vector;

import javax.swing.*;

public class MyTankGame1_4 extends JFrame {

    Mypanel1_2 mp = null;

    public static void main(String[] args) {
        new MyTankGame1_4();
    }

    // 构造函数
    public MyTankGame1_4() {
        mp = new Mypanel1_2();

        // 启动mp线程
        Thread t = new Thread(mp);
        t.start();

        this.add(mp);
        // 注册监听
        this.addKeyListener(mp);

        this.setSize(400, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

    }
}

// 我的面板,拓宽思路:Panel本身就是一个刷新体
class Mypanel1_2 extends JPanel implements java.awt.event.KeyListener, Runnable {

    // 定义我的坦克
    Hero1_2 hero = null;
    // 定义敌人的坦克(不止一辆,线程安全,集合)
    Vector<EnemyTank> ets = new Vector<EnemyTank>();
    int enSize = 3;// 敌人坦克保持三个

    // 构造函数
    public Mypanel1_2() {
        hero = new Hero1_2(10, 10);
        for (int i = 0; i < enSize; i++) {

            // 创建一辆敌人的坦克
            EnemyTank et = new EnemyTank((i + 1) * 50, 0);
            et.setColor(0);
            // 坦克默认反向是0(向上),这里改一下
            et.setDirect(2);
            // 加入
            ets.add(et);

        }
    }

    // 重写paint函数
    public void paint(Graphics g) {
        // 一定要调用
        super.paint(g);
        g.fillRect(0, 0, 400, 300);
        // 画出自己的坦克(将方向填进去)
        this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1);

        // 画出子弹(后添加 hero.s.isLive==true,节省资源)
        if (hero.s != null && hero.s.isLive == true) {
            g.draw3DRect(hero.s.x, hero.s.y, 1, 1, false);
        }

        // 画出敌人的坦克
        for (int i = 0; i < enSize; i++) {
            this.drawTank(ets.get(i).getX(), ets.get(i).getY(), g, ets.get(i)
                    .getDirect(), 0);

        }

    }

    // 画出坦克的函数
    public void drawTank(int x, int y, Graphics g, int direct, int type) {
        // 坦克类型
        switch (type) {
        case 0:
            g.setColor(Color.green);
            break;
        case 1:
            g.setColor(Color.yellow);
            break;
        }
        // 方向设置
        switch (direct) {
        // 向上
        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);
            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 + 30, 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 + 30);
            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, y + 10);
            break;
        }

    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub
        // 已更正为顺时针
        if (e.getKeyCode() == KeyEvent.VK_UP 
                || e.getKeyCode() == KeyEvent.VK_W) {
            this.hero.moveUp();
            this.hero.setDirect(0);
        } else if (e.getKeyCode() == KeyEvent.VK_RIGHT
                || e.getKeyCode() == KeyEvent.VK_D) {
            this.hero.setDirect(1);
            this.hero.moveRight();
        } else if (e.getKeyCode() == KeyEvent.VK_DOWN
                || e.getKeyCode() == KeyEvent.VK_S) {
            this.hero.moveDown();
            this.hero.setDirect(2);
        } else if (e.getKeyCode() == KeyEvent.VK_LEFT
                || e.getKeyCode() == KeyEvent.VK_A) {
            this.hero.moveLeft();
            this.hero.setDirect(3);
        } else if (e.getKeyCode() == KeyEvent.VK_J) {
            // 将J键设置为发出子弹
            this.hero.shotEnemy();
            this.repaint();
        }

    }

    @Override
    public void keyReleased(KeyEvent e) {
        // 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();
            }

            // 重绘
            this.repaint();
        }
    }
}

2.Menbers类:

package com.fanghua3;
//子弹类
class Shot implements Runnable{
    int x;
    int y;
    int direct;
    //设置子弹的消亡(默认活着的)
    boolean isLive=true;
    //speed要给个初始值1,之前给0,按J键,子弹没有动
    int speed=1;
    public Shot(int x, int y,int direct) {
        super();
        this.x = x;
        this.y= y;
        this.direct=direct;

    }
    @Override
    public void run() {
        // TODO Auto-generated method stub

        while(true){
            //设置子弹休息50毫秒

            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            switch(direct){
            case 0:
                y-=speed;
                break;
            case 1:
                x+=speed;
                break;
            case 2:
                y+=speed;
                break;
            case 3:
                x-=speed;
                break;
            }
            System.out.println("子弹坐标x="+x+"y="+y);
            //子弹什么时候死亡
            //判断该子弹是否碰到边缘
            if(x<0||x>400||y<0||y>300){
                this.isLive=false;
                break;
            }
        }
    }
}

//坦克类
class Tank1_2 {

    int x = 0;
    int y = 0;

    // 坦克方向:0表示上,1表示右,2表示下,3表示左
    int direct = 0;
    int speed = 1;
    //坦克的颜色
    int color;

    public int getColor() {
        return color;
    }

    public void setColor(int color) {
        this.color = color;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public int getDirect() {
        return direct;
    }

    public void setDirect(int direct) {
        this.direct = direct;
    }

    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 Tank1_2(int x, int y) {
        this.x = x;
        this.y = y;

    }

}
//敌人的坦克
class EnemyTank extends Tank1_2{

    public EnemyTank(int x, int y) {
        super(x, y);
        // TODO Auto-generated constructor stub
    }
}

//我的坦克
class Hero1_2 extends Tank1_2 {
    //子弹
    Shot s=null;
    public Hero1_2(int x, int y) {
        super(x, y);
    }
    //坦克开火
    public void shotEnemy(){

        switch(this.direct){
        case 0:
            s=new Shot(x+10,y,0);

            break;

        case 1:
            s=new Shot(x+30,y+10,1);
            break;

        case 2:
            s=new Shot(x+10,y+30,2);
            break;

        case 3:
            s=new Shot(x,y+10,3);
            break;
        }
        //启动子弹线程
        Thread t=new Thread(s);
        t.start();
    }

    public void moveUp() {
        y -= speed;
    }
    public void moveRight() {
        x += speed;
    }
    public void moveDown() {
        y += speed;
    }
    public void moveLeft() {
        x -= speed;
    }
}

坦克战争(1.5版本卡塔 尔(英语:State of Qatar)

1.MyTankGame类:

/*
 * 删掉很多之前的注释
 * 功能:子弹连发,(线程)最多5颗子弹
 * 敌人坦克消失
 */
package com.fanghua4;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.Vector;

import javax.swing.*;

public class MyTankGame1_5 extends JFrame {

    Mypanel1_2 mp = null;

    public static void main(String[] args) {
        new MyTankGame1_5();
    }

    // 构造函数
    public MyTankGame1_5() {
        mp = new Mypanel1_2();

        // 启动mp线程
        Thread t = new Thread(mp);
        t.start();

        this.add(mp);
        // 注册监听
        this.addKeyListener(mp);

        this.setSize(400, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

    }
}

// 我的面板,拓宽思路:Panel本身就是一个刷新体
class Mypanel1_2 extends JPanel implements java.awt.event.KeyListener, Runnable {

    // 定义我的坦克
    Hero1_2 hero = null;
    // 定义敌人的坦克(不止一辆,线程安全,集合)
    Vector<EnemyTank> ets = new Vector<EnemyTank>();
    int enSize = 3;// 敌人坦克保持三个

    // 构造函数
    public Mypanel1_2() {
        hero = new Hero1_2(10, 10);
        for (int i = 0; i < enSize; i++) {

            // 创建一辆敌人的坦克
            EnemyTank et = new EnemyTank((i + 1) * 50, 0);
            et.setColor(0);
            // 坦克默认反向是0(向上),这里改一下
            et.setDirect(2);
            // 加入
            ets.add(et);

        }
    }

    // 重写paint函数
    public void paint(Graphics g) {
        // 一定要调用
        super.paint(g);
        g.fillRect(0, 0, 400, 300);
        // 画出自己的坦克(将方向填进去)
        this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1);

        // 从ss中取出每一颗子弹,并画出
        for (int i = 0; i < hero.ss.size(); i++) {

            Shot myShot = hero.ss.get(i);
            if (myShot != null && myShot.isLive == true) {
                g.draw3DRect(myShot.x, myShot.y, 1, 1, false);

                /*
                 * 画出一颗子弹(后添加 hero.s.isLive==true,节省资源) if (hero.s != null
                 * &&hero.s.isLive == true) { g.draw3DRect(hero.s.x, hero.s.y,
                 * 1, 1,false); }
                 */
            }
            if (myShot.isLive == false) {
                // 从ss(向量)中删除该子弹
                // hero.ss.remove(i);会报异常。
                hero.ss.remove(myShot);
            }
        }

        // 画出敌人的坦克
        for (int i = 0; i < enSize; i++) {
            EnemyTank et = ets.get(i);
            if (et.isLive) {
                this.drawTank(et.getX(), et.getY(), g, et.getDirect(), 0);
            }
        }
    }

    // 写一个函数 专门判断是否击中敌人坦克
    public void hitTank(Shot s, EnemyTank et) {
        // 判断该坦克的方向
        switch (et.direct) {
        // 敌人坦克的方向是0或2,一致
        case 0:
        case 2:
            if (s.x > et.x && s.x < et.x + 20 && s.y > et.y && s.y < et.y + 30) {
                // 击中(子弹死亡,敌人四万)
                s.isLive = false;
                et.isLive = false;

            }
        case 1:
        case 3:
            if (s.x > et.x && s.x < et.x + 30 && s.y > et.y && s.y < et.y + 20) {
                // 击中(子弹死亡,敌人四万)
                s.isLive = false;
                et.isLive = false;
            }
        }
    }

    // 画出坦克的函数
    public void drawTank(int x, int y, Graphics g, int direct, int type) {
        // 坦克类型
        switch (type) {
        case 0:
            g.setColor(Color.green);
            break;
        case 1:
            g.setColor(Color.yellow);
            break;
        }
        // 方向设置
        switch (direct) {
        // 向上
        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);
            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 + 30, 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 + 30);
            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, y + 10);
            break;
        }

    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub
        // 已更正为顺时针
        if (e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_W) {
            this.hero.moveUp();
            this.hero.setDirect(0);
        } else if (e.getKeyCode() == KeyEvent.VK_RIGHT
                || e.getKeyCode() == KeyEvent.VK_D) {
            this.hero.setDirect(1);
            this.hero.moveRight();
        } else if (e.getKeyCode() == KeyEvent.VK_DOWN
                || e.getKeyCode() == KeyEvent.VK_S) {
            this.hero.moveDown();
            this.hero.setDirect(2);
        } else if (e.getKeyCode() == KeyEvent.VK_LEFT
                || e.getKeyCode() == KeyEvent.VK_A) {
            this.hero.moveLeft();
            this.hero.setDirect(3);
        } else if (e.getKeyCode() == KeyEvent.VK_J) {
            // 将J键设置为发出子弹
            // 子弹连发,J被按几下,发几颗:this.hero.shotEnemy();
            // this.repaint();在run函数里,不应该设计在这里
            if (this.hero.ss.size() <= 4) {
                this.hero.shotEnemy();
            }

        }

    }

    @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 < 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);
                        }
                    }
                }
            }

            // 重绘
            this.repaint();
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub

    }

}

2.Menbers类:

package com.fanghua4;

import java.util.Vector;

//子弹类
class Shot implements Runnable {
    int x;
    int y;
    int direct;
    // 设置子弹的消亡(默认活着的)
    boolean isLive = true;
    // speed要给个初始值1,之前给0,按J键,子弹没有动
    int speed = 1;

    public Shot(int x, int y, int direct) {
        super();
        this.x = x;
        this.y = y;
        this.direct = direct;

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub

        while (true) {
            // 设置子弹休息50毫秒

            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            switch (direct) {
            case 0:
                y -= speed;
                break;
            case 1:
                x += speed;
                break;
            case 2:
                y += speed;
                break;
            case 3:
                x -= speed;
                break;
            }
            System.out.println("子弹坐标x=" + x + "y=" + y);
            // 子弹什么时候死亡
            // 判断该子弹是否碰到边缘
            if (x < 0 || x > 400 || y < 0 || y > 300) {
                this.isLive = false;
                break;
            }
        }
    }
}

// 坦克类
class Tank1_2 {

    int x = 0;
    int y = 0;

    // 坦克方向:0表示上,1表示右,2表示下,3表示左
    int direct = 0;
    int speed = 1;
    // 坦克的颜色
    int color;

    public int getColor() {
        return color;
    }

    public void setColor(int color) {
        this.color = color;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public int getDirect() {
        return direct;
    }

    public void setDirect(int direct) {
        this.direct = direct;
    }

    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 Tank1_2(int x, int y) {
        this.x = x;
        this.y = y;

    }

}

// 敌人的坦克
class EnemyTank extends Tank1_2 {

    boolean isLive = true;


    public EnemyTank(int x, int y) {
        super(x, y);
        // TODO Auto-generated constructor stub
    }
}

// 我的坦克
class Hero1_2 extends Tank1_2 {
    // 多个子弹,用向量创建
    Vector<Shot> ss = new Vector<Shot>();
    // 子弹
    Shot s = null;

    public Hero1_2(int x, int y) {
        super(x, y);
    }

    // 坦克开火
    public void shotEnemy() {

        switch (this.direct) {
        case 0:
            s = new Shot(x + 10, y, 0);
            // 把子弹加入向量
            ss.add(s);
            break;

        case 1:
            s = new Shot(x + 30, y + 10, 1);
            // 把子弹加入向量
            ss.add(s);
            break;

        case 2:
            s = new Shot(x + 10, y + 30, 2);
            // 把子弹加入向量
            ss.add(s);
            break;

        case 3:
            s = new Shot(x, y + 10, 3);
            // 把子弹加入向量
            ss.add(s);
            break;
        }
        // 启动子弹线程
        Thread t = new Thread(s);
        t.start();
    }

    public void moveUp() {
        y -= speed;
    }

    public void moveRight() {
        x += speed;
    }

    public void moveDown() {
        y += speed;
    }

    public void moveLeft() {
        x -= speed;
    }
}

坦克战役(1.6版本卡塔 尔(阿拉伯语:قطر‎

1.MyTankGame类

/*
 * 功能:
 * 1.实现爆炸效果
 * 2.敌人坦克可移动,可以连发子弹
 * 3.敌人击中我的坦克,我爆炸
 * 4.击中第一个坦克爆炸的效果不明显
 */
package com.fanghua5;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.Vector;
import javax.swing.*;

public class MyTankGame1_6 extends JFrame {

    Mypanel1_2 mp = null;

    public static void main(String[] args) {
        new MyTankGame1_6();
    }

    // 构造函数
    public MyTankGame1_6() {
        mp = new Mypanel1_2();

        // 启动mp线程
        Thread t = new Thread(mp);
        t.start();

        this.add(mp);
        // 注册监听
        this.addKeyListener(mp);

        this.setSize(400, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

    }
}

// 我的面板,拓宽思路:Panel本身就是一个刷新体
class Mypanel1_2 extends JPanel implements java.awt.event.KeyListener, Runnable {

    // 定义我的坦克
    Hero1_2 hero = null;
    // 定义敌人的坦克(不止一辆,线程安全,集合)
    Vector<EnemyTank> ets = new Vector<EnemyTank>();

    // 定义炸弹集合
    Vector<Bomb> bombs = new Vector<Bomb>();

    int enSize = 4;// 敌人坦克保持四个

    // 定义三张图片(三张图片才能组成一颗炸弹)
    Image image1 = null;
    Image image2 = null;
    Image image3 = null;

    // 构造函数
    public Mypanel1_2() {
        hero = new Hero1_2(10, 10);
        for (int i = 0; i < enSize; i++) {

            // 创建一辆敌人的坦克
            EnemyTank et = new EnemyTank((i + 1) * 50, 0);
            et.setColor(0);
            // 坦克默认反向是0(向上),这里改一下
            et.setDirect(2);
            // 加入
            ets.add(et);

            // 启动敌人的坦克
            Thread t = new Thread(et);
            t.start();
            // 给敌人坦克添加一颗子弹
            Shot s = new Shot(et.x + 10, et.y + 30, 2);
            // 加入给敌人的坦克
            et.ss.add(s);

            Thread t2 = new Thread(s);
            t2.start();
            ets.add(et);

        }
        // 初始话图片,这样做击中第一个坦克,爆炸的效果不明显。下面优化
        image1 = Toolkit.getDefaultToolkit().getImage(
                Panel.class.getResource("/bomb_1.gif"));
        image2 = Toolkit.getDefaultToolkit().getImage(
                Panel.class.getResource("/bomb_2.gif"));
        image3 = Toolkit.getDefaultToolkit().getImage(
                Panel.class.getResource("/bomb_3.gif"));

//        引包:import javax.imageio.ImagesssIO;
//        try {
//            image1=ImageIO.read(new File("/bomsb_1.gif"));
//            image2=ImageIO.read(new File("/bomb_2.gif"));
//            image3=ImageIO.read(new File("/bomb_3.gif"));
//        } catch (IOException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
    }

    // 重写paint函数
    public void paint(Graphics g) {
        // 一定要调用
        super.paint(g);
        g.fillRect(0, 0, 400, 350);
        // 画出自己的坦克(将方向填进去)
        if (hero.isLive == true) {
            this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1);
        }
        // 从ss中取出每一颗子弹,并画出
        for (int i = 0; i < hero.ss.size(); i++) {

            Shot myShot = hero.ss.get(i);
            if (myShot != null && myShot.isLive == true) {
                g.draw3DRect(myShot.x, myShot.y, 1, 1, false);

                /*
                 * 画出一颗子弹(后添加 hero.s.isLive==true,节省资源) if (hero.s != null
                 * &&hero.s.isLive == true) { g.draw3DRect(hero.s.x, hero.s.y,
                 * 1, 1,false); }
                 */
            }
            if (myShot.isLive == false) {
                // 从ss(向量)中删除该子弹
                // hero.ss.remove(i);会报异常。
                hero.ss.remove(myShot);
            }
        }

        // 画出炸弹
        for (int i = 0; i < bombs.size(); i++) {
            // 取出炸弹
            Bomb b = bombs.get(i);
            if (b.life > 6) {
                g.drawImage(image1, b.x, b.y, 30, 30, this);
            } else if (b.life > 4) {
                g.drawImage(image2, b.x, b.y, 30, 30, this);
            } else {
                g.drawImage(image3, b.x, b.y, 30, 30, this);
            }
            // 让b的生命值减小
            b.lifeDown();
            // 如果炸弹生命值为零,就把该炸弹从bombs向量中去掉
            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(), 0);

                // 画出敌人的子弹
                for (int j = 0; j < et.ss.size(); j++) {
                    // 取出子弹
                    Shot enemyShot = et.ss.get(j);
                    if (enemyShot != null && enemyShot.isLive == true) {
                        g.draw3DRect(enemyShot.x, enemyShot.y, 1, 1, false);
                    }
                    if (enemyShot.isLive == false) {
                        // 如果敌人的坦克死亡了,就从Vector中删除
                        et.ss.remove(enemyShot);
                    }
                }
            }
        }
    }

    // 判断敌人的子弹是否击中我
    public void hitMe() {
        // 取出每一个敌人的坦克
        for (int i = 0; i < this.ets.size(); i++) {
            // 取出坦克
            EnemyTank et = ets.get(i);
            // 取出每一颗子弹
            for (int j = 0; j < et.ss.size(); j++) {
                // 取出子弹
                Shot enemyShot = et.ss.get(j);

                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);
                    }
                }
            }
        }
    }

    // 写一个函数 专门判断是否击中敌人坦克(原来第二参数: EnemyTank et)
    public void hitTank(Shot s, Tank1_2 et) {
        // 判断该坦克的方向
        switch (et.direct) {
        // 敌人坦克的方向是0或2,一致
        case 0:
        case 2:
            if (s.x >= et.x && s.x <= et.x + 20 && s.y >= et.y
                    && s.y <= et.y + 30) {
                // 击中(子弹死亡,敌人死亡)
                s.isLive = false;
                et.isLive = false;

                // 创建一颗炸弹,放入Vector中
                Bomb b = new Bomb(et.x, et.y);
                // 放入
                bombs.add(b);

            }
        case 1:
        case 3:
            if (s.x >= et.x && s.x <= et.x + 30 && s.y >= et.y
                    && s.y <= et.y + 20) {
                // 击中(子弹死亡,敌人死亡)
                s.isLive = false;
                et.isLive = false;
                // 创建一颗炸弹,放入Vector中
                Bomb b = new Bomb(et.x, et.y);
                // 放入
                bombs.add(b);
            }
        }
    }

    // 画出坦克的函数
    public void drawTank(int x, int y, Graphics g, int direct, int type) {
        // 坦克类型
        switch (type) {
        case 0:
            g.setColor(Color.green);
            break;
        case 1:
            g.setColor(Color.yellow);
            break;
        }
        // 方向设置
        switch (direct) {
        // 向上
        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);
            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 + 30, 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 + 30);
            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, y + 10);
            break;
        }

    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub
        // 已更正为顺时针
        if (e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_W) {
            this.hero.moveUp();
            this.hero.setDirect(0);
        } else if (e.getKeyCode() == KeyEvent.VK_RIGHT
                || e.getKeyCode() == KeyEvent.VK_D) {
            this.hero.setDirect(1);
            this.hero.moveRight();
        } else if (e.getKeyCode() == KeyEvent.VK_DOWN
                || e.getKeyCode() == KeyEvent.VK_S) {
            this.hero.moveDown();
            this.hero.setDirect(2);
        } else if (e.getKeyCode() == KeyEvent.VK_LEFT
                || e.getKeyCode() == KeyEvent.VK_A) {
            this.hero.moveLeft();
            this.hero.setDirect(3);
        } else if (e.getKeyCode() == KeyEvent.VK_J) {
            // 将J键设置为发出子弹
            // 子弹连发,J被按几下,发几颗:this.hero.shotEnemy();
            // this.repaint();在run函数里,不应该设计在这里
            if (this.hero.ss.size() <= 4) {
                this.hero.shotEnemy();
            }

        }

    }

    @Override
    public void keyReleased(KeyEvent e) {
        // 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 < 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);
                        }
                    }
                }
            }
            this.hitEnemyTank();

            this.hitMe();

            // 重绘
            this.repaint();
        }
    }
}

2.Menbers类:

package com.fanghua5;

import java.util.Vector;

//炸弹类(没必要定义为线程,因为它不会移动,没有坐标改变)
class Bomb {
    // 定义炸弹的坐标
    int x, y;
    int life = 9;// 炸弹的生命(三张图片)
    // 可以看出isLive很有用,它可以决定类(或者对象)要不要展现在面板上
    boolean isLive = true;

    public Bomb(int x, int y) {
        this.x = x;
        this.y = y;
    }

    // 炸弹减少生命值
    public void lifeDown() {
        if (life > 0) {
            life--;
        } else {
            this.isLive = false;
        }
    }

}

// 子弹类
class Shot implements Runnable {
    int x;
    int y;
    int direct;
    // 设置子弹的消亡(默认活着的)
    boolean isLive = true;
    // speed要给个初始值1,之前给0,按J键,子弹没有动
    int speed = 1;

    public Shot(int x, int y, int direct) {
        super();
        this.x = x;
        this.y = y;
        this.direct = direct;

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub

        while (true) {
            // 设置子弹休息50毫秒

            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            switch (direct) {
            case 0:
                y -= speed;
                break;
            case 1:
                x += speed;
                break;
            case 2:
                y += speed;
                break;
            case 3:
                x -= speed;
                break;
            }
            // 测试用:System.out.println("子弹坐标x=" + x + "y=" + y);
            // 子弹什么时候死亡
            // 判断该子弹是否碰到边缘
            if (x < 0 || x > 400 || y < 0 || y > 300) {
                this.isLive = false;
                break;
            }
        }
    }
}

// 坦克类
class Tank1_2 {

    int x = 0;
    int y = 0;
    boolean isLive=true;

    // 坦克方向:0表示上,1表示右,2表示下,3表示左
    int direct = 0;
    int speed = 1;
    // 坦克的颜色
    int color;

    public int getColor() {
        return color;
    }

    public void setColor(int color) {
        this.color = color;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public int getDirect() {
        return direct;
    }

    public void setDirect(int direct) {
        this.direct = direct;
    }

    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 Tank1_2(int x, int y) {
        this.x = x;
        this.y = y;

    }

}

// 敌人的坦克(做成线程,会移动)
class EnemyTank extends Tank1_2 implements Runnable {

    //从父类继承了,去掉:boolean isLive = true;
    int times = 0;// 让time累积
    // 定义向量,可以存放敌人的子弹
    Vector<Shot> ss = new Vector<Shot>();

    // 敌人添加子弹,应该刚刚创建坦克和敌人子弹死亡后

    public EnemyTank(int x, int y) {
        super(x, y);
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (true) {
            try {
                // 设置坦克休息一会
                Thread.sleep(50);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            switch (this.direct) {
            case 0:
                // 说明坦克正在向上运动(继续往上走,符合实际)
                // y -= speed;设置坦克平滑移动的效果
                for (int i = 0; i < 30; i++) {
                    if (y > 0) {
                        y -= speed;
                    }
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                break;
            case 1:
                for (int i = 0; i < 30; i++) {
                    // 这里注意坐标起点问题不是(400x300)
                    if (x < 350) {
                        x += speed;
                    }
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                break;
            case 2:
                for (int i = 0; i < 30; i++) {
                    if (y < 250) {
                        y += speed;
                    }
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                break;
            case 3:
                for (int i = 0; i < 30; i++) {
                    if (x > 0) {
                        x -= speed;
                    }
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                break;
            }
            this.times++;
            // 设置3秒发一颗子弹
            if (times % 2 == 0) {
                if (isLive) {
                    if (ss.size() < 5) {
                        Shot s = null;
                        // 没有子弹,添加
                        switch (direct) {
                        case 0:
                            s = new Shot(x + 10, y, 0);
                            ss.add(s);
                            break;
                        case 1:
                            s = new Shot(x + 30, y + 10, 1);
                            ss.add(s);
                            break;
                        case 2:
                            s = new Shot(x + 10, y + 30, 2);
                            ss.add(s);
                            break;
                        case 3:
                            s = new Shot(x, y + 10, 3);
                            ss.add(s);
                            break;
                        }
                        // 启动子弹线程
                        Thread t = new Thread(s);
                        t.start();
                    }
                }
            }
            // 让坦克随机产生一个新的方向
            this.direct = (int) (Math.random() * 4);
            // 判断敌人坦克是否死亡了(双等号)
            if (this.isLive == false) {
                // 让坦克死亡,后退出线程
                return;
            }

        }
    }
}

// 我的坦克
class Hero1_2 extends Tank1_2 {
    // 多个子弹,用向量创建
    Vector<Shot> ss = new Vector<Shot>();
    // 子弹
    Shot s = null;


    public Hero1_2(int x, int y) {
        super(x, y);
    }

    // 坦克开火
    public void shotEnemy() {

        switch (this.direct) {
        case 0:
            s = new Shot(x + 10, y, 0);
            // 把子弹加入向量
            ss.add(s);
            break;

        case 1:
            s = new Shot(x + 30, y + 10, 1);
            // 把子弹加入向量
            ss.add(s);
            break;

        case 2:
            s = new Shot(x + 10, y + 30, 2);
            // 把子弹加入向量
            ss.add(s);
            break;

        case 3:
            s = new Shot(x, y + 10, 3);
            // 把子弹加入向量
            ss.add(s);
            break;
        }
        // 启动子弹线程(创建线程,赶紧传参,我在这里吃了大亏!)
        Thread t = new Thread(s);
        t.start();
    }

    public void moveUp() {
        y -= speed;
    }

    public void moveRight() {
        x += speed;
    }

    public void moveDown() {
        y += speed;
    }

    public void moveLeft() {
        x -= speed;
    }
}

1.6版本(图:基本功效都曾经贯彻卡塔尔国

图片 2

后来,作者还有大概会三回九转写生机勃勃篇博客,来记录该坦克大战的终极版本(2.0卡塔 尔(英语:State of Qatar),这几个坦克战不闻不问的种类采用Java图形分界面来落实坦克的绘图,画质非常粗糙,部分的坐标没有那么标准。

关于这些坦克战争的花色是在读书Java根底的时候,拿来演练的近日来看那一个代码,以为很亲昵,就把他们…

早在一九七二年的第四次中东战役中,世界就早就领教到了反坦克导弹在今世装甲大战中的宏大成效,其射程远其精度高,基本能够变成对坦克一发入魂,那也反逼坦克自个儿为了回应今后战役做出改动。到了上世纪80时代,俄罗丝始发在坦克上海大学方装置爆炸反应装甲,其指标正是为着抵抗富含反坦克导弹在内的总体装药武器,那时基本全体苏联俄联邦大将坦克都安装了ERA,而作为苏维埃社会主义共和国联盟局地的乌Crane同样不例外,这一个ERA能够使得对抗RPG-7,9M113等反坦克军械,然而轻易被破甲弹所破坏。

图片 3

理论上来讲,二零一五年启幕的顿巴斯战不问不闻大概会像一九七四年第四遍中东大战同样,坦克的幸免不足以对抗新锐反坦克武器的抨击,然则无论俄军照旧乌军,其有着的反坦克导弹数量都严重不足,因而宿将仍然为坦克炮恐怕反坦克炮。乌军最先由于缺少反坦克武器,对付俄军装甲部队时利用了汇总火炮中远间隔射击的战术,可是在给俄军带来庞大损失的时候己方相仿损失宏大,打不起消耗战的乌军没过多长期便不再选择这种战略。

图片 4

从而令乌军绝望的是,在二〇一六年签名的《第2回菲尼克斯探讨》中,规定双方炮兵均后撤50公里,那更让俄军装甲部队变得明火执杖。事实上在顿Bath战役刚刚开打时,双方接受的坦克型号大同小异(因为东乌民兵手中的坦克基本上是从乌兵器库中抢过来的卡塔 尔(英语:State of Qatar),以T-64,T-72和少些T-80为主,但到了贰零壹肆年二月,俄军的T-72B3坦克开赴前线,再加上后来面世的微量T-90A坦克,整个装甲战视若无睹局势须臾间转败为胜。

图片 5

即便如此T-90A的多少相对少之又少,并且在使用上大都以被当做预备队来利用,但面临乌军的老旧坦克基本上处于一往直前的处境,战役已经张开了四年多,未有其余凭证表明乌军在沙场上击毁了生机勃勃辆T-90A。

图片 6

二〇一六年九月两军对决卢甘斯克,同二个月双方激战新亚速斯克,二〇一六年七月两个激战顿涅茨克飞机场,3月激战杰巴利采沃,T-90A的产出小幅度地改成了战争走向,其武器器材的125毫米主炮能够在正规应战间隔上随性所欲地干掉T-64BV以至是T-80BV,而乌军对此毫无艺术。原来双方交换比在1.5比1左右,近日乌军平均损失三辆坦克才干换取对方意气风发辆坦克的损失!间隔应战区近年来的哈尔科夫机械创设厂在二〇一六年示威运动中受到了非常的大影响,到现在生产数量也向来可是来。(利刃/陶波列夫卡塔尔

重视内容,从偏重作者开端,转发、同盟请私信联系大家。回来和讯,查看更加的多

主编:

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图