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基础飞机大战小游戏完整代码相关推荐

  1. java项目---全民飞机大战小游戏

    项目素材下载地址:https://download.csdn.net/download/m0_51152186/83604685 源码地址:https://download.csdn.net/down ...

  2. 天天酷跑电脑版代码C语言,Java实现天天酷跑小游戏完整代码(附源码).pdf

    Java实实现现天天天天酷酷跑跑小小游游戏戏完完整整代代码码(附附源源码码) 首首先先,,写写一一个个需需求求文文档档:: 一.项目名称: <天天酷跑> (RunDay ) 二.功能介绍: ...

  3. 基于Java语言在窗体上实现飞机大战小游戏

    全套资料下载地址:https://download.csdn.net/download/sheziqiong/85594271 项目介绍 飞机大战:用 Java 语言在窗体上实现飞机大战小游戏,运行程 ...

  4. 【Java代码实现飞机大战小游戏】简单理解

    飞机大战 飞机大战小游戏历经10天完成,主要用到的就是我们面向对象部分的知识:类,封装,继承,多态,静态代码块等等内容+swing部分内容.所以即使你是java小白,也不用担心欧! 游戏说明:游戏有3 ...

  5. 点击list view中一行内容可以在combox中显示_java版飞机大战小游戏详细教程(零基础小白也可以分分钟学会!)...

    一:游戏展示 飞机大战小游戏我们都玩过,通过移动飞机来打敌机,这里给大家展示一下游戏成果:呜呜呜由于gif只能上传5M大小,所以就不能给大家展示操作了,如果大家有兴趣可以自己自己做出来再玩哟. 这里面 ...

  6. java代码实现打气球游戏_javascript+css3开发打气球小游戏完整代码

    效果知识点: css3画气球, 自定义属性运用,随机阵列, DOM元素操作,高级回调函数与参数复传,动态布局,鼠标事件,定时器运用,CSS3新增样式等. css代码如下: {margin:0;padd ...

  7. 【python】飞机大战小游戏练习

    飞机大战小游戏练习 一.前提准备 二.制作步骤 1.库的导入与初始化 2.窗口操作 3.键盘按键监听相关操作 4.添加游戏背景 5.加载玩家飞机 6.获取玩家飞机矩阵 三.完整代码编写 游戏背景类编写 ...

  8. 飞机大战小游戏(超详细)

    偷学Python之最后的项目二:飞机大战小游戏(超详细) 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志.--苏轼 甜甜先说 这次用Python中的pygame模块来完成一个飞机大战的小游戏:基本思 ...

  9. Vue 开发一个简略版的飞机大战小游戏

    文章目录 使用 Vue 开发一个简略版的飞机大战小游戏 一.实现思路 二.所需知识点 三.实现步骤 使用 Vue 开发一个简略版的飞机大战小游戏 如题,假设你为了向更多访问你博客的人展示你的技术,你决 ...

最新文章

  1. 面试前必知必会的二分查找及其变种
  2. 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)
  3. Windows Server Backup 备份活动目录
  4. 微信lbs开发 php,【LBS】基于地理位置的搜索之微信 附近的人 简单实现
  5. CN Erlounge IV 讲师名单公布及Call For Topic
  6. InstallShield For .Net制作.Net项目安装包之完整代码
  7. 怎么把苹果手机通讯录导入华为手机_批量Excel表格号码导入苹果、安卓智能手机通讯录...
  8. Eucalyptus云之面纱
  9. android 图片字体涂鸦,android 实现在照片上绘制涂鸦的方法
  10. easyExcel导出下拉选择框,多sheet数据excle导入导出
  11. 【转】为什么SPSS的日期要以1582年10月14日为基准
  12. 软件工程考C语言的学校,软件考研学校排名,软件工程性价比较高的考研学校有哪些?...
  13. dvcs-ripper安装教程
  14. C/S与B/S应用的区别
  15. 【开发指南】AR Foundation 开发环境部署
  16. 遥感影像处理书籍推荐
  17. mac mini 键盘调节显示器亮度
  18. Google DeepMind在全球使用AI的10种方式
  19. 如何禁用和恢复任务管理器
  20. BigBlueButton配置文件bbb-conf说明

热门文章

  1. 字节跳动数据分析岗笔试分享
  2. ckeditor5+vue2 实现自定义文件上传插件
  3. php更换wordpress用户头像,wordpress设置头像及管理员头像
  4. 武汉学院计算机专业分流,数学与计算机学院大类培养专业分流实施细则.doc
  5. 3D AOI/SPI技术, 3D自动光学检测/锡膏检测技术
  6. DirectSound---简易Wav播放器
  7. 嵌入式工程师月薪有多少?零基础学嵌入式要多久?
  8. 一行代码求出100以内为3倍数的所有数
  9. DownSampling向下采样
  10. 中国首家卡车新势力「被迫」造车始末,这是一年做到30亿估值的故事