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__线程---基础知识全面实战---坦克大战系列为例的主要内容,如果未能解决你的问题,请参考以下文章