前面文章有详细游戏制作过程和每个过程代码,有想学习制作思想和过程的可以浏览一下前面文章。

下面提供游戏全部代码。

游戏界面

文件共有5个类

墙类

import java.awt.*;public class Wall {int x,y,w,h;TankClient tc;public Wall(){super();}public Wall(int x,int y,int w,int h,TankClient c){super();this.x = x;this.y = y;this.w = w;this.h = h;this.tc = tc;}public void draw(Graphics g){g.fillRect(x,y,w,h);}public Rectangle getRect(){//碰撞检测return new Rectangle(x,y,w,h);}
}

血包类

import java.awt.*;
public class Blood {int x,y,w,h;TankClient tc;int step = 0;private boolean live = true;//血包的生命周期,被使用后消失private int[][] pos ={//血包移动的七个位置{350,300},{360,300},{375,275},{400,200},{360,270},{365,290},{340,280}};public Blood(){x = pos[0][0];y = pos[0][1];w = h = 15;}public void draw(Graphics g){if(!live) return;Color c = g.getColor();g.setColor(Color.magenta);g.fillRect(x,y,w,h);g.setColor(c);move();}public void move(){step++;if(step == pos.length){step = 0;}x = pos[step][0];y = pos[step][1];}public Rectangle getRect(){//血包碰撞检测return new Rectangle(x,y,w,h);}public boolean isLive(){return live;}public void setLive(boolean live){this.live = live;}
}

子弹类

import java.awt.*;
import java.util.List;
public class Missile {int x,y;public static final int WIDTH = 10;//子弹的宽public static final int HEIGHT = 10;//子弹的高public static final int XSPEED = 10;//子弹移动速度public static final int YSPEED = 10;Tank.Direction dir;private boolean live = true;//子弹的状态private TankClient tc;private boolean good;//标记友方和敌方子弹身份public Missile(int x,int y,Tank.Direction dir){super();this.x = x;this.y = y;this.dir = dir;}public Missile(int x,int y,boolean good,Tank.Direction dir,TankClient tc){this(x,y,dir);this.good = good;this.tc =tc;}public void draw(Graphics g){if(!live){tc.missiles.remove(this);return;}Color c = g.getColor();g.setColor(Color.black);g.fillOval(x,y,WIDTH,HEIGHT);g.setColor(c);move();}private void move() {switch (dir) {case L:x -= XSPEED;break;case LU:x -= XSPEED;y -= YSPEED;break;case U:y -= XSPEED;break;case RU:x += XSPEED;y -= YSPEED;break;case R:x += XSPEED;break;case RD:x += XSPEED;y += YSPEED;break;case D:y += XSPEED;break;case LD:x -= XSPEED;y += YSPEED;break;case STOP:break;}//子弹越界if(x<0||y<0||x>TankClient.GAME_WIDTH||y>TankClient.GAME_HEIGHT){live = false;}}public Rectangle getRect(){//获得子弹大小范围return new Rectangle(x,y,WIDTH,HEIGHT);}public boolean hitTank(Tank t){//子弹碰撞检测if(this.live&&this.good!=t.isGood()&&getRect().intersects(t.getRect())&&t.isLive()){if(t.isGood()){this.live = false;t.setLife(t.getLife()-20);if(t.getLife()<=0){t.setLive(false);}else{t.setLive(true);}}else{t.setLive(false);this.live = false;}return true;}return false;}public boolean hitTanks(List<Tank> tanks){for(int i = 0;i<tanks.size();i++){if(hitTank(tanks.get(i))){return true;}}return false;}public boolean hitWall(Wall w){//子弹撞墙检测if(this.live&&this.getRect().intersects(w.getRect())){this.live = false;return true;}return false;}
}

坦克类

import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.List;
import java.util.Random;public class Tank {int x, y;//表示坦克实时坐标public static final int WIDTH = 30;//坦克宽public static final int HEIGHT = 30;//坦克高private static final int XSPEED = 5;//坦克向x轴方向移动像素即速度private static final int YSPEED = 5;//坦克向y轴方向移动像素即速度private boolean bL = false,bU = false,bR = false,bD = false;//使坦克可以斜着走enum Direction {L,LU,U,RU,R,RD,D,LD,STOP//表示移动的八个方向}private Direction dir = Direction.STOP;//默认停止TankClient tc;private Direction ptDir = Direction.D;//子弹发射方向private boolean good;//坦克身份private boolean live = true;//坦克状态private static Random r = new Random();//坦克移动轨迹private int step = r.nextInt(12)+3;//坦克走3-14步后改变方向private int oldX,oldY;//坦克撞墙前的位置private int life = 100;//己方坦克血量private BloodBar bb =new BloodBar();private class BloodBar{public void draw(Graphics g){Color c = g.getColor();g.setColor(Color.RED);g.drawRect(x,y-10,WIDTH,10);//中空框int w = WIDTH*life/100;g.fillRect(x,y-10,w,10);//计算剩余血量填充方框g.setColor(c);}}public Tank(int x, int y,boolean good) {super();this.x = x;this.y = y;this.good = good;}public Tank(int x,int y,boolean good,TankClient tc){this(x,y,good);this.tc = tc;}public void draw(Graphics g)//调用画笔画出坦克{if(!live){if(!good){tc.tanks.remove(this);}return;}Color c = g.getColor();if(good)g.setColor(Color.RED);else g.setColor(Color.blue);g.fillOval(x, y, WIDTH, HEIGHT);//画椭圆作为坦克,x和y是围绕椭圆的矩形的左上角的x和y轴坐标; width是椭圆的宽度; height是椭圆的高度g.setColor(c);if(good)bb.draw(g);move();switch (ptDir){//根据子弹方向来画炮筒case L:g.drawLine(x+Tank.WIDTH/2,y+Tank.HEIGHT/2,x,y+Tank.HEIGHT/2);break;//x,y在坦克矩形的左上角case LU:g.drawLine(x+Tank.WIDTH/2,y+Tank.HEIGHT/2,x,y);break;case U:g.drawLine(x+Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.WIDTH/2,y);break;case RU:g.drawLine(x+Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.WIDTH,y);break;case R:g.drawLine(x+Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.WIDTH,y+Tank.HEIGHT/2);break;case RD:g.drawLine(x+Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.WIDTH,y+Tank.HEIGHT);break;case D:g.drawLine(x+Tank.WIDTH/2,y+Tank.HEIGHT/2,x+Tank.WIDTH/2,y+Tank.HEIGHT);break;case LD:g.drawLine(x+Tank.WIDTH/2,y+Tank.HEIGHT/2,x,y+Tank.HEIGHT);break;}}private void move() {oldX = x;oldY = y;switch (dir) {case L:x -= XSPEED;break;case LU:x -= XSPEED;y -= YSPEED;break;case U:y -= XSPEED;break;case RU:x += XSPEED;y -= YSPEED;break;case R:x += XSPEED;break;case RD:x += XSPEED;y += YSPEED;break;case D:y += XSPEED;break;case LD:x -= XSPEED;y += YSPEED;break;case STOP:break;}if(this.dir != Direction.STOP){//排除坦克停止时的情况this.ptDir = this.dir;//使子弹发射的方向为其余八个方向}//阻止坦克越界if(x<0) x = 0;if(y<30) y = 30;if(x+Tank.WIDTH>TankClient.GAME_WIDTH) x = TankClient.GAME_WIDTH-Tank.WIDTH;if(x+Tank.HEIGHT>TankClient.GAME_HEIGHT) x = TankClient.GAME_HEIGHT-Tank.HEIGHT;//敌方坦克移动if(!good){Direction[] dirs = Direction.values();if(step == 0){step = r.nextInt(12)+3;//随机走3-14步int m = r.nextInt(dirs.length);//方向数组下标,0-8dir = dirs[m];}step--;if(r.nextInt(40)>38)this.fire();//设置随机开火的概率}}public void keyPressed(KeyEvent e){int key = e.getKeyCode();switch (key){case KeyEvent.VK_A:bL=true;break;case KeyEvent.VK_D:bR=true;break;case KeyEvent.VK_W:bU=true;break;case KeyEvent.VK_S:bD=true;break;}locateDirection();}private Missile fire(){int x = this.x+Tank.WIDTH/2-Missile.WIDTH/2;//子弹相对坦克发出的位置int y = this.y+Tank.HEIGHT/2-Missile.HEIGHT/2;Missile m = new Missile(x,y,good,ptDir,tc);tc.missiles.add(m);return m;}private Missile fire(Direction dir){//增加发射方法if(!live)return null;int x = this.x+Tank.WIDTH/2-Missile.WIDTH/2;//子弹相对坦克发出的位置int y = this.y+Tank.HEIGHT/2-Missile.HEIGHT/2;Missile m = new Missile(x,y,good,dir,tc);tc.missiles.add(m);//集合,存放多个子弹return m;}private void superFire(){//超级发射Direction[] dirs = Direction.values();for(int i = 0;i<8;i++){fire(dirs[i]);}}public void keyReleased(KeyEvent e){int key = e.getKeyCode();switch (key){case KeyEvent.VK_J:fire();break;//不在按下,在抬手时发出子弹case KeyEvent.VK_K:superFire();break;case KeyEvent.VK_A:bL=false;break;case KeyEvent.VK_D:bR=false;break;case KeyEvent.VK_W:bU=false;break;case KeyEvent.VK_S:bD=false;break;case KeyEvent.VK_L:if(!this.live){this.live = true;this.life = 100;};break;}locateDirection();}private void locateDirection() {if(bL&&!bU&&!bR&&!bD)dir = Direction.L;else if(bL&&bU&&!bR&&!bD)dir = Direction.LU;else if(!bL&&bU&&!bR&&!bD)dir = Direction.U;else if(!bL&&bU&&bR&&!bD)dir = Direction.RU;else if(!bL&&!bU&&bR&&!bD)dir = Direction.R;else if(!bL&&!bU&&bR&&bD)dir = Direction.RD;else if(!bL&&!bU&&!bR&&bD)dir = Direction.D;else if(bL&&!bU&&!bR&&bD)dir = Direction.LD;else if(!bL&&!bU&&!bR&&!bD)dir = Direction.STOP;}public Rectangle getRect(){//坦克大小范围return new Rectangle(x,y,WIDTH,HEIGHT);}public void setLive(boolean live){this.live = live;}public boolean isLive(){return live;}public boolean isGood(){return good;}public void stay(){//坦克撞墙回退y = oldY;x = oldX;}public boolean collidesWidthWall(Wall w){//坦克撞墙检测if(this.live&&this.getRect().intersects(w.getRect())){this.stay();return true;}return false;}public int getLife(){return life;}public void setLife(int life){this.life = life;}public boolean eat(Blood b){if(this.live && b.isLive()&&this.getRect().intersects(b.getRect())){this.life = 100;b.setLive(false);return true;}return false;}
}

主类

import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;public class TankClient extends JFrame{public static final int GAME_WIDTH = 800;public static final int GAME_HEIGHT = 600;int x = 50,y = 50;//坦克初始坐标Tank myTank = new Tank(x,y,true,this);Image offScreenImage = null;//创建虚拟空间Missile m = null;//子弹List<Missile> missiles =new ArrayList<Missile>();//存放子弹的集合
//    Tank enemyTank = new Tank(50,100,false,this);List<Tank> tanks = new ArrayList<Tank>();//存放敌方坦克集合Wall w1 = new Wall(100,200,20,150,this);Wall w2 = new Wall(300,100,300,20,this);Blood b = new Blood();//血包public static void main(String[] args) {TankClient tc = new TankClient();tc.lauchFrame();}private void lauchFrame(){setLocation(300,50);setSize(GAME_WIDTH,GAME_HEIGHT);setTitle("坦克大战");getContentPane().setBackground(Color.white);getContentPane().setVisible(true);setVisible(true);setResizable(false);addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){System.exit(0);}});new Thread(new PaintThread()).start();addKeyListener(new KeyMonitor());//键盘监听事件for(int i = 0;i<10;i++){//创建10个敌方坦克tanks.add(new Tank(50+40*(i+1),50,false,this));}}public void paint(Graphics g){super.paint(g);myTank.draw(g);
//        enemyTank.draw(g);w1.draw(g);w2.draw(g);myTank.collidesWidthWall(w1);myTank.collidesWidthWall(w2);b.draw(g);myTank.eat(b);g.drawString("子弹数量:"+missiles.size(),10,50);for(int i = 0;i<missiles.size();i++){Missile m = missiles.get(i);m.hitTanks(tanks);m.hitTank(myTank);m.hitWall(w1);m.hitWall(w2);if(tanks.size()<=0){//如果敌方坦克数量小于等于0for(int j = 0;j<10;j++){//创建十辆地方坦克tanks.add(new Tank(50+40*(j+1),50,false,this));}}m.draw(g);}g.drawString("敌方坦克数量:"+tanks.size(),10,90);for(int i = 0;i<tanks.size();i++){Tank t = tanks.get(i);t.collidesWidthWall(w1);t.collidesWidthWall(w2);t.draw(g);}g.drawString("tank life:"+myTank.getLife(),10,110);//窗口左上角显示坦克血量}public void update(Graphics g){super.update(g);if(offScreenImage == null)offScreenImage = createImage(GAME_WIDTH,GAME_HEIGHT);//新建区域Graphics gOffScreen = offScreenImage.getGraphics();//取出画笔Color c = gOffScreen.getColor();//提取背景色gOffScreen.setColor(Color.GREEN);gOffScreen.fillRect(0,0,GAME_WIDTH,GAME_HEIGHT);gOffScreen.setColor(c);//恢复原色paint(gOffScreen);g.drawImage(offScreenImage,0,0,null);//画笔从off虚拟区域的0,0点开始画}private class PaintThread implements Runnable{public void run(){while (true){repaint();try {Thread.sleep(100);}catch (Exception e){e.printStackTrace();}}}}public class KeyMonitor extends KeyAdapter {public void keyPressed(KeyEvent e){super.keyPressed(e);myTank.keyPressed(e);}public void keyReleased(KeyEvent e){super.keyReleased(e);myTank.keyReleased(e);}}}

【JAVA】-- 坦克大战全部代码相关推荐

  1. java坦克大战最终代码

    package tanke.game;import javax.swing.*; import java.util.Vector;public class enemytank extends tank ...

  2. java 坦克大战_java课程设计之坦克大战

    本文实例为大家分享了java坦克大战的具体代码,供大家参考,具体内容如下 环境要求: 操作系统:Windows 10 JAVA虚拟机:JDK1.8以上 开发环境:Eclipse(4.5以上) 功能提示 ...

  3. java坦克大战课设报告_java课程设计之坦克大战

    本文实例为大家分享了java坦克大战的具体代码,供大家参考,具体内容如下 环境要求: 操作系统:Windows 10 JAVA虚拟机:JDK1.8以上 开发环境:Eclipse(4.5以上) 功能提示 ...

  4. C#坦克大战网络版代码

    简单C#坦克大战网络版代码 写完单机版 [url=http://blog.csdn.net/xiaoxiao108/archive/2010/12/18/6084473.aspx]http://blo ...

  5. java坦克大战总体功能设计_Java坦克大战设计报告.doc

    Java坦克大战设计报告.doc <语言设计> 设计报告 信息工程学院专业班级:::指导老师:2011年7月22日 目录 目录2 题目一 坦克大战4 1.1题目简介4 1.2设计的内容.要 ...

  6. Java坦克大战,基于Swing编写很哇塞的小游戏,可以做课程设计毕业设计

    Java坦克大战,基于Swing编写很哇塞的小游戏,可以做课程设计毕业设计 有图有真相 操作方法:ASDW控制移动,鼠标控制炮筒旋转,鼠标左键开枪,空格发射炮弹, 开发思路是标准的游戏开发思路,单线程 ...

  7. Java坦克大战游戏源码(java坦克大战)

    Java坦克大战游戏源码(java坦克大战) public Swingtest002() {// 设置标题setTitle("请登陆");// 绝对布局setLayout(null ...

  8. 100行JS代码实现❤坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript )

    坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript ) HTML5坦克大战网页小游戏,完美还原小霸王学习机效果,以坦克战斗及保卫基地为主题,属于策略型类游戏. ...

  9. java简单坦克大战制作代码

    转载自:http://www.jb51.net/article/88317.htm 利用Java语言中的集合.Swing.线程等知识点编写一个坦克大战游戏. (1) 画出敌我坦克的原理: 在坦克类里面 ...

  10. java坦克大战登录界面设计_基于JAVA的坦克大战设计和实现-代码.doc

    JISHOU UNIVERSITY 本科生毕业设计 题 目:基于JAVA的坦克大战设计与实现作 者:学 号:所属学院:专业年级:指导教师:职 称:完成时间:2012年5月7日 吉首大学 基于JAVA的 ...

最新文章

  1. 机器学习特征工程之特征缩放+无量纲化:最大绝对值缩放(MaxAbsScaler)
  2. mysql主从复制原理详解_MySQL主从复制没使用过?三大步骤让你从原理、业务上理解透彻...
  3. Nginx 静态文件 location 指定
  4. spring security 允许 iframe 嵌套
  5. mitmproxy https抓包的原理是什么?
  6. dll文件懒加载_dll编写与使用操作手册
  7. [转] 算法学习之字符串左移和右移
  8. linux基础期末考,Linux基础期末考试试题.pdf
  9. Arduino_Core_STM32---pinMode()实现分析
  10. 搜狗批量推送软件-搜狗批量推送工具【2022最新】
  11. MapReduce的核心资料索引
  12. 维度诅咒_维度的诅咒减去行话的诅咒
  13. 追问顶刊 | 独家专访《科学》最新研究:老年为何出现睡眠碎片化?
  14. 微信小程序开发的一些注意事项记录
  15. 双轮载人平衡车设计完整教程之调校测试篇
  16. 以太坊手续费详细分析
  17. CSDN有哪些值得学习的专栏?
  18. android studio视频路径,Android studio相关设置及实现存在于工程目录中的视频播放...
  19. ContentProvider介绍
  20. 【Python爬虫系列教程 28-100】小姐姐带你入门爬虫框架Scrapy、 使用Scrapy框架爬取糗事百科段子

热门文章

  1. 有关csdn博客账号注销说明
  2. 德芙网络营销策略ppt_看德芙网络营销策划经典案例,戳这里!
  3. 搜狗输入法 rpm包_输入法哪个好用?2019年终横评来袭
  4. 虚拟机安装BackTrack 5 的教程详解!
  5. linux超级终端root权限,linux超级终端命令
  6. Oracle数据库:下载与安装图解
  7. 测试webtrends的Refer
  8. 中国史上最牛的网管——李兴平
  9. 神仙打架?苹果短暂撤销 Facebook 和 Google 的企业证书
  10. 启动dubbo-admin遇到的那些坑