Java__线程---基础知识全面实战---坦克大战系列为例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java__线程---基础知识全面实战---坦克大战系列为例相关的知识,希望对你有一定的参考价值。

     今天想将自己去年自己编写的坦克大战的代码与大家分享一下,主要面向学习过java但对java运用并不是很熟悉的同学,该编程代码基本上涉及了java基础知识的各个方面,大家可以通过练习该程序对自己的java进行一下实战。

     每个程序版本代码中,都附有相关注释,看完注释大家就可以对本程序设计有个很明显的思路。真的很有趣,想对java重新温习的同学完全不必再对厚厚的java基础书籍进行阅读了,在跟着本次代码练习并分析后,大家一定会对java各方面基础知识 尤其是线程的知识有更深一步的了解!!!

     本次坦克大战系列的各个版本都是在一步步的升级改进,难度逐渐加大,功能愈加完善;话不多说,先给大家分享一下代码(●ˇ∀ˇ●)

Tank大战 version1.0

实现功能:
  1.绘制出我方Tank;

  2.可以通过键盘上下左右键 控制移动;

  1 package com.test;
  2 
  3 import java.awt.Color;
  4 import java.awt.Graphics;
  5 import java.awt.event.*;
  6 
  7 import javax.swing.*;
  8 
  9 
 10 public class MyTankGame extends JFrame {
 11     Mypanel mp=null;
 12     public static void main(String[] args) {
 13         // TODO 自动生成的方法存根
 14        MyTankGame mtg=new MyTankGame();
 15     }
 16     //构造函数
 17     public MyTankGame()
 18     {
 19         mp=new Mypanel();
 20         this.add(mp);
 21         this.setSize(800,600);
 22         this.setVisible(true);
 23         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 24         
 25     }
 26 
 27 }
 28 
 29 //坦克类
 30 class Tank
 31 {
 32      //表示坦克横坐标
 33     int x=0;
 34     public int getX() {
 35         return x;
 36     }
 37 
 38     public void setX(int x) {
 39         this.x = x;
 40     }
 41 
 42     public int getY() {
 43         return y;
 44     }
 45 
 46     public void setY(int y) {
 47         this.y = y;
 48     }
 49 
 50     //表示坦克纵坐标
 51     int y=0;
 52     
 53     public Tank(int x,int y)
 54     {
 55         this.x=x;
 56         this.y=y;
 57     }
 58 }
 59 
 60 //我的Tank
 61 class Hero extends Tank
 62 {
 63 
 64     public Hero(int x, int y) {
 65         super(x, y);
 66         // TODO 自动生成的构造函数存根
 67     }
 68     
 69 }
 70 
 71 
 72 //我的面板
 73 class Mypanel extends JPanel
 74 {
 75     //定义一个我的坦克
 76     Hero hero=null;
 77     
 78     //构造函数
 79     public Mypanel()
 80     {
 81         hero=new Hero(100,100);
 82     }
 83     public void paint(Graphics g)
 84     {
 85         super.paint(g);
 86         //设置面板背景色,全部填充即可,默认为黑色
 87         g.fillRect(0, 0, 800, 600);
 88         //画出我的tank,放到paint函数中
 89         this.DrawTank(hero.getX(), hero.getY(), g,0,0);//hero.getX(), hero.getY()就将x,y传过去了
 90     }
 91     
 92     //画出tank
 93     public void DrawTank(int x,int y,Graphics g,int direct,int type)
 94     {
 95         //判断是什么类型坦克
 96         switch(type)
 97         {
 98         case 0://我的tank
 99             g.setColor(Color.cyan);
100             break;
101         case 1://敌人的tank
102             g.setColor(Color.orange);
103             break;
104         }
105         //判断坦克的方向
106         switch(direct)
107         {
108         //向上
109         case 0:
110             //画出左边矩形
111             g.fill3DRect(x, y, 5, 30, false);
112             //画出右边矩形
113             g.fill3DRect(x+15, y, 5, 30, false);
114             //画出中间矩形
115             g.fill3DRect(x+5, y+5, 10, 20, false);
116             //画出中间圆形
117             g.fillOval(x+5, y+10, 10, 10);
118             //画出中间直线
119             g.fillRect(x+9, y, 2, 10);
120             break;
121         }
122     }
123 }
124 
125 /*
126                           画出左边矩形
127             g.fill3DRect(hero.getX(), hero.getY(), 5, 30, false);
128             //画出右边矩形
129             g.fill3DRect(hero.getX()+15, hero.getY(), 5, 30, false);
130             //画出中间矩形
131             g.fill3DRect(hero.getX()+5, hero.getY()+5, 10, 20, false);
132             //画出中间圆形
133             g.fillOval(hero.getX()+5, hero.getY()+10, 10, 10);
134             //画出中间直线
135             g.drawLine(hero.getX()+10, hero.getY()+15, 10, 20);
136             break;
137 
138  */
139  

 

