【Java】Java基础飞机大战小游戏完整代码
Java基础飞机大战小游戏完整代码
先来展示一下代码实现结果图
主函数ShootGame
初始化游戏原始背景图片,游戏人物图片,游戏开始结束图片;构建产生敌人算法;产生英雄机算法;发射子弹算法;判断是否相撞算法(子弹与敌机相撞,英雄机与敌机相撞);击落敌人奖励算法;绘制游戏中人物算法;鼠标控制移动算法;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;public class ShootGame extends JPanel implements MouseMotionListener,MouseListener{//继承JPanel类public static final int width = 400;public static final int height = 600;//设置对象图片名称(与源文件名称一致)public static Image background;public static Image airplane;public static Image bee;public static Image bullet;public static Image gameover;public static Image hero0;public static Image hero1;public static Image pause;public static Image start;//定义游戏的四种状态public static final int START = 0; //开始状态public static final int RUNNING = 1; //运行状态public static final int PAUSE = 3; //暂停状态public static final int GAMEOVER =4; //结束状态int state =START;//创建对象-----------------------------------------------------------------------------------------------Hero hero = new Hero(); //创建英雄机对象Bullet[] bullets = {}; //子弹(众多),定义子弹数组FlyingObject[] flyings = {}; //小敌机(众多),定义小敌机数组//ShootGame无惨构造方法(给创建对象初始化)/*public ShootGame() {flyings = new FlyingObject[2];//多态 夫妇flyings[0] = new Airplane();//小敌机flyings[1] = new Bee();//小蜜蜂bullets = new Bullet[2];bullets[0] = new Bullet(130,250);bullets[1] = new Bullet(100,120);}*///静态代码块内容加载static {try {//导入图片文件-----------------------------------------------------------------------------------//将图片文件赋给图片对象background = ImageIO.read(new File("image\\background.png"));airplane = ImageIO.read(new File("image\\airplane.png"));bee = ImageIO.read(new File("image\\bee.png"));bullet = ImageIO.read(new File("image\\bullet.png"));gameover = ImageIO.read(new File("image\\gameover.png"));hero0 = ImageIO.read(new File("image\\hero0.png"));hero1 = ImageIO.read(new File("image\\hero1.png"));pause = ImageIO.read(new File("image\\pause.png"));start = ImageIO.read(new File("image\\start.png"));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//产生敌人方法-------------------------------------------------------------------------------------------public FlyingObject nextOne() {FlyingObject f; //小敌机类型Random r = new Random(); //随机产生数int random = r.nextInt(20); //产生[0,20)随机数if(random > 3) {f = new Airplane(); //随机数为[4,20) 产生小敌机}else {f = new Bee(); //随机数为[0,3] 产生小蜜蜂}return f; //返回小敌机}int flyingEnterIndex = 0; //敌人对象初始化为0//把产生的敌人添加到敌人数组中方法------------------------------------------------------------------------public void enterAction() {flyingEnterIndex++; //敌人对象自加if(flyingEnterIndex % 50 == 0) { //50 100...每隔50毫秒执行一次,用于控制敌人出现速度//1、创建敌人对象FlyingObject one = nextOne(); //创建敌人对象,赋值给 One//2.将敌人对象添加到flyings敌人数组中flyings = Arrays.copyOf(flyings, flyings.length+1); //扩容+1(增加小敌机)flyings[flyings.length-1] = one; //把产的敌人one赋值(添加)给最后一个数组元素}}//游戏中各个对象的移动方式--------------------------------------------------------------------------------public void stepAction() {//敌人的移动(敌人处于敌人数组中,调用数组)for(int i=0; i<flyings.length; i++) { //通过循环实现每个敌人移动flyings[i].step(); //调用step方法,实现敌人的移动}//子弹移动(子弹处于子弹数组中,调用子弹数组)for(int i=0; i<bullets.length; i++) { //通过循环实现每个子弹移动bullets[i].step(); //调用step方法,实现子弹的移动}//英雄机的移动hero.step(); //调用step方法,实现英雄机的移动}int shootIndex =0;//英雄机发射子弹方法-------------------------------------------------------------------------------------public void shootAction() {shootIndex++;if(shootIndex % 30 == 0) { //10*30=300毫秒Bullet[] bs = hero.shoot(); //用数组存放子弹//扩容(将bs存放至bullets子弹数组中)bullets = Arrays.copyOf(bullets, bullets.length+bs.length); //子弹数组+新生成对象//将子弹对象添加至子弹数组中System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length);}}int score = 0;//子弹与敌人相撞-----------------------------------------------------------------------------------------public void hitAction() {//遍历所有子弹for(int i= 0; i<bullets.length; i++) {Bullet b = bullets[i]; //记录当前子弹//遍历所有敌人for(int j = 0; j<flyings.length; j++) {FlyingObject f = flyings[j]; //记录当前敌人//判断是否相撞if(f.hitBy(b)) {//敌人消失//1,当前敌人与最后一个数组元素交换FlyingObject temp = flyings[j];flyings[j] = flyings[flyings.length-1];flyings[flyings.length-1] = temp;//2.扩容-1(消灭敌人)flyings=Arrays.copyOf(flyings, flyings.length-1);//子弹消失//1.当前子弹与最后一个数组元素交换Bullet t =bullets[i];bullets[i] = bullets[bullets.length-1];bullets[bullets.length-1] = t;//2.扩容-1(子弹消失)bullets=Arrays.copyOf(bullets, bullets.length-1);//得到加分或奖励,需要区分是小敌机还是小蜜蜂if(f instanceof Airplane) {//是小敌机score += hero.getScore(); //加奖励分}if(f instanceof Bee) {//是小蜜蜂,根据奖励类型增加火力还是生命Bee bee = (Bee)f; //向下转型Beeint award = bee.getAwardType();switch(award) {case 0:hero.addDoubleFire(); //增加火力break;case 1:hero.addLife(); //增加生命值break;}}}}}}//英雄机与敌人相撞方法------------------------------------------------------------------------------------public void duangAction() {//遍历所有敌人for(int i = 0; i<flyings.length; i++) {if(hero.duang(flyings[i])) {//敌人消失FlyingObject temp = flyings[i];flyings[i] = flyings[flyings.length-1];flyings[flyings.length-1] = temp;flyings=Arrays.copyOf(flyings, flyings.length-1); //扩容,减掉敌人//英雄机减掉生命值,火力清零hero.life--;hero.doubleFire = 0;}}}//检测英雄机生命值方法------------------------------------------------------------------------------------public void checkGame() {if(hero.life <= 0) {state = GAMEOVER;}}//游戏中的各种行为方法-----------------------------------------------------------------------------------public void action() {//添加定时器(每隔多久出现一次)Timer timer = new Timer();//utill包下//安排指定任务从指定的延迟后开始进行重复的固定延迟执行timer.schedule(new TimerTask() {@Overridepublic void run() {// TODO Auto-generated method stubif(state == RUNNING) { //处于运行状态执行操作enterAction(); //敌人入场stepAction(); //设置对象的移动方式shootAction(); //英雄机发射子弹hitAction(); //子弹与敌人相撞duangAction(); //英雄机与敌人撞checkGame(); //检测英雄机生命值}repaint(); //重新绘制(产生新的小敌机)}}, 10,10);}//绘制分数方法-------------------------------------------------------------------------------------------public void paintScore(Graphics g) {g.setFont(new Font("黑体",Font.BOLD,20)); //颜色,字体,字号g.drawString("SCORE:"+score, 30, 30); //绘制SCORE:分数(坐标位置)g.drawString("LIFE:"+hero.life,30,60); //绘制LIFE: 生命值(坐标位置)g.drawString("FIRE:"+hero.doubleFire, 30, 90); //FIRE:火力值(坐标位置)}//绘制状态图方法-----------------------------------------------------------------------------------------public void paintState(Graphics g) {switch(state) {case START:g.drawImage(start, 0, 0, null); //绘制start图片,坐标(0,0)break;case PAUSE:g.drawImage(pause, 0, 0, null); //绘制pause图片,坐标(0,0)break;case GAMEOVER:g.drawImage(gameover, 0, 0, null); //绘制gameover图片,坐标(0,0)break;}}//绘图方法-----------------------------------------------------------------------------------------------public void paint(Graphics g) { //Jpanel类下paint方法super.paint(g);g.drawImage(background,0,0,null); //通过背景图片进行绘画,从坐标(0,0)开始绘画//g.drawImage(airplane, 100, 100, null);绘制小敌机固定位置图像//通过方法调用实现动态实时绘图//绘制敌人paintFlying(g);//绘制子弹paintBullet(g);//绘制英雄机paintHero(g);//绘制分值paintScore(g);//绘制状态图paintState(g);}//绘制英雄机方法-----------------------------------------------------------------------------------------public void paintHero(Graphics g) {// TODO Auto-generated method stubg.drawImage(hero.image, hero.x, hero.y, null);}//绘制子弹方法-------------------------------------------------------------------------------------------public void paintBullet(Graphics g) {// TODO Auto-generated method stubfor(int i = 0; i<bullets.length; i++) {g.drawImage(bullets[i].image, bullets[i].x, bullets[i].y, null);}}//绘制敌人方法-------------------------------------------------------------------------------------------public void paintFlying(Graphics g) {// TODO Auto-generated method stubfor(int i = 0; i<flyings.length; i++) {g.drawImage(flyings[i].image, flyings[i].x, flyings[i].y, null);}}//主方法public static void main(String[] args) {//飞机大战窗体制作JFrame jf = new JFrame("飞机大战");jf.setSize(width, height); //设置窗体宽高jf.setLocationRelativeTo(null); //窗体居中jf.setVisible(true); //窗体可见jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//导入背景图片ShootGame game = new ShootGame(); //创建ShootGame对象jf.add(game); //在窗体中添加背景图片game.action(); //游戏中的各种操作jf.addMouseMotionListener(game); //添加监听器(对对象实时监控)jf.addMouseListener(game); //添加监听器(对鼠标实时监控)}@Overridepublic void mouseDragged(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseMoved(MouseEvent e) { //鼠标移动// TODO Auto-generated method stubif(state == RUNNING) { //在运行状态下执行操作hero.x =e.getX()-hero.width/2; //鼠标的具体坐标(x,y)hero.y =e.getY()-hero.height/2; //根据鼠标的位置确定英雄机的位置}}//鼠标单击启动@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stubif(state == START) {state = RUNNING; //开始运行}if(state == GAMEOVER) {state = START; //返回开始状态hero = new Hero();flyings = new FlyingObject[] {};bullets = new Bullet[] {};score = 0;}}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}//鼠标进入@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stubif(state == PAUSE) {state = RUNNING; //修改为运行}}//鼠标退出@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stubif(state == RUNNING) {state = PAUSE; //修改为暂停}}}
所有类的父类FlyingObject
概括所有对象的共性,统一调用
import java.awt.Image;//父类(英雄机,小敌机,小蜜蜂,子弹)public abstract class FlyingObject { //抽象方法必须为抽象类int x,y; //定位int width,height; //对象宽度和高度Image image; //定义图像//让每一个子类移动的方法----------------------------------------------------------------------------------public abstract void step(); //由于每个子类的移动方法不一样,定为抽象方法//判断子弹是否与敌人相撞方法-------------------------------------------------------------------------------public boolean hitBy(Bullet bullet) {int x = bullet.x; //子弹x 坐标int y = bullet.y;return x>this.x && x<this.x+this.width &&y>this.y && y<this.y+height; //子弹与敌人相撞的临界状态}
}
英雄机Hero类
主要包括英雄机出现位置,英雄机大小,生命值,火力值的设置算法;英雄机发射子弹算法;英雄机与敌机相撞判定算法;英雄机打到小蜜蜂的奖励算法。
import java.awt.Image;//英雄机
public class Hero extends FlyingObject{int life; //英雄机生命int doubleFire; //英雄机火力值0/1Image[] images = {}; //图片数组(两张图片切换动画)public Hero() {image = ShootGame.hero0; //使用第一张英雄机图片width = image.getWidth(null); //获得英雄机宽度height = image.getHeight(null); //获得英雄机宽度x = 150; //英雄机初始高度宽度y = 450;life = 3; //初始生命doubleFire = 0; //开始英雄机单倍火力images =new Image[] {ShootGame.hero0,ShootGame.hero1}; //两张图片}int index = 0;//实现抽象父类中对象移动的方法@Overridepublic void step() {// TODO Auto-generated method stubimage = images[index++/10%images.length];//图片数组切换,形成英雄机动画,最后赋值给image}//发射子弹的方法------------------------------------------------------------------------------------------public Bullet[] shoot() {Bullet[] bs = {}; //子弹数组,初值为空if(doubleFire ==0) { //单倍火力bs = new Bullet[1];bs[0] = new Bullet( x+width/2-4,y-14); //一颗子弹的坐标计算}else { //双倍火力bs =new Bullet[2];bs[0] = new Bullet(x+width/4-4,y-14); //英雄机的宽度1/4-子弹宽度的一半bs[1] = new Bullet(x+width*3/4-4,y-14);doubleFire -= 2;}return bs;}//获取得分------------------------------------------------------------------------------------------------public int getScore() {return 5;}//增加火力------------------------------------------------------------------------------------------------public void addDoubleFire() {doubleFire +=40;}//增加生命------------------------------------------------------------------------------------------------public void addLife() {life += 1;}//判断英雄机是否与敌人相撞方法-----------------------------------------------------------------------------public boolean duang(FlyingObject f) {int x = this.x;int y = this.y; //获得英雄机当前位置int x1 = f.x - this.width; //敌人x坐标-英雄机宽度int x2 = f.x + f.width; //敌人x坐标+敌人宽度int y1 = f.y - this.height; //敌人y坐标-英雄机高度int y2 = f.y + f.height; //敌人y坐标+敌人高度return x>x1 && x<x2&&y>y1 && y<y2; //临介条件}}
小敌机Airplane类
设置小敌机出现位置,移动限制
//小敌机
public class Airplane extends FlyingObject {int ySpeed; //向下速度public Airplane() {image = ShootGame.airplane; //小敌机图片width = image.getWidth(null); //小敌机宽度height = image.getHeight(null); //小敌机高度x = (int) (Math.random()*ShootGame.width); //小敌机出现x坐标,背景屏幕宽度y = -height; //小敌机的y坐标ySpeed = 1; //向下移动速度}//实现抽象父类中对象移动的方法-----------------------------------------------------------------------------@Overridepublic void step() {// TODO Auto-generated method stuby += ySpeed; //一次递增一个速度}
}
小蜜蜂Bee类
小蜜蜂奖励算法;小蜜蜂出现算法;
//小蜜蜂
public class Bee extends FlyingObject{int ySpeed;//向下速度int xSpeed;//左右速度int awardType;public Bee() {image = ShootGame.bee; //调用小蜜蜂图片width = image.getWidth(null); //获取图片宽度height = image.getHeight(null); //获取图片高度x = (int) (Math.random()*ShootGame.width); //小蜜蜂x坐标(随机进入)y = -height; //小蜜蜂高度,设为窗体下方,方便提前看到小蜜蜂xSpeed = 1; //小蜜蜂x轴方向速度ySpeed = 1; //小蜜蜂y轴方向速度awardType = (int) (Math.random()*2); //得分(随机性)}//实现抽象父类中对象移动的方法-----------------------------------------------------------------------------@Overridepublic void step() {// TODO Auto-generated method stuby += ySpeed;x += xSpeed;if(x > ShootGame.width - width) { //大于屏幕宽度-x宽度小蜜蜂大于右边界xSpeed =-1;}if(x<=0) {xSpeed = 1; //小蜜蜂移动至左边界,向右移动}}//获取得分方法--------------------------------------------------------------------------------------------public int getAwardType() {return awardType;}
}
子弹Bullet类
包括对发射子弹初始化,子弹移动的设置
//子弹
public class Bullet extends FlyingObject{int ySpeed; //子弹向下速度public Bullet(int x,int y) {image = ShootGame.bullet; //调用子弹图片width = image.getWidth(null); //获得子弹宽度height = image.getHeight(null); //获得子弹高度this.x = x; //子弹实时坐标(随英雄机变换)this.y = y;ySpeed = 3;}//实现抽象父类中对象移动的方法@Overridepublic void step() {// TODO Auto-generated method stuby -= ySpeed;}}
## 游戏规则```java
飞机大战游戏规则(游戏需求)通过鼠标点击游戏Start界面开始游戏;鼠标控制英雄机移动;父类FlyingObject(提取共同属性,制作父类)属性x,ywidth,heightimg小敌机Airplane属性x,y(定位其位置)width,height(定义图片高度宽度)img(图片属性)ySpeed=1(只能上下移动,下移速度为1)小蜜蜂Bee属性x,y(定位其位置)width,height(定义图片高度宽度)img(图片属性)ySpeed=1(可以上下移动,下移速度为1)XSpeed(可以左右移动)awardType(被打到时奖励0/1分)0:奖励单倍火力1:奖励双倍火力(随机性)英雄机(随鼠标移动)属性x,y(定位其位置)width,height(定义图片高度宽度)img(图片属性)life(生命值)doubleFire(火力值)0:发射一个子弹1:发射两个子弹行为发射子弹,鼠标移动子弹属性x,y(定位其位置)width,height(定义图片高度宽度)img(图片属性)ySpeed(只能上移)
游戏基础人物构造图片
图片需要统一放在image文件夹中,方便调用。image文件放入创建的Java项目包下。
结束语
若想获得更多的编程干货,关注博主,持续更新福利。
【Java】Java基础飞机大战小游戏完整代码相关推荐
- java项目---全民飞机大战小游戏
项目素材下载地址:https://download.csdn.net/download/m0_51152186/83604685 源码地址:https://download.csdn.net/down ...
- 天天酷跑电脑版代码C语言,Java实现天天酷跑小游戏完整代码(附源码).pdf
Java实实现现天天天天酷酷跑跑小小游游戏戏完完整整代代码码(附附源源码码) 首首先先,,写写一一个个需需求求文文档档:: 一.项目名称: <天天酷跑> (RunDay ) 二.功能介绍: ...
- 基于Java语言在窗体上实现飞机大战小游戏
全套资料下载地址:https://download.csdn.net/download/sheziqiong/85594271 项目介绍 飞机大战:用 Java 语言在窗体上实现飞机大战小游戏,运行程 ...
- 【Java代码实现飞机大战小游戏】简单理解
飞机大战 飞机大战小游戏历经10天完成,主要用到的就是我们面向对象部分的知识:类,封装,继承,多态,静态代码块等等内容+swing部分内容.所以即使你是java小白,也不用担心欧! 游戏说明:游戏有3 ...
- 点击list view中一行内容可以在combox中显示_java版飞机大战小游戏详细教程(零基础小白也可以分分钟学会!)...
一:游戏展示 飞机大战小游戏我们都玩过,通过移动飞机来打敌机,这里给大家展示一下游戏成果:呜呜呜由于gif只能上传5M大小,所以就不能给大家展示操作了,如果大家有兴趣可以自己自己做出来再玩哟. 这里面 ...
- java代码实现打气球游戏_javascript+css3开发打气球小游戏完整代码
效果知识点: css3画气球, 自定义属性运用,随机阵列, DOM元素操作,高级回调函数与参数复传,动态布局,鼠标事件,定时器运用,CSS3新增样式等. css代码如下: {margin:0;padd ...
- 【python】飞机大战小游戏练习
飞机大战小游戏练习 一.前提准备 二.制作步骤 1.库的导入与初始化 2.窗口操作 3.键盘按键监听相关操作 4.添加游戏背景 5.加载玩家飞机 6.获取玩家飞机矩阵 三.完整代码编写 游戏背景类编写 ...
- 飞机大战小游戏(超详细)
偷学Python之最后的项目二:飞机大战小游戏(超详细) 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志.--苏轼 甜甜先说 这次用Python中的pygame模块来完成一个飞机大战的小游戏:基本思 ...
- Vue 开发一个简略版的飞机大战小游戏
文章目录 使用 Vue 开发一个简略版的飞机大战小游戏 一.实现思路 二.所需知识点 三.实现步骤 使用 Vue 开发一个简略版的飞机大战小游戏 如题,假设你为了向更多访问你博客的人展示你的技术,你决 ...
最新文章
- 面试前必知必会的二分查找及其变种
- 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)
- Windows Server Backup 备份活动目录
- 微信lbs开发 php,【LBS】基于地理位置的搜索之微信 附近的人 简单实现
- CN Erlounge IV 讲师名单公布及Call For Topic
- InstallShield For .Net制作.Net项目安装包之完整代码
- 怎么把苹果手机通讯录导入华为手机_批量Excel表格号码导入苹果、安卓智能手机通讯录...
- Eucalyptus云之面纱
- android 图片字体涂鸦,android 实现在照片上绘制涂鸦的方法
- easyExcel导出下拉选择框,多sheet数据excle导入导出
- 【转】为什么SPSS的日期要以1582年10月14日为基准
- 软件工程考C语言的学校,软件考研学校排名,软件工程性价比较高的考研学校有哪些?...
- dvcs-ripper安装教程
- C/S与B/S应用的区别
- 【开发指南】AR Foundation 开发环境部署
- 遥感影像处理书籍推荐
- mac mini 键盘调节显示器亮度
- Google DeepMind在全球使用AI的10种方式
- 如何禁用和恢复任务管理器
- BigBlueButton配置文件bbb-conf说明