本博文源于对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版本相关推荐

  1. 韩顺平坦克大战项目0.2(画坦克并且移动)

    文章目录 1.java绘图技术 (1)画框框 (2)画布 (3)画个坦克,封装在画布的一个方法里 2.事件控制(监听)(坦克移动) 1.java绘图技术 简单来说,就是先要一个框,在上面加载画布 画布 ...

  2. java版坦克大战_JAVA实现坦克大战1.0版本

    1 packagetankGame;2 import java.awt.*;3 import javax.swing.*;4 import java.awt.event.*;5 import java ...

  3. 韩顺平老师坦克大战优化版

    一.项目介绍 1.前言 基于韩顺平老师坦克大战的框架和思路,进行了一些优化.编码上尽量按照阿里的代码规约:有非常详尽的注释:引入了线程池,线程安全集合类,原子类等:通过这个小项目的学习,可以深入地理解 ...

  4. 坦克大战2.0,3.0,4.0版本

    1.坦克大战 0.3 在坦克大战游戏(0.2版)基础上添加如下功能:当玩家按一下j键,就发射一颗子弹. 编写Shot类 package com.yt.tankgame03;/*** 射击子弹*/ pu ...

  5. [ java ] 坦克大战 5.0 ~ 最终完整版

    坦克大战5.0 新增功能内容:(加入IO流内容) 防止敌坦克间重叠 击杀数显示 保存上局游戏进度–>两种开局方式 加入开局音乐 修复记录文件丢失后的异常 5.0版本为最终版 提示:爆炸图片需自行 ...

  6. 运用Python+Pygame开发坦克大战游戏_版本V1.01

    这里写目录标题 一.项目整体说明 二.pygame下载方式 三.项目文件 1.坦克大战_框架_1.py 2.坦克大战_开始游戏_窗口设置_2.py 3.坦克大战_事件检测_3.py 4.坦克大战_基本 ...

  7. 韩顺平老师坦克大战项目总结

    韩顺平老师讲的坦克大战项目,用代码进行了复现,有几个自己的总结 1 有个别功能没有实现,EnemyTank中敌人坦克向四周移动功能没有实现,只是实现了随机转向,但一直停在原地不动,没有找到bug所在. ...

  8. C语言(C++)复刻《坦克大战2.0》

    本人代码的编写基于以下博主的代码之上,进行编写. C语言坦克大战_Rivival_S 的博客-CSDN博客_c语言坦克大战r 基于这位博主还原的红白游戏机的经典内容,我在此基础上,又进行了一系列的改进 ...

  9. Java 项目实战 坦克大战 (0)--前言

    做了有一个星期了,java语言太强大了,也算是学得最认真的一门语言了,本次课设花的心思也就比较多了.关键总是追求完美总是想原创,最终做出来效果不错,但感觉代码逻辑很乱,今天开始就好好整理一番,以教程形 ...

最新文章

  1. python代码案例详解-Python之入门基础字典案例详解,新手必学
  2. 恶心的openssl。。。
  3. POJ4449(三维凸包+空间坐标旋转+二维凸包)
  4. 信息学奥赛一本通C++语言——1047:判断能否被3,5,7整除
  5. 网站对战服务器,PVP核心精华:三大服务器对战
  6. RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践
  7. windows远程桌面神器
  8. 【原创】黑群晖向白群晖 DS920+ 迁移
  9. linux安装通用plsql数据库,linux centOs中安裝好數據庫,客戶端用plsql連接oracle
  10. Django序列化django REST framework
  11. 时间序列分析 23 DTW (时序相似度度量算法) 上
  12. php 数值转时间格式,php数值转换时间及时间转换数值用法示例
  13. axure 元件_Axure动态面板(上下左右滑动页面)
  14. 深信服应用交付(AD)学习笔记
  15. OAuth协议(三方登录授权)
  16. 是学不会的OD啊(一)->初次见面,请多指教
  17. Unity中的Transform Gizmo中的Pivot和Center
  18. xUtils3.x的网络请求封装和请求https之单向SSL验证
  19. 域名一块钱,你敢用吗?可靠性如何保障?
  20. 文本溢出显示省略号,鼠标浮动查看全部内容

热门文章

  1. 柳传志:联想发展过程中的三大突破
  2. 官宣:申请学位不与发表论文简单挂钩!
  3. Dota 2 with Large Scale Deep Reinforcement Learning翻译
  4. python兔子编程_少儿编程分享:手把手教你用PYTHON编写兔獾大作战(一)
  5. 音频声学相关的常用缩略语
  6. 数据结构测试题——树和二叉树(一)
  7. java common log使用,log4j和commons.logging日志记录的使用方法
  8. talib.APO绝对价格振荡器指标详解
  9. 陌陌八成营收靠直播 直播行业已进入两极分化
  10. 关于版本号的基本介绍