坦克大战--Java实现(附源码)
整个项目,完全使用JAVA语言,从零开始,从游戏框架设计到游戏渲染,融合了Java语言的主要技术要点,对于初学者,有很大的帮助作用,作为初学者的快速提升项目恰到好处。
目录
效果展示
项目架构
功能阐述
关键代码
源码获取
效果展示
注:红色的是自己,使用方向键来控制移动,ctrl键控制发出炮弹!
项目架构
本程序是一个简单的坦克游戏程序,用java语言编写,在jdk 环境下运行。游戏开始时,用户通过键盘操纵坦克移动,转弯和射击,与敌人坦克进行交战,直到消灭所有敌人就可以过关。本程序包括7个类,近千行代码,和一张背景图片,背景音乐构成。
背景音乐获取地址:https://music.y444.cn/#/
随心所欲下载所有歌曲,可以更换为自己喜欢的背景音乐
功能阐述
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