> 文档中心 > 坦克大战--Java实现(附源码)

坦克大战--Java实现(附源码)


整个项目,完全使用JAVA语言,从零开始,从游戏框架设计到游戏渲染,融合了Java语言的主要技术要点,对于初学者,有很大的帮助作用,作为初学者的快速提升项目恰到好处。

目录

效果展示

项目架构

功能阐述

关键代码

源码获取


效果展示

注:红色的是自己,使用方向键来控制移动,ctrl键控制发出炮弹! 

项目架构

         本程序是一个简单的坦克游戏程序,用java语言编写,在jdk 环境下运行。游戏开始时,用户通过键盘操纵坦克移动,转弯和射击,与敌人坦克进行交战,直到消灭所有敌人就可以过关。本程序包括7个类,近千行代码,和一张背景图片,背景音乐构成。

背景音乐获取地址:https://music.y444.cn/#/

随心所欲下载所有歌曲,可以更换为自己喜欢的背景音乐

功能阐述

1、通过键盘控制我方坦克移动,及发射子弹

2、敌方英雄随机移动及发射子弹

3、使用对象池存储敌方英雄

4、碰撞检测

5、敌方英雄被我方子弹打中检测,我方英雄被敌方子弹打中检测,我方英雄与敌方英雄碰撞检测,子弹打中碰撞块的检测并移除碰撞块,子弹打中子弹碰撞检测,我方与道具碰撞检测

6、随机敌方生成

7、道具生成

8、多条生命控制

9、爆炸动画、移动动画、玩家初始化动画、敌方特殊敌机动画

10、控制控制不同的敌方类型、子弹的级别、道具类型来实现对不同敌机的操作

此程序运行背景音乐即刻播放,战争的快感一触即发!

关键代码

Tankclient

import java.awt.*;import java.awt.event.*;import java.awt.image.BufferedImageOp;import java.io.File;import java.nio.channels.FileLock;import java.util.List;import java.util.ArrayList;import javax.imageio.ImageIO;import javax.swing.filechooser.FileView;public class Tankclient extends Frame {    public static final int GAME_WIDTH = 800;//定义新的常量    public static final int GAME_HEIGHT = 600;    Tank myTank = new Tank(50, 50, true, Tank.Direction.STOP, this);//定义Tank    Wall w1 = new Wall(100, 200, 20, 150, this), w2 = new Wall(300, 100, 300, 20, this);    List explodes = new ArrayList();    List missiles = new ArrayList();//利用容器加多发子弹    List tanks = new ArrayList();    Image offScreenImage = null;//定义屏幕背后背景图片    Blood b = new Blood();    private File file;    public void paint(Graphics g) { //重写paint方法 Object bg = null; Toolkit toolkit = Toolkit.getDefaultToolkit(); Image image = toolkit.getImage("data\\bg.jpeg"); g.drawImage(image, 0, 0, null);//背景图片 g.drawString("missiles count:" + missiles.size(), 10, 50); g.drawString("explodes count:" + explodes.size(), 10, 70); g.drawString("tanks count:" + tanks.size(), 10, 90); g.drawString("tanks life:" + myTank.getLife(), 10, 110); if (tanks.size() <= 0) {     for (int i = 0; i < 5; i++) {  tanks.add(new Tank(50 + 40 * (i + 1), 50, false, Tank.Direction.D, this));     } } 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);     m.draw(g);     //if(!m.isLive()) missiles.remove(m);//出界后去除这个子弹     //else m.draw(g); } for (int i = 0; i < explodes.size(); i++) {     Explode e = explodes.get(i);     e.draw(g); } for (int i = 0; i < tanks.size(); i++) {     Tank t = tanks.get(i);     t.collidesWithWall(w1);     t.collidesWithWall(w2);     t.collidesWithTanks(tanks);     t.draw(g); } myTank.draw(g); myTank.eat(b); w1.draw(g); w2.draw(g); b.draw(g);    }    public void update(Graphics g) {//调用update方法 if (offScreenImage == null) {     offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);//创建creatImage } 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);//调用paint方法 g.drawImage(offScreenImage, 0, 0, null);//图片一次性画到前面    }    public void lauchFrame() { for (int i = 0; i < 10; i++) {     tanks.add(new Tank(50 + 40 * (i + 1), 50, false, Tank.Direction.D, this)); } this.setLocation(400, 300);//左上角点出现的位置 this.setSize(GAME_WIDTH, GAME_HEIGHT);//宽800高600 this.setTitle("TankWar");//设置标题 this.addWindowListener(new WindowAdapter() {    //匿名类监听类     public void windowClosing(WindowEvent e) {    //重写父类  System.exit(0);   //正常退出     } }); this.setResizable(false);//不改变窗口大小 this.setBackground(Color.GREEN);//设置背景色 this.addKeyListener(new KeyMonitor());//键盘监听器 setVisible(true); new Thread(new PaintThread()).start();//启动线程 new Thread(new Runnable() {     @Override     public void run() {  new Music().playmusic();     } }).start();    }    public static void main(String[] args) { Tankclient tc = new Tankclient(); tc.lauchFrame();    }    private class PaintThread implements Runnable {   //内部类 public void run() {     while (true) {//不停顿循环  repaint();//调用外部包装类  try {      Thread.sleep(50);  } catch (InterruptedException e) {      e.printStackTrace();  }     } }    }    private class KeyMonitor extends KeyAdapter {     //键盘监听器类 键盘按下键 public void keyReleased(KeyEvent e) {   //键盘抬起来的键     myTank.keyReleased(e); } public void keyPressed(KeyEvent e) {     myTank.keyPressed(e); }    }}

Music

import javax.sound.sampled.*;import java.applet.*;import javax.swing.JFrame;import java.io.File;import java.net.URL;import java.net.URI;public class Music extends JFrame { // 此处Music类继承GameWindow    File f;    URL url;    URI uri;    Music() { try {     f = new File("data\\坦克大战-战斗5.wav");     uri = f.toURI();     url = f.toURL();     AudioClip aau;     aau = Applet.newAudioClip(url);     aau.loop(); } catch (Exception e) {     e.printStackTrace(); }    }    public static void playmusic() { new Music();    }}

主程序中调用

new Thread(new Runnable() {     @Override     public void run() {  new Music().playmusic();     } }).start();

注:MP3格式的音乐实现起来貌似不是很理想,转换为wav格式就好啦。

格式工厂官方网址:http://www.pcfreetime.com/formatfactory/CN/index.html

你会爱上这个工具的!!!

源码获取

https://tuomasi.lanzouu.com/i4N9F05k4xud

提取码:0000

好看字体下载