Tank大战 version2.0

java练习---->坦克大战2.0------>引入多线程

实现功能:
  1.有敌方tank与我方tank;

  2.我方tank可以控制移动;

  3.我方tank可以发射炮弹;

  4.敌方tank未作处理;

  1 package TankGame2;
  2 
  3 import java.awt.*;
  4 import java.awt.event.KeyEvent;
  5 import java.awt.event.KeyListener;
  6 import java.util.*;
  7 import javax.swing.*;
  8 public class MyTankGame2  extends JFrame
  9 {
 10  MyPanel mp=null;
 11  public static void main(String[] args)
 12  {
 13   MyTankGame2 mytankgame1=new MyTankGame2();  
 14  }
 15  
 16  public MyTankGame2()
 17  {
 18   mp=new MyPanel();
 19   //启动mp线程
 20   
 21   Thread t=new Thread(mp);
 22   t.start();
 23   
 24   this.add(mp);
 25   this.addKeyListener(mp);
 26   
 27   this.setSize(400,300);
 28   this.setVisible(true);
 29   this.setDefaultCloseOperation(EXIT_ON_CLOSE);  
 30  }
 31 }
 32 
 33 
 34 class MyPanel extends JPanel implements KeyListener,Runnable
 35 {
 36  //定义我的坦克,成员变量
 37  Hero hero=null;
 38  
 39  //定义敌人的坦克组
 40  
 41  Vector<EnemyTank> ets=new Vector<EnemyTank>();
 42  int enSize=3;
 43  
 44  public void paint (Graphics g)
 45  {
 46    super.paint(g);
 47    g.fillRect(0,0,400,300);
 48   
 49    //画出自己的坦克
 50    this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1);
 51   
 52    //画出子弹
 53    if (hero.s!=null&&hero.s.isLive==true)
 54    {
 55     g.draw3DRect(hero.s.x, hero.s.y, 1, 1, false);
 56    
 57    }
 58   
 59   
 60    //画出敌人的坦克
 61    for(int i=0;i<ets.size();i++)
 62    {
 63    
 64     this.drawTank(ets.get(i).getX(),ets.get(i).getY(), g,ets.get(i).getDirect(), 0);
 65    
 66    }
 67  
 68  }
 69  
 70  //画出坦克函数(扩展)
 71  public void drawTank(int x,int y,Graphics g,int direct,int type)
 72  {
 73   //判断类型
 74   switch (type)
 75   {
 76   case 0:
 77    g.setColor(Color.cyan);break;
 78   case 1:
 79    g.setColor(Color.yellow);break;  
 80   }
 81   //判断方向
 82   
 83   switch(direct)
 84   {
 85   //向上
 86   case 0:
 87     //画出我的坦克(到时候再封装成一个函数)
 88     //1.画出左面的矩形
 89     //g.drawRect(hero.getX(), hero.getY(), 5, 30);
 90     g.fill3DRect(x,y,5,30,false);
 91    
 92     //2.画出右边的矩形
 93     g.fill3DRect(x+15,y,5,30,false);
 94    
 95     //3.画出坦克的中间矩形
 96     g.fill3DRect(x+5, y+5, 10, 20,false);
 97     //画出中间的圆
 98     g.fillOval(x+4, y+10,10,10);
 99     //画出线
100     g.drawLine(x+9, y+15, x+9, y);
101     break; 
102   case 1:
103    //炮筒向右
104    //画出上面的矩形
105    g.fill3DRect(x,y,30, 5, false);
106    g.fill3DRect(x, y+15, 30, 5, false);
107    g.fill3DRect(x+5, y+5, 20, 10, false);
108    g.fillOval(x+10, y+5, 10, 10);
109    g.drawLine(x+15, y+10, x+30, y+10);
110    
111    break;
112   case 2:
113    //向下
114    g.fill3DRect(x,y,5,30,false);
115    g.fill3DRect(x+15,y,5,30,false);
116    g.fill3DRect(x+5, y+5, 10, 20,false);
117    g.fillOval(x+4, y+10,10,10);
118    g.drawLine(x+10, y+15, x+10, y+30);
119    break;
120    
121   case 3:
122    //向左  
123    g.fill3DRect(x,y,30, 5, false);
124    g.fill3DRect(x, y+15, 30, 5, false);
125    g.fill3DRect(x+5, y+5, 20, 10, false);
126    g.fillOval(x+10, y+5, 10, 10);
127    g.drawLine(x+15, y+10, x, y+10);
128    break;   
129   } 
130   
131  }
132  
133  
134  public MyPanel()
135  {
136   hero=new Hero(100,100);
137   
138   //初始化敌人的坦克
139   for(int i=0;i<enSize;i++)
140   {
141    //创建敌人的坦克对象   
142    EnemyTank et=new EnemyTank((i+1)*50,0);
143    et.setColor(0);
144    et.setDirect(2);
145    ets.add(et);   
146   }
147   
148  }
149  
150  //键按下处理a表示左,s表示向下,w表示向上,d表示向右
151  public void keyPressed(KeyEvent e)
152  {
153   if(e.getKeyCode()==KeyEvent.VK_UP)
154   {
155    // 设置我的坦克的方向
156    this.hero.setDirect(0); 
157    this.hero.moveUp();
158   }
159  
160   else if (e.getKeyCode()==KeyEvent.VK_DOWN)
161   {
162    this.hero.setDirect(2);   
163    this.hero.moveDown();   
164   }
165  
166   else if (e.getKeyCode()==KeyEvent.VK_RIGHT)
167   {
168    this.hero.setDirect(1);   
169    this.hero.moveRight();
170    
171   }  
172   else if (e.getKeyCode()==KeyEvent.VK_LEFT)
173   {
174    this.hero.setDirect(3);   
175    this.hero.moveLeft();   
176   }
177   
178   if (e.getKeyCode()==KeyEvent.VK_SPACE)
179   {
180    this.hero.shotEnemy();
181    
182   }
183   
184  
185   //必须重新绘制Panel
186   this.repaint(); 
187  }
188  
189  public void keyReleased(KeyEvent e)                      //有什么用?!!!!!!!!!!!
190  {
191   
192  }
193  public void keyTyped(KeyEvent e)
194  {
195   
196  }
197  public void run()
198  {
199  //每个一百毫秒去重画子弹
200   while(true)
201   {
202    try {
203     Thread.sleep(100);
204    } catch (InterruptedException e) {
205     // TODO Auto-generated catch block
206     e.printStackTrace();
207    }
208    this.repaint();
209    
210   }
211  }
212   
213 }
214 
215
216 class Tank
217 {
218  
219  //设置坦克的速度
220  int speed=1;
221  public int getSpeed()
222  {
223   return speed;
224  }
225  public void setSpeed(int speed)
226  {
227   this.speed = speed;
228  }
229  //表示坦克的横坐标
230  int x=0;
231  //坦克的纵坐标
232  int y=0;
233  int direct=0;
234  int color;
235  
236  //坦克方向,0表示上,1表示右,2表示下,3表示左
237  public int getColor() {
238   return color;
239  }
240  public void setColor(int color) {
241   this.color = color;
242  }
243  public int getDirect()
244  {
245   return direct;
246  }
247  
248  public void setDirect(int direct)
249  {
250   this.direct = direct;
251  }
252  public Tank(int x,int y)
253  {
254   this.x=x;
255   this.y=y;  
256  }
257  
258  public int getX()
259  {
260   return x;
261  }
262  public void setX(int x)
263  {
264   this.x = x;
265  }
266  public int getY()
267  {
268   return y;
269  }
270  public void setY(int y)
271  {
272   this.y = y;
273  }
274  
275 }
276 
277 class EnemyTank extends Tank
278 {
279  public EnemyTank(int x,int y)
280  {
281   super(x,y);                                                            //super的用法???
282   
283  }
284 }
285  
286 
287 //我的坦克
288 class Hero extends Tank
289 {
290  //子弹
291  Shot s=null;
292  public Hero(int x, int y)
293  {
294   super(x,y);
295  }
296  //坦克向上移动
297  
298  //坦克的开火的能力和动作
299  public void shotEnemy()
300  {
301   switch(this.direct)
302   {
303    case 0:
304     s=new Shot(x+9,y-1,0);
305     break;
306    case 1:
307     s=new Shot(x+30,y+10,1);
308     break;
309    case 2:
310     s=new Shot(x+9,y+30,2);
311     break;
312    case 3:
313     s=new Shot(x-1,y+9,3);
314     break;
315   }
316  
317   Thread t=new Thread(s);
318   t.start();
319   
320  }
321  
322  
323  public void moveUp()
324  {
325   this.y-=speed;  
326  }
327  public void moveRight()
328  {
329   this.x+=speed;  
330  }
331  
332  public void moveDown()
333  {
334   this.y+=speed;  
335  } 
336  public void moveLeft()
337  {
338   this.x-=speed;  
339  } 
340 }
341 
342 
343 class Shot implements Runnable                                        //runnable的用法????
344 {
345  int x;
346  int y;
347  int direct;
348  int speed=1;
349  //是否活着
350  
351  boolean isLive=true;
352  public  Shot(int x,int y,int direct)
353  {
354   this.x=x;
355   this.y=y;
356   this.direct=direct;
357  }
358  public void run()
359  {
360   while(true)
361   {
362    try {
363     Thread.sleep(50);
364    } catch (InterruptedException e) {
365     e.printStackTrace();
366    }
367    
368    switch(direct)
369    {
370    case 0:
371    //向上
372     y-=speed;break;
373    case 1:
374     x+=speed;break;
375    case 2:
376     y+=speed;break;
377    case 3:
378     x-=speed;break;    
379    
380    }
381    
382    383    //判断该子弹是否碰到边缘
384    if(x<0||x>400||y<0||y>300)
385    {
386     this.isLive=false;
387     break;
388     
389    }
390    
391   }
392   
393  }
394 }

 

Tank大战 version3.0

java练习---->坦克大战3.0

实现功能:
  1.有敌方tank与我方tank;

  2.我方tank可以控制移动,可以发射炮弹;

  3.写一个函数专门判断子弹是否击中敌人坦克;

  4.判断tank是否活着;

(注:本版本中,Tank是不可以发射炮弹的······)

  1 package TankGame3;
  2 
  3 import java.awt.*;
  4 import java.awt.event.KeyEvent;
  5 import java.awt.event.KeyListener;
  6 import java.util.*;
  7 import javax.swing.*;
  8 import java.util.Vector;
  9 public class MyTankGame4  extends JFrame
 10 {
 11  MyPanel mp=null;
 12  public static void main(String[] args)
 13  {
 14   MyTankGame4 mytankgame1=new MyTankGame4();  
 15  }
 16  
以上是关于Java__线程---基础知识全面实战---坦克大战系列为例的主要内容,如果未能解决你的问题,请参考以下文章

画坦克__线程__V1__第一种方法创造线程

黑马2018年最新kotlin项目实战视频 (手机影音即时通讯黑马外卖坦克大战等)

画坦克__线程__V2__第二种方式调用

第16章 坦克大战1

Java坦克大战

第18章 坦克大战2