坦克大战2.0版本"/>
韩老师坦克大战2.0版本
本博文源于对b站视频韩老师(韩顺平)的java学习,本章学习坦克大战2.0版本,用多线程实现,本章内容还是比较多的,先看内容效果
内容效果
开局
被打死(黄色是hero)
打死别人
源码
Bomb.java
package com.company.game3.game3;/** @author:风旗* @version1.0*/public class Bomb {int x,y;int life = 9;boolean isLive = true;public Bomb(int x,int y){this.x = x;this.y = y;}//减少生命值public void lifeDown(){if(life > 0){life--;}else{isLive = false;}}}
MyPanel.java
package com.company.game3.game3;/** @author:风旗* @version1.0*/import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;public class MyPanel extends JPanel implements KeyListener,Runnable {//hero he = null;Vector<EnemyTank> enemyTanks = new Vector<>();//125 121Vector<Bomb> bombs = new Vector<>();int enemyTankSize = 3;Image images1 = null;Image images2 = null;Image images3 = null;public MyPanel(){he = new hero(100,100);for (int i = 0; i < enemyTankSize; i++) {EnemyTank enemyTank = new EnemyTank((100 * (i + 1)), 0);enemyTank.setDirect((int)(Math.random()*4));//启动敌人坦克进程new Thread(enemyTank).start();Shot shot = new Shot(enemyTank.getX() + 20,enemyTank.getY() + 60, enemyTank.getDirect());enemyTank.shots.add(shot);new Thread(shot).start();enemyTanks.add(enemyTank);}images1 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_1.jpg"));images2 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_2.jpg"));images3 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_3.jpg"));}@Overridepublic void paint(Graphics g){super.paint(g);g.fillRect(0,0,1000,750);//画出自己坦克--封装方法if(he != null && he.isLive)drawTank(he.getX(),he.getY(),g,he.getDirect(),1);//画出敌人的坦克4// if(he.shot != null && he.shot.isLive == true){
// System.out.println("子弹被绘制");
// g.draw3DRect(he.shot.x,he.shot.y,4,4,false);
// }for(int i = 0;i<he.shots.size();i++){Shot shot = he.shots.get(i);if(shot != null && shot.isLive){g.draw3DRect(shot.x,shot.y,1,1,false);}else{he.shots.remove(shot);}}for(int i = 0;i<bombs.size();i++){Bomb bomb = bombs.get(i);if(bomb.life > 6){g.drawImage(images1,bomb.x, bomb.y, 60,60,this);}else if(bomb.life > 3){g.drawImage(images2, bomb.x,bomb.y,60,60,this);}else{g.drawImage(images3, bomb.x,bomb.y,60,60,this);}bomb.lifeDown();//如果bomb life 为0,就从bombs集合中删除if(bomb.life == 0){bombs.remove(bomb);}}for(int i =0;i<enemyTanks.size();i++){EnemyTank enemyTank = enemyTanks.get(i);if(enemyTank.isLive){drawTank(enemyTank.getX(),enemyTank.getY(),g,enemyTank.getDirect(),0);for(int j = 0;j<enemyTank.shots.size();j++){Shot shot = enemyTank.shots.get(j);if(shot.isLive){g.draw3DRect(shot.x,shot.y,1,1,false);}else{enemyTank.shots.remove(shot);}}}//if}}public void hitHero(){for(int i = 0;i<enemyTanks.size();i++){EnemyTank enemyTank = enemyTanks.get(i);for(int j = 0;j<enemyTank.shots.size();j++){Shot shot = enemyTank.shots.get(j);if(he.isLive && shot.isLive){hitTank(shot,he);}}}}public void drawTank(int x,int y,Graphics g,int direct,int type){switch(type){case 0:g.setColor(Color.cyan);break;case 1:g.setColor(Color.yellow);break;}switch (direct){case 0:g.fill3DRect(x,y,10,60,false);g.fill3DRect(x+30,y,10,60,false);g.fill3DRect(x+10,y+10,20,40,false);g.fillOval(x+10,y+20,20,20);g.drawLine(x+20,y+30,x+20,y);break;case 1:g.fill3DRect(x,y,60,10,false);//画出上边1轮子g.fill3DRect(x,y+30,60,10,false);//画出坦克下边轮子g.fill3DRect(x+10,y+10,40,20,false);//画出g.fillOval(x+20,y+10,20,20);//画出原型盖子g.drawLine(x+30,y+20,x+60,y+20);break;case 2:g.fill3DRect(x,y,10,60,false);g.fill3DRect(x+30,y,10,60,false);g.fill3DRect(x+10,y+10,20,40,false);g.fillOval(x+10,y+20,20,20);g.drawLine(x+20,y+30,x+20,y+60);break;case 3:g.fill3DRect(x,y,60,10,false);//画出上边1轮子g.fill3DRect(x,y+30,60,10,false);//画出坦克下边轮子g.fill3DRect(x+10,y+10,40,20,false);//画出g.fillOval(x+20,y+10,20,20);//画出原型盖子g.drawLine(x+30,y+20,x,y+20);break;}}public void hitEnemyTank(){for(int j = 0;j<he.shots.size();j++){Shot shot = he.shots.get(j);if(shot != null && shot.isLive){for(int i = 0;i<enemyTanks.size();i++){EnemyTank enemyTank = enemyTanks.get(i);hitTank(shot,enemyTank);}}}}public void hitTank(Shot s, Tank tank){switch (tank.getDirect()){case 0:case 2:if(s.x > tank.getX() && s.x < tank.getX() + 40&& s.y > tank.getY() && s.y < tank.getY() + 60){s.isLive = false;tank.isLive = false;enemyTanks.remove(tank);Bomb bomb = new Bomb(tank.getX(),tank.getY());bombs.add(bomb);}break;case 1:case 3:if(s.x > tank.getX() && s.x < tank.getX() + 60&& s.y > tank.getY() && s.y < tank.getY() + 40){s.isLive = false;tank.isLive = false;}break;}}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {if(e.getKeyCode() == KeyEvent.VK_W){he.setDirect(0);//上if(he.getY() > 0)he.moveUp();}else if(e.getKeyCode() == KeyEvent.VK_A){he.setDirect(3);//左if(he.getX() >0 )he.moveLeft();} else if(e.getKeyCode() == KeyEvent.VK_S) {he.setDirect(2);//下if(he.getY() + 110 < 750)he.moveDown();}else if(e.getKeyCode() == KeyEvent.VK_D){he.setDirect(1);//右if(he.getX() + 80 < 1000)he.moveRight();}if(e.getKeyCode() == KeyEvent.VK_J){//一颗子弹// if(he.shot == null || !he.shot.isLive)
// he.shotEnemyTank();he.shotEnemyTank();}this.repaint();}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void run() {while (true) {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}
// if(he.shot != null && he.shot.isLive){
// for(int i = 0;i<enemyTanks.size();i++){
// EnemyTank enemyTank = enemyTanks.get(i);
// hitTank(he.shot,enemyTank);
// }
// }hitEnemyTank();hitHero();this.repaint();}}
}
Tank.java
package com.company.game3.game3;/** @author:风旗* @version1.0*/public class Tank {private int x;private int y;private int direct;private int speed=1;boolean isLive = true;public void moveUp(){y -= speed;}public void moveRight(){x+=speed;}public void moveDown(){y+=speed;}public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}public void moveLeft(){x-=speed;}public int getDirect() {return direct;}public void setDirect(int direct) {this.direct = direct;}public Tank(int x, int y) {this.x = x;this.y = y;}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;}
}
Shot.java
package com.company.game3.game3;/** @author:风旗* @version1.0*/public class Shot implements Runnable{int x; //子弹x坐标int y; //子弹y坐标int direct = 0; // 子弹方向int speed = 2; // 子弹难度boolean isLive = true; //子弹是否存活public Shot(int x, int y, int direct) {this.x = x;this.y = y;this.direct = direct;}@Overridepublic void run() {while (true) {try {Thread.sleep(10);} catch (InterruptedException e) {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 <= 1000 && y >= 0 && y <= 750) && isLive){isLive = false;break;}}}
}
HshTankGame02
package com.company.game3.game3;/** @author:风旗* @version1.0*/import javax.swing.*;public class HshTankGame02 extends JFrame {MyPanel mp = null;public static void main(String[] args) {HshTankGame02 hspTank = new HshTankGame02();}public HshTankGame02(){mp = new MyPanel();Thread thread = new Thread(mp);thread.start();this.add(mp);this.setSize(1000,750);this.addKeyListener(mp);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}
}
hero
package com.company.game3.game3;/** @author:风旗* @version1.0*/import java.util.Vector;public class hero extends Tank {public Vector<Shot> shots = new Vector<>();Shot shot = null;public hero(int x, int y) {super(x, y);}public void shotEnemyTank(){if(shots.size() == 5){return ;}switch (getDirect()){case 0:shot = new Shot(getX() + 20,getY(),0);break;case 1:shot = new Shot(getX() + 60,getY() + 20,1);break;case 2:shot = new Shot(getX() + 20,getY() + 60,2);break;case 3:shot = new Shot(getX(),getY() + 20,3);break;}shots.add(shot);new Thread(shot).start();}
}
EnemyTank.java
package com.company.game3.game3;/** @author:风旗* @version1.0*/import java.util.Vector;public class EnemyTank extends Tank implements Runnable{Vector<Shot> shots = new Vector<>();public boolean isLive = true;public EnemyTank(int x,int y){super(x,y);}@Overridepublic void run() {while(true){if(isLive && shots.size() < 50){Shot s = null;switch (getDirect()){case 0:s = new Shot(getX() + 20,getY(),0);break;case 1://右边s = new Shot(getX() + 60,getY()+20,1);break;case 2:s = new Shot(getX() + 20,getY()+60,2);break;case 3:s = new Shot(getX(),getY()+20,3);break;}shots.add(s);new Thread(s).start();}switch (getDirect()){case 0://上for (int i = 0;i<30;i++) {try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}if(getY() > 0){moveUp();}}break;case 1://右边for (int i = 0;i<30;i++) {try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}if (getX() < 920) {moveRight();}}break;case 2:for (int i = 0;i<30;i++) {try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}if (getY() + 110 < 750) {moveDown();}}break;case 3:for (int i = 0;i<30;i++) {try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}if (getX() > 0 ) {moveLeft();}}break;}try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}setDirect((int)(Math.random()*4));if(!isLive)break;}}
}//在敌人坦克类,使用vector保存多个shot
//当每创建一个敌人坦克坦克对象,给该敌人坦克对象初始化一个shot对象,同时启动shot
//在绘制敌人坦克时,需要变量敌人坦克对象Vector绘制所有子弹,当子弹isLive == false时
//就从vector移除//让敌人坦克也可以自由随机的上下左右移动
//因为要求敌人的坦克,可以自由移动,因此需要将敌人坦克当做线程调用
//我们需要Enemy
更多推荐
韩老师坦克大战2.0版本
发布评论