整个项目,完全使用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);//定义TankWall w1 = new Wall(100, 200, 20, 150, this), w2 = new Wall(300, 100, 300, 20, this);List<Explode> explodes = new ArrayList<Explode>();List<Missile> missiles = new ArrayList<Missile>();//利用容器加多发子弹List<Tank> tanks = new ArrayList<Tank>();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高600this.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() {@Overridepublic 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类继承GameWindowFile 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() {@Overridepublic void run() {new Music().playmusic();}}).start();

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

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

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

源码获取

https://tuomasi.lanzouu.com/i4N9F05k4xud

提取码:0000

坦克大战--Java实现(附源码)相关推荐

  1. 用pygame做经典坦克大战游戏(附源码)

    首先,我们得分析这个项目的结构,设计出它的框架 坦克大战游戏项目开发 需求分析 1.分析项目需要多少个类 2.分析每个类有哪些方法 1.坦克类(敌方坦克,我方坦克) 移动.射击.展示 2.子弹类 移动 ...

  2. Python实现飞机大战-第二部分(附源码、素材、超详细教程)

    飞机大战第二部分 1.前言 2.飞机射击 2.1.添加子弹的相关设置 2.2.创建文件bullet.py 2.3.修改game_functions.py 2.4.修改mian.py 2.5.射击效果 ...

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

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

  4. 《游戏学习》JAVA版坦克大战课程设计及源码

    1.功能设计 游戏要有图形用户界面,界面能够反映游戏所有的细节. 界面中要有坦克,墙,树林,河流. 界面中要有一个"家","家"被攻击中则输了游戏. 坦克分两种 ...

  5. 《Java语言程序设计——坦克大战单机游戏》源码以及实验报告

    一.引言 游戏本身是一种娱乐方式,带给人无尽的乐趣,而且游戏行业的发展前景也将会是是带动周边相关行业的发展.为了去满足不同的游戏爱好者的要求,对做游戏开发的人的要求也会越来越高.本次Java语言程序设 ...

  6. 从零接入微信公众号(Java实现 附源码)

    目录 从零接入微信公众号 一.微信测试号的申请与关注 1.申请 2.访问域名配置 3.关注 二.测试号快速生成底部导航栏 1.获取 access_token 2.自定义菜单 三.微信公众号网页授权 1 ...

  7. 利用百度语音识别技术实现文字转语音的应用(Java版附源码)

    @throws IOException @throws DemoException */ public static String getResponseString(HttpURLConnectio ...

  8. 单机版坦克大战分步实现项目源码

    public void launch() {//设置窗口标题setTitle("千锋坦克大战");//设置宽高setSize(width, height);//居中setLocat ...

  9. Python3+pygame实现有趣好玩的飞机大战游戏(附源码及素材)

    版权声明:原创不易,本文禁止抄袭.转载,侵权必究! 目录 一.开发环境 二.功能模块 三.游戏效果 四.完整项目下载 五.作者Info 一.开发环境 开发环境 :Windows10 Python3.6 ...

  10. 人民币数字大写转换 java实现 [附源码]

    动机 业务系统开发的报表中经常需要将人民币数值转换为大写,所以江苏南大先腾java研发框架中写了一个通用的大写转换函数.由于报表的数值一般比较大所以在java开发中不建议使用float或者int类型, ...

最新文章

  1. Linux下修改mysql默认最大连接数,查看当前设置的最大连接数
  2. java 加法不用_【Java】 剑指offer(65) 不用加减乘除做加法
  3. 树形数据深度排序处理示例(递归法).sql
  4. kerberos安装配置、配置kerberos server、client、日常操作与常见问题、卸载kerberos、hive整合kerberos
  5. 【Tomcat】如何解决catalina.out文件过大的问题
  6. 一步步创建 边栏 Gadget(二)
  7. LAMP源代码编译整理
  8. linux推出超级用户_linux添加root权限用户
  9. case when then else end
  10. 【转】【分享】5G核心网基础知识
  11. Linux中的mate程序的进程,终端下以后台模式运行Linux程序的过程详解
  12. Kubernetes基于EFK进行统一的日志管理方案
  13. 利用计算机教学的体会,教师计算机教学学习体会
  14. HP LaserJet P1008打印机安装
  15. 驱动人生安装驱动计算机无法启动,驱动人生安装驱动时无法启用这个硬件解决方法 如何获得system权限...
  16. 计算机应用基础搜题答案,大一计算机应用基础试题及答案
  17. Matlab入门基础思维导图
  18. 远程访问计算机硬盘,60秒远程访问路由器硬盘!瞬间变NAS!
  19. 2021年全球壳聚糖收入大约93百万美元,预计2028年达到126.8百万美元
  20. Revit SDK 介绍:API Sketched Winder Stairs 创建扇形踏步楼梯

热门文章

  1. 『SQLServer系列教程』——事务详解
  2. Idea: SonarLint插件使用
  3. temps matlab,matlab插值方法PPT演示文稿
  4. 在Anaconda中安装pytorch的详细步骤+PyCharm环境配置
  5. mysql5.7修改账户密码
  6. java-后台生成图表、并将图表保存为PNG图片
  7. 《Web前端工程师修炼之道(原书第4版)》——自我测验
  8. 结对编码(柳祎、张许君)
  9. 【vulhub靶场】GoldenEye
  10. Algebra:Chapter 0 - 封面