韩老师坦克大战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版本相关推荐
- 韩顺平坦克大战项目0.2(画坦克并且移动)
文章目录 1.java绘图技术 (1)画框框 (2)画布 (3)画个坦克,封装在画布的一个方法里 2.事件控制(监听)(坦克移动) 1.java绘图技术 简单来说,就是先要一个框,在上面加载画布 画布 ...
- java版坦克大战_JAVA实现坦克大战1.0版本
1 packagetankGame;2 import java.awt.*;3 import javax.swing.*;4 import java.awt.event.*;5 import java ...
- 韩顺平老师坦克大战优化版
一.项目介绍 1.前言 基于韩顺平老师坦克大战的框架和思路,进行了一些优化.编码上尽量按照阿里的代码规约:有非常详尽的注释:引入了线程池,线程安全集合类,原子类等:通过这个小项目的学习,可以深入地理解 ...
- 坦克大战2.0,3.0,4.0版本
1.坦克大战 0.3 在坦克大战游戏(0.2版)基础上添加如下功能:当玩家按一下j键,就发射一颗子弹. 编写Shot类 package com.yt.tankgame03;/*** 射击子弹*/ pu ...
- [ java ] 坦克大战 5.0 ~ 最终完整版
坦克大战5.0 新增功能内容:(加入IO流内容) 防止敌坦克间重叠 击杀数显示 保存上局游戏进度–>两种开局方式 加入开局音乐 修复记录文件丢失后的异常 5.0版本为最终版 提示:爆炸图片需自行 ...
- 运用Python+Pygame开发坦克大战游戏_版本V1.01
这里写目录标题 一.项目整体说明 二.pygame下载方式 三.项目文件 1.坦克大战_框架_1.py 2.坦克大战_开始游戏_窗口设置_2.py 3.坦克大战_事件检测_3.py 4.坦克大战_基本 ...
- 韩顺平老师坦克大战项目总结
韩顺平老师讲的坦克大战项目,用代码进行了复现,有几个自己的总结 1 有个别功能没有实现,EnemyTank中敌人坦克向四周移动功能没有实现,只是实现了随机转向,但一直停在原地不动,没有找到bug所在. ...
- C语言(C++)复刻《坦克大战2.0》
本人代码的编写基于以下博主的代码之上,进行编写. C语言坦克大战_Rivival_S 的博客-CSDN博客_c语言坦克大战r 基于这位博主还原的红白游戏机的经典内容,我在此基础上,又进行了一系列的改进 ...
- Java 项目实战 坦克大战 (0)--前言
做了有一个星期了,java语言太强大了,也算是学得最认真的一门语言了,本次课设花的心思也就比较多了.关键总是追求完美总是想原创,最终做出来效果不错,但感觉代码逻辑很乱,今天开始就好好整理一番,以教程形 ...
最新文章
- python代码案例详解-Python之入门基础字典案例详解,新手必学
- 恶心的openssl。。。
- POJ4449(三维凸包+空间坐标旋转+二维凸包)
- 信息学奥赛一本通C++语言——1047:判断能否被3,5,7整除
- 网站对战服务器,PVP核心精华:三大服务器对战
- RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践
- windows远程桌面神器
- 【原创】黑群晖向白群晖 DS920+ 迁移
- linux安装通用plsql数据库,linux centOs中安裝好數據庫,客戶端用plsql連接oracle
- Django序列化django REST framework
- 时间序列分析 23 DTW (时序相似度度量算法) 上
- php 数值转时间格式,php数值转换时间及时间转换数值用法示例
- axure 元件_Axure动态面板(上下左右滑动页面)
- 深信服应用交付(AD)学习笔记
- OAuth协议(三方登录授权)
- 是学不会的OD啊(一)->初次见面,请多指教
- Unity中的Transform Gizmo中的Pivot和Center
- xUtils3.x的网络请求封装和请求https之单向SSL验证
- 域名一块钱,你敢用吗?可靠性如何保障?
- 文本溢出显示省略号,鼠标浮动查看全部内容