韩老师坦克大战2.0版本

编程入门 行业动态 更新时间:2024-10-28 06:25:59

韩老师<a href=https://www.elefans.com/category/jswz/34/1770038.html style=坦克大战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版本

本文发布于:2023-06-23 16:38:24,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/851795.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:坦克   大战   版本   老师

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!