坦克大战--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);//定义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实现(附源码)相关推荐
- 用pygame做经典坦克大战游戏(附源码)
首先,我们得分析这个项目的结构,设计出它的框架 坦克大战游戏项目开发 需求分析 1.分析项目需要多少个类 2.分析每个类有哪些方法 1.坦克类(敌方坦克,我方坦克) 移动.射击.展示 2.子弹类 移动 ...
- Python实现飞机大战-第二部分(附源码、素材、超详细教程)
飞机大战第二部分 1.前言 2.飞机射击 2.1.添加子弹的相关设置 2.2.创建文件bullet.py 2.3.修改game_functions.py 2.4.修改mian.py 2.5.射击效果 ...
- 100行JS代码实现❤坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript )
坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript ) HTML5坦克大战网页小游戏,完美还原小霸王学习机效果,以坦克战斗及保卫基地为主题,属于策略型类游戏. ...
- 《游戏学习》JAVA版坦克大战课程设计及源码
1.功能设计 游戏要有图形用户界面,界面能够反映游戏所有的细节. 界面中要有坦克,墙,树林,河流. 界面中要有一个"家","家"被攻击中则输了游戏. 坦克分两种 ...
- 《Java语言程序设计——坦克大战单机游戏》源码以及实验报告
一.引言 游戏本身是一种娱乐方式,带给人无尽的乐趣,而且游戏行业的发展前景也将会是是带动周边相关行业的发展.为了去满足不同的游戏爱好者的要求,对做游戏开发的人的要求也会越来越高.本次Java语言程序设 ...
- 从零接入微信公众号(Java实现 附源码)
目录 从零接入微信公众号 一.微信测试号的申请与关注 1.申请 2.访问域名配置 3.关注 二.测试号快速生成底部导航栏 1.获取 access_token 2.自定义菜单 三.微信公众号网页授权 1 ...
- 利用百度语音识别技术实现文字转语音的应用(Java版附源码)
@throws IOException @throws DemoException */ public static String getResponseString(HttpURLConnectio ...
- 单机版坦克大战分步实现项目源码
public void launch() {//设置窗口标题setTitle("千锋坦克大战");//设置宽高setSize(width, height);//居中setLocat ...
- Python3+pygame实现有趣好玩的飞机大战游戏(附源码及素材)
版权声明:原创不易,本文禁止抄袭.转载,侵权必究! 目录 一.开发环境 二.功能模块 三.游戏效果 四.完整项目下载 五.作者Info 一.开发环境 开发环境 :Windows10 Python3.6 ...
- 人民币数字大写转换 java实现 [附源码]
动机 业务系统开发的报表中经常需要将人民币数值转换为大写,所以江苏南大先腾java研发框架中写了一个通用的大写转换函数.由于报表的数值一般比较大所以在java开发中不建议使用float或者int类型, ...
最新文章
- Linux下修改mysql默认最大连接数,查看当前设置的最大连接数
- java 加法不用_【Java】 剑指offer(65) 不用加减乘除做加法
- 树形数据深度排序处理示例(递归法).sql
- kerberos安装配置、配置kerberos server、client、日常操作与常见问题、卸载kerberos、hive整合kerberos
- 【Tomcat】如何解决catalina.out文件过大的问题
- 一步步创建 边栏 Gadget(二)
- LAMP源代码编译整理
- linux推出超级用户_linux添加root权限用户
- case when then else end
- 【转】【分享】5G核心网基础知识
- Linux中的mate程序的进程,终端下以后台模式运行Linux程序的过程详解
- Kubernetes基于EFK进行统一的日志管理方案
- 利用计算机教学的体会,教师计算机教学学习体会
- HP LaserJet P1008打印机安装
- 驱动人生安装驱动计算机无法启动,驱动人生安装驱动时无法启用这个硬件解决方法 如何获得system权限...
- 计算机应用基础搜题答案,大一计算机应用基础试题及答案
- Matlab入门基础思维导图
- 远程访问计算机硬盘,60秒远程访问路由器硬盘!瞬间变NAS!
- 2021年全球壳聚糖收入大约93百万美元,预计2028年达到126.8百万美元
- Revit SDK 介绍:API Sketched Winder Stairs 创建扇形踏步楼梯