飞机大战 游戏规则:游戏可以产生小的敌机、大的敌机、小蜜蜂,这三类都是随机概率出现的,游戏打开的时候,鼠标单击,游戏开始, 自动发射子弹,英雄机跟随鼠标移动,当鼠标移到窗口外时,游戏暂停,当鼠标又移回时,游戏继续,子弹打中敌机和小蜜 蜂,当生命降到0时,消失,敌机 撞击到英雄机, 英雄机生命值-1, 直到0时, 游戏结束, 小敌机: 分数+,大敌机: 分数+ 奖励(生命值加成, 火力加成),小蜜蜂: 奖励(生命值加成, 火力加成)。

源码地址:https://gitee.com/lxlxlxl233/fly-battle

package com.chinasofti.shoot;import java.util.Random;//敌机
public class Airplane  extends FlyingObject implements Enemy{private int speed=2;//走步/*构造方法*/public Airplane(){image=ShootGame.airplane;width=image.getWidth();height=image.getHeight();Random rand =new Random();x=rand.nextInt(ShootGame.WIDTH-this.width);y=-this.height;}@Overridepublic int getScore() {return 5;}@Overridepublic void step() {y+=speed;}@Overridepublic boolean outOfBounds() {return this.y>ShootGame.HEIGHT;}}
package com.chinasofti.shoot;
//奖励
public interface Award {public int LIFE=1;//命public int DOUBLE_FIRE=0;//火力值/*获取奖励 0:火力值,1:命*/public int getType();
}
package com.chinasofti.shoot;import java.util.Random;//小蜜蜂
public class Bee extends FlyingObject implements Award {private int xspeed=1;//x轴速度private int yspeed=2;//y轴速度private int awardType;public Bee() {image=ShootGame.bee;width=image.getWidth();height=image.getHeight();Random rand=new Random();x=rand.nextInt(ShootGame.WIDTH-this.width);y=-this.height;awardType= rand.nextInt(2);}@Overridepublic int getType() {return awardType;}@Overridepublic void step() {y+=yspeed;x+=xspeed;if(x>ShootGame.WIDTH-this.width){//最右边xspeed=-1;}if(x<0){//最左边xspeed=1;}}@Overridepublic boolean outOfBounds() {return this.y>ShootGame.HEIGHT;}}
package com.chinasofti.shoot;import java.util.Random;//子弹
public class Bullet extends FlyingObject{private int speed=3;public Bullet(int x,int y) {image=ShootGame.bullet;width=image.getWidth();height=image.getHeight();Random rand =new Random();this.x=x;//随着英雄机移动this.y=y;//随着英雄机移动}@Overridepublic void step() {y-=speed;}@Overridepublic boolean outOfBounds() {return this.y<-this.height;}}
package com.chinasofti.shoot;
//敌人
public interface Enemy {/*得分*/public int getScore();
}
package com.chinasofti.shoot;import java.awt.image.BufferedImage;//飞行物
public abstract class FlyingObject {protected BufferedImage image;//图片protected int width;//长protected int height;//宽protected int x;//横坐标xprotected int y;//纵坐标y/*飞行物走步*/public abstract void step();/*判断飞行物是否越界*/public abstract boolean outOfBounds();/*敌人被子弹撞击*/public boolean shootBy(Bullet bullet){int x1=this.x;//敌人xint x2=this.x+this.width;//敌人宽int y1=this.y;//敌人yint y2=this.y+this.height;//敌人高int x=bullet.x;//子弹xint y=bullet.y;//子弹yreturn x>x1&&x<x2&&y>y1&&y<y2;}
}
package com.chinasofti.shoot;import java.awt.image.BufferedImage;public class Hero extends FlyingObject {private int life;private int doubleFire;private BufferedImage[] images = {};private int index;//协助切换图片public Hero() {image = ShootGame.hero0;width = image.getWidth();height = image.getHeight();x = 150;y = 400;life = 3;doubleFire = 0;//默认火力值images = new BufferedImage[]{ShootGame.hero0,ShootGame.hero1};index = 0;}//图片切换@Overridepublic void step() {//每100毫秒走一次image = images[index++/10%images.length];}@Overridepublic boolean outOfBounds() {return false;}/*英雄机发射子弹*/public Bullet[] shoot(){int xStep = this.width/4; //1/4英雄机宽度if(doubleFire > 0){//双倍火力Bullet[] bullets = new Bullet[2];//两发子弹bullets[0] = new Bullet(this.x+1*xStep,this.y - 20);bullets[1] = new Bullet(this.x+3*xStep,this.y - 20);doubleFire -= 2;//发射一次双倍火力,活力值-2return bullets;}else {//单倍火力Bullet[] bullets = new Bullet[1];//一发子弹bullets[0] = new Bullet(this.x+2*xStep,this.y - 20);return bullets;}}/*英雄机随着鼠标移动*/public void moveTo(int x,int y){this.x = x - this.width/2;this.y = y - this.height/2;}//加一条命public void addLife(){life++;}//获取生命public int getLife(){return life;}/*加火力值*/public void addDoubleFire() {doubleFire += 40;}/*判断英雄机与敌机碰撞*/public boolean hit(FlyingObject obj) {int x1 = obj.x - this.width/2;int x2 = obj.x + obj.width + this.width/2;int y1 = obj.y - this.height/2;int y2 = obj.y + obj.height +this.height/2;int x = this.x + this.width/2;int y = this.y + this.height/2;return x > x1 && x < x2&&y > y1 && y < y2;}//减少生命public void subtractLift() {life --;}public void setDoubleFire(int doubleFire) {this.doubleFire = doubleFire;}
}
package com.chinasofti.shoot;import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;//测试类
public class ShootGame extends JPanel {//窗口高public static final int WIDTH = 400;public static final int HEIGHT = 654;public static final int GAME_OVER=3;//游戏结束状态public static final int START=0;//游戏开始状态public static final int PAUSE=2;//游戏暂停状态public static final int RUNING=1;//游戏结束状态private int state=0;//当前状态public static BufferedImage backgroud;//背景图public static BufferedImage start;//启动图public static BufferedImage pause;//暂停图public static BufferedImage gameover;//结束图public static BufferedImage airplane;//敌机图public static BufferedImage bee;//小蜜蜂图public static BufferedImage bullet;//子弹图public static BufferedImage hero0;//英雄0图public static BufferedImage hero1;//英雄1图private Hero hero = new Hero();private FlyingObject[] flyings = {};private Bullet[] bullets = {};/*ShootGame() {flyings = new FlyingObject[2];//敌机,小蜜蜂flyings[0] = new Airplane();flyings[1] = new Bee();bullets = new Bullet[1];bullets[0] = new Bullet(130, 110);}*//*生成敌人,小蜜蜂*/public static FlyingObject nextOne() {Random rand = new Random();int type = rand.nextInt(20);//0-19之间的随机数//控制小蜜蜂数量if (type == 0) {return new Bee();} else {return new Airplane();}}//入场计数 int indxe=1++,使用index控制敌机数量,每400ms产生一架int flyEnteredIndex = 0;static {//静态初始化资源try {backgroud = ImageIO.read(ShootGame.class.getResource("background.png"));start = ImageIO.read(ShootGame.class.getResource("start.png"));pause = ImageIO.read(ShootGame.class.getResource("pause.png"));gameover = ImageIO.read(ShootGame.class.getResource("gameover.png"));airplane = ImageIO.read(ShootGame.class.getResource("airplane.png"));bee = ImageIO.read(ShootGame.class.getResource("bee.png"));bullet = ImageIO.read(ShootGame.class.getResource("bullet.png"));hero0 = ImageIO.read(ShootGame.class.getResource("hero0.png"));hero1 = ImageIO.read(ShootGame.class.getResource("hero1.png"));} catch (IOException e) {e.printStackTrace();}}/*敌人入场*/public void enterAction() {//将敌机放入flying数组flyEnteredIndex++;if (flyEnteredIndex % 40 == 0) {//每400毫秒产生一个敌人FlyingObject obj = nextOne();flyings = Arrays.copyOf(flyings, flyings.length + 1);//扩容flyings[flyings.length - 1] = obj;//将敌人赋值给flyings最后一个元素}}//飞行物走步public void stepAction() {hero.step();//敌人走步for (int i = 0; i < flyings.length; i++) {flyings[i].step();//敌人走一步}//子弹走步for (int i = 0; i < bullets.length; i++) {bullets[i].step();//子弹走一步}}/*英雄机发射子弹*/int shootindex = 0;public void shootAction() {shootindex++;if (shootindex % 30 == 0) {//每300ms走一次//创建子弹对象,添加到bullets数组中Bullet[] bs = hero.shoot();bullets=Arrays.copyOf(bullets,bullets.length+bs.length);//扩容弹夹System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length);}}//飞行物越界删除public void outOfBoundsAction() {int index=0;FlyingObject[] flyingLives=new FlyingObject[flyings.length];for(int i=0;i<flyings.length;i++){FlyingObject f = flyings[i];if(!f.outOfBounds()){flyingLives[index]=f;index++;}}flyings=Arrays.copyOf(flyingLives,index);//System.out.println(flyings.length);//子弹越界index=0;Bullet[] bulletLives=new Bullet[bullets.length];for(int i=0;i<bullets.length;i++){Bullet b=bullets[i];if (!b.outOfBounds()){bulletLives[index]=b;index++;}}bullets=Arrays.copyOf(bulletLives,index);}//检查游戏结束public void  checkGameOver(){if(isGameOver()){state=GAME_OVER;}}
/*判断游戏是否结束*/public boolean isGameOver(){for(int i=0;i<flyings.length;i++){FlyingObject f = flyings[i];if(hero.hit(f)){hero.subtractLift();//英雄机-life;//火力清零hero.setDoubleFire(0);//删除被撞敌人FlyingObject temp=flyings[i];flyings[i]=flyings[flyings.length-1];flyings[flyings.length-1]=temp;//缩容flyings=Arrays.copyOf(flyings,flyings.length-1);}}return hero.getLife()<=0;}/*启动执行action*/public void action() {//监听器对象MouseAdapter l=new MouseAdapter() {@Override//重写鼠标移动方法public void mouseMoved(MouseEvent e) {//监听器对象if(state==RUNING){//只有运行 时可以控制int x=e.getX();int y=e.getY();hero.moveTo(x,y);}}//重写鼠标点击事件public void mouseClicked(MouseEvent e){switch (state){case START:state=RUNING;break;case GAME_OVER:state=START;break;}}public void mouseExited(MouseEvent e){if(state==RUNING){state=PAUSE;}}public void mouseEntered(MouseEvent e){if(state==PAUSE){state=RUNING;}}};this.addMouseListener(l);//处理鼠标操作事件this.addMouseMotionListener(l);//处理鼠标滑动事件Timer timer = new Timer();//定时器int intervel = 10;timer.schedule(new TimerTask() {@Overridepublic void run() {//每10ms运行一次if(state==RUNING) {//只有运行状态能动enterAction(); //敌人入场stepAction();//飞行物shootAction();//子弹outOfBoundsAction();//删除越界飞行物bangAction();//子弹碰撞checkGameOver();//检查游戏结束}repaint();//重画}}, intervel, intervel);}int score=0;//玩家得分/*所有子弹撞*/public void bangAction(){for (int i=0;i<bullets.length;i++){Bullet b=bullets[i];//获取每一个子弹bang(b);//碰撞}}/*一颗子弹与敌人的碰撞*/public void bang(Bullet b){int index=-1;//被撞敌人下标,-1表示没撞上for(int i=0;i<flyings.length;i++){FlyingObject f=flyings[i];//是否被撞if(f.shootBy(b)){index=i;//记录下标break;}}if(index !=-1){FlyingObject obj=flyings[index];if(obj instanceof Enemy){Enemy e= (Enemy)obj;score+=e.getScore();}if(obj instanceof Award){Award a =(Award)obj;int type=a.getType();switch (type){case Award.DOUBLE_FIRE://双倍火力hero.addDoubleFire();//英雄机增加火力break;case Award.LIFE:hero.addLife();//加生命break;}}//将被撞敌人删除FlyingObject temp=flyings[index];flyings[index]=flyings[flyings.length-1];flyings[flyings.length-1]=temp;//缩容flyings=Arrays.copyOf(flyings,flyings.length-1);}}/*重写paint g画笔*/@Overridepublic void paint(Graphics g) {g.drawImage(backgroud, 0, 0, null);//画背景paintHero(g);paintFlyingObjects(g);paintBullets(g);paintScore(g);pantState(g);}//画状态public void pantState(Graphics g){switch (state){case START:g.drawImage(start,0,0,null);break;case PAUSE:g.drawImage(pause,0,0,null);break;case GAME_OVER://清理现场hero=new Hero();flyings=new FlyingObject[0];bullets=new Bullet[0];g.drawImage(gameover,0,0,null);break;}}/*画分 命*/public void paintScore(Graphics g){g.setColor(new Color(0xff));g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,20));g.drawString("SCORE:"+score,10,25);g.drawString("LIFE:"+hero.getLife(),10,45);}/*画英雄机*/public void paintHero(Graphics g) {g.drawImage(hero.image, hero.x, hero.y, null);}/*画敌机和小蜜蜂*/public void paintFlyingObjects(Graphics g) {for (int i = 0; i < flyings.length; i++) {FlyingObject f = flyings[i];//获取每一个敌人g.drawImage(f.image, f.x, f.y, null);}}/*画子弹*/public void paintBullets(Graphics g) {for (int i = 0; i < bullets.length; i++) {Bullet b = bullets[i];//获取每一个子弹g.drawImage(b.image, b.x, b.y, null);}}public static void main(String[] args) {JFrame frame = new JFrame("Fly");ShootGame game = new ShootGame();frame.add(game);//将面板添加到窗口//设置宽高frame.setSize(WIDTH, HEIGHT);frame.setAlwaysOnTop(true);//设置总在最上面frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//在关闭时离开frame.setLocationRelativeTo(null);//设置居中frame.setVisible(true);//设置窗口可见 尽快调用paint()方法//启动计时器game.action();}
}

飞机大战(Java)相关推荐

  1. proj Java_proj 一个炫酷的飞机大战java游戏,很好玩的,很酷炫 用了 的图形界面 Games 256万源代码下载- www.pudn.com...

    文件名称: proj下载  收藏√  [ 5  4  3  2  1 ] 所属分类: Games 开发工具: Java 文件大小: 3435 KB 上传时间: 2016-05-11 下载次数: 0 提 ...

  2. 飞机大战--java

    菜鸟日记-2月10日 案例 : 飞机大战 要求: 玩家可控制飞机躲避炮弹,界面显示玩家游玩时间 效果: 1.游戏物体根类 (飞机,炮弹等类都继承于此类) import java.awt.*;/* * ...

  3. 飞机大战——Java小游戏

    飞机大战 文章目录 飞机大战 游戏需求 代码实现 子弹类 英雄机类 小敌机类 大敌机类 小蜜蜂类 飞行物类 接口类 爆炸类 游戏窗口类 游戏需求 所参与角色:英雄机.子弹.小敌机.大敌机.小蜜蜂.天空 ...

  4. 飞机大战Java源代码

    很快,大二这个学期就要完结了,所学的大部分课程都快要结束了,Java课程也是如此.而Java这门课程也有一个惯例就是要做一个课程设计,老师给了我们三个选择,分别是飞机大战.推箱子和学生成绩管理系统.在 ...

  5. 全民飞机大战(java)

    目录 一.需求 二.窗体.面板.背景图的绘制 2.1  工具类 2.2  面板类 2.3  窗体类 2.4  效果图 三.英雄机的出现及移动 3.1  定义飞行父类 3.2  英雄机的出现 3.3  ...

  6. 飞机大战java代码_[源码和文档分享]Java飞机大战游戏设计与实现

    1 概述 1.1 项目简介 本次Java课程设计是做一个飞机大战的游戏,应用Swing编程,完成一个界面简洁流畅.游戏方式简单,玩起来易于上手的桌面游戏.该飞机大战项目运用的主要技术即是Swing编程 ...

  7. 全民飞机大战Java(搬)

    第一步,首先创建一个窗体 package ui; import javax.swing.JFrame; /** * 自定义窗体类的步骤: * 1.写一个类,继承JFrame,在类名后面加extends ...

  8. 飞机大战Java版完整版

    这是一款闯关的射击游戏,人物在不同的关 卡里面会触发不同的技能与对应的特效操作,有三个关卡与四个随机事件,每个关卡里面都会触发不同数量的怪物与能量血瓶,通过打败怪物与 到达特点时间点可通关 ⭐本项目演 ...

  9. 云龙开炮版飞机大战(Java+JavaSwing+关卡+技能物品+宠物+商店界面+可切换音乐界面)

    文章目录 前言 一.主界面展示 二.游戏演示效果 三.部分关卡.商店代码展示 ⭐游戏工具类⭐ ⭐游戏面板类⭐ ⭐商店类⭐ ⭐音乐类⭐ ⭐项目图片⭐ 作者:KJ.JK 前言 基于Java Swing,以 ...

  10. java飞机大战爆炸效果_Java飞机大战游戏设计与实现

    1 概述 1.1 项目简介 本次Java课程设计是做一个飞机大战的游戏,应用Swing编程,完成一个界面简洁流畅.游戏方式简单,玩起来易于上手的桌面游戏.该飞机大战项目运用的主要技术即是Swing编程 ...

最新文章

  1. 提升对ASP.NET网站性能和多并发的设计的讨论
  2. html 甘特图_甘特图怎么画?甘特图基础教程,小白快速入门简单易懂
  3. Coding and Paper Letter(二十四)
  4. ASP.net mvc开发中使用纯html如何创建FCKeditor编辑器的使用
  5. 华为8lite支持云闪付吗_鸿蒙系统适配机型表曝光,部分华为旗舰机未支持,你是其中之一吗...
  6. 分布式事务与一致性算法Paxos amp; raft amp; zab
  7. 实例讲解C语言的位运算
  8. 基于Echarts+HTML5可视化数据大屏展示—设备环境监测平台大数据平台
  9. Qt笔记-对connect中第5个进行多组实验(对信号与槽进一步认识)
  10. mybatis-plus如和获取当天得数据_MybatisPlus多数据源及事务解决思路
  11. java 鼠标动眼睛动_js动画_看着鼠标移动的眼球_眼睛_跟着随鼠标移动
  12. html5 session 缓存,关于HTML5中的sessionStorage的会话级缓存使用
  13. strcmp函数php,php strcmp函数怎么用?
  14. 树莓派开机启动chromium浏览器
  15. DuckDuckGo 的盈利模式
  16. 【java】java intellij idea 破解
  17. Java买飞机票代码
  18. 【Axure原型图】——动态面板
  19. 生活娱乐 重庆乡村基挑战肯德基为何失败
  20. 中国象棋棋盘c语言编程,中国象棋 C语言编程.ppt

热门文章

  1. json离线解析格式化工具
  2. 吴昊品游戏核心算法 Round 5 —— 五子棋(无禁手)后台的判胜负AI(bfs+queue容器)(HDOJ 2699)...
  3. 西门子Step7和TIA软件“交叉引用”的使用
  4. echarts3D使用时会遇到的问题(版本低)
  5. 有效的数独 python_Python判断有效的数独算法示例
  6. AD10 PCB等长布线----蛇形布线
  7. 【器件知识】【设计】ESD专题-闩锁效应-大尺寸输出缓冲器
  8. python源码剖析_Python源码剖析
  9. 三星k3梅林没有软件中心_斐讯K3梅林软件中心版刷机包 修正WAN口 修正2.4G 自动息屏 完美混血...
  10. Ableton Live 10 mac 破解版永久激活方法