飞机大战java开发环境,基于java的飞机大战游戏的设计与实现

  飞机大战java开发环境,基于java的飞机大战游戏的设计与实现

  00-1010一、飞机战斗1封装了所有飞行物体的共同属性和功能2封装了英雄飞机的属性和功能3封装了敌机的属性和功能4封装了大型飞机的属性和功能5子弹6飞机战斗射击的主要方法2。测试结果本例分享Java的具体代码,供大家参考。具体内容如下

  

目录

 

  00-1010导入java.awt.image.BufferedImag/***封装了所有飞行物公共属性和函数的父类*/公共抽象类flyer { protected int x;//飞行物左上角的X坐标被保护int y;//飞行物左上角的Y坐标被保护int height//飞行物的高度受保护int width//飞行物体保护BufferedImage图像的宽度;//飞行物图片/* * *要求所有飞行物必须能移动*但是移动的方式是子类自己实现的*/public abstract void step();/* * *检查越界的方法* @ return is out of bounds */public abstract boolean out of bounds();/* * *一个专门检测两个矩形飞行物是否碰撞的工具方法*与具体物体无关,所以定义为静态方法* @param f1飞行物1 * @param f2飞行物2 * @return它们是否碰撞*/public static boom(Flyer F1,Flyer f2){ //step1:求两个矩形的中心点int f1x=F1 . x f1.width/2; int f1y=F1 . y f1.height/2; int f2x=F2 . x f2.width/2; int f2y=F2 . y f2.height/2;//step 2:水平和垂直碰撞boolean V=math . ABS(f1y-f2y)(f1 . height F2 . height)/2;///step3:必须同时与两个方向的return HV发生碰撞;}}

  

一、飞机大战

导入Java . util . random;/* * *封装了英雄机的属性和函数类*/公有类hero扩展flyer { private int doublefire//双倍火力子弹私人int生命;//健康值私有int分数;//Score//提供public int getLife(){ return life;}//外部提供的获取score public int get score(){ return score;}/* * *英雄机器对象*/public hero(){ image=shoot game . hero 0的无参数构造方法;height=image . get height();width=image . getwidth();x=127y=388double fire=0;生命=3;得分=0;}/* * *实现英雄机动画效果的方法*让英雄机的画面在hero0和hero1之间切换*/@ override public void step(){ random r=new random();if(r . nextint(2)==0){ image=shoot game . hero 0;} else { image=shoot game . hero 1;} } @ Override public boolean out of bounds(){//TODO自动生成

 

  ted method stub        return false;    }    /**     * 英雄机随鼠标移动的方法     * 要求传入鼠标当前的位置     * @param x 鼠标位置的x坐标     * @param y 鼠标位置的y坐标     */    public void move(int x,int y){        //传入的x,y是鼠标的坐标        //move的作用是让英雄机的中心位置和鼠标位置一致        this.x = x - width / 2;        this.y = y - height / 2;    }    /**     * 英雄机获得分数或奖励的方法     * @param f 是一个飞行物父类方法,可以指向敌机或者大飞机     */    public void getScore_Award(Flyer f){        //先判断敌人对象的类型        if(f instanceof Airplane){ //如果敌人是敌机            //获得敌机对象中的分数,加到当现分数上            score += ((Airplane)f).getScore();        }else{ //如果对象是大飞机            //继续判断大飞机对象中保存的奖励类型            if(((BigPlane)f).getAwardType() == BigPlane.DOUBLE_FIRE){                //如果保存的是双倍火力                doubleFire += 20;            }else{                //如果保存的是生命值奖励                life += 1;            }        }    }    /**     * 英雄机发射子弹的方法     * @return 新创建出来的子弹对名     *          可能是一发,也可能 是两发,用数组保存     */    public Bullet[] shoot(){        Bullet[] bullets = null;        //何时开启双倍火力:        if(doubleFire != 0){ //创建双倍火力            bullets = new Bullet[2];            Bullet b1 = new Bullet(x + width/4 - ShootGame.bullet.getWidth()/2,y + ShootGame.bullet.getWidth());            Bullet b2 = new Bullet(x + width*3/4 - ShootGame.bullet.getWidth()/2,y + ShootGame.bullet.getWidth());            bullets[0] = b1;            bullets[1] = b2;            //每创建一个双倍火力,doubleFire-1            doubleFire -= 1;        }else{            //单倍火力:            //子弹x坐标:x+英雄机宽度/2-子弹宽度/2            //子弹y坐标:y-子弹高度            bullets = new Bullet[1];            bullets[0] = new Bullet(x + width/2 - ShootGame.bullet.getWidth()/2,y - ShootGame.bullet.getHeight());        }        return bullets;    }    /**     * 英雄机自带和敌人碰撞检测方法     * @param f 可能发生碰撞的敌人     *          可能是敌机也可能是大飞机     * @return 是否碰撞     */    public boolean hit(Flyer f){        //调用碰撞检测方法,检测是否碰撞        boolean r = Flyer.boom(this, f);        if(r){ //如果碰撞            life--;            doubleFire = 0;        }        return r;    }}

 

  

3 封装敌机属性和功能的类

import java.util.Random;/** * 封装敌机属性和功能的类 */public class Airplane extends Flyer {    private int speed = 2; //敌机每次下落2个单位长度    private int score = 5; //敌机包含的奖励分数    //对外提供的读取敌机奖励分数的方法    public int getScore(){        return score;    }    /**     * 敌机类的无参构造方法     */    public Airplane(){        image = ShootGame.airplane;        width = image.getWidth();        height = image.getHeight();        y = -height;        Random r = new Random();        x = r.nextInt(ShootGame.WIDTH - width);    }    @Override    public void step() {        //敌机每次向下移动一个speed长度        y += speed;    }    @Override    public boolean outOfBounds() {        //敌机y坐标>游戏界面,越界        return y > ShootGame.HEIGHT;    }}

 

  

4 封装大飞机属性和功能的类

import java.util.Random;/** * 封装大飞机属性和功能的类 */public class BigPlane extends Flyer {    /*定义奖励类型的备选项常量*/    public static final int DOUBLE_FIRE = 0; //奖励类型是0,说明奖励双倍火力    public static final int FILE = 1; //奖励类型是1,说明奖励一次生命    /*大飞机类私有成员*/    private int xspeed = 1; //水平移动的速度为1    private int yspeed = 2; //垂直移动的速度为2    private int awardType; //当前大飞机保存的奖励类型    //对外提供的读取大飞机奖励类型的方法    public int getAwardType(){        return awardType;    }    /**     * 大飞机的无参构造方法     */    public BigPlane(){        //step1: 从主程序中获取大飞机图片的静态变量——bigplane        image = ShootGame.bigplane;        //step2: 使用图片宽高设置对象宽高        width = image.getWidth();        height= image.getHeight();        //step3: 设置大飞机开始下落的高度        y = -height;        //step4:  大飞机对象开始下落的x坐标在0~(界面宽度 - 大飞机图片宽度)之前随机        Random r = new Random();        x = r.nextInt(ShootGame.WIDTH - width);        //在0和1之间随机先择一种奖励类型        awardType = r.nextInt(2);    }    @Override    public void step() {        //每次x移动一个xspeed,y移动一个yspeed        x += xspeed;        y += yspeed;        //大飞机不能起出边界,一旦超出那么xspeed*(-1),相当于反向移动        if(x < 0 x > ShootGame.WIDTH - width){            xspeed *= -1;        }    }    @Override    public boolean outOfBounds() {        //大飞机的y坐标>游戏界面,越界        return y > ShootGame.HEIGHT;    }}

 

  

5 子弹类

public class Bullet extends Flyer{    private int speed = 5; //子弹上升的速度为3    /**     * 子弹类的带参构造方法     * 因为子弹对象创造的位置要根据英雄机的位置决定     * 所以子弹对名的x和y要从外界传入     * @param x 英雄机指定子弹创造位置的x坐标     * @param y 英雄机指定子弹创造位置的y坐标     */    public Bullet(int x,int y){        image = ShootGame.bullet;        width = image.getWidth();        height = image.getHeight();        this.x = x;        this.y = y;    }    @Override    public void step() {        //子弹每次向上移动一个speed长度        y -= speed;    }    @Override    public boolean outOfBounds() {        //子弹的y坐标+子弹的高度<0,越界        return (y + height) < 0;    }}

 

  

6 飞机大战射击的主方法

import java.awt.Font;import java.awt.Graphics;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;import javax.imageio.ImageIO;import javax.swing.JFrame;import javax.swing.JPanel;public class ShootGame extends JPanel {    private static final long serialVersionUID = 1L;    //背景图片的大小320*568    public static final int WIDTH = 320;    public static final int HEIGHT = 568;    //游戏界面固定大小336*607    public static final int FRAME_WIDTH = 336;    public static final int FRAME_HEIGHT = 607;    /*     * 游戏启动第一件事是从硬盘加载所有要用到的图片到内存当中     * 而且仅在启动时加载一次——静态块     * 缓存在程序中的所有图片,都会反复使用,仅保存一份——静态变量     * 下面,为每张图片加载一个静态变量,然后在静态块加加载每张图片     */    public static BufferedImage background; //背景图片    public static BufferedImage start; //开始图片    public static BufferedImage airplane; //敌机图片    public static BufferedImage bigplane; //大飞机    public static BufferedImage hero0; //英雄机状态0    public static BufferedImage hero1; //英雄机状态1    public static BufferedImage bullet; //子弹    public static BufferedImage pause; //暂停图片    public static BufferedImage gameover; //游戏结束    //静态块,在类加载到方法区时执行一次,专门加载静态资源    static{        /*         * java从硬盘中加载图片到内存中:         * ImageIO.read方法:专门从硬盘中加载图片的静态方法         * 不用实例化,直接调用         * ShootGame.class:获得当前类的加载器所在路径         * ShootGame.class.getRerource("文件名"); 从当前类所在路径加载指定文件到程序中         */        try {            background = ImageIO.read(ShootGame.class.getResource("background.png"));            airplane = ImageIO.read(ShootGame.class.getResource("airplane.png"));            bigplane = ImageIO.read(ShootGame.class.getResource("bigplane.png"));            bullet = ImageIO.read(ShootGame.class.getResource("bullet.png"));            start = ImageIO.read(ShootGame.class.getResource("start.png"));            pause = ImageIO.read(ShootGame.class.getResource("pause.png"));            hero0 = ImageIO.read(ShootGame.class.getResource("hero0.png"));            hero1 = ImageIO.read(ShootGame.class.getResource("hero1.png"));            gameover = ImageIO.read(ShootGame.class.getResource("gameover.png"));        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    /*     * 为游戏中的角色定义数据结构,包括:     * 1个英雄机对象     * 1个存储所有敌人(敌机和大飞机)的对象数组     * 1个存储所有子弹的对象数组     */    public Hero hero = new Hero();    public Flyer[] flyers = {}; //存储所有敌人对象的数组    public Bullet[] bullets = {}; //存储所有子弹对象的数组    //定义游戏状态:当前状态变量:默认为开始状态    private int state = START;    //定义游戏状态的备选项常量:    public static final int START = 0;    public static final int RUNNING = 1;    public static final int PAUSE = 2;    public static final int GAME_OVER = 3;    public static void main(String[] args) {        /*         * java中绘制窗体:JFrame对象——窗框         * 要想在窗体中绘制内容,还需要嵌入背景面板——JPanel         */        JFrame frame = new JFrame("ShootGame");        frame.setSize(FRAME_WIDTH,FRAME_HEIGHT);//(336, 607);        frame.setAlwaysOnTop(true); //设置窗体置顶        //设置窗体关闭同时,退出程序        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        frame.setLocationRelativeTo(null); //设置窗体的位置,null表示居中        /*在窗体中嵌入背景面板对象——JPanel*/        ShootGame game = new ShootGame(); //创建背景面板对象        frame.add(game); //将背景面板对象嵌入到窗体对象中        /*窗体默认不可见!必须调用setVisible方法才能显示窗体*/        frame.setVisible(true); //自动调用窗体的paint方法        game.action();    }    /**     * 游戏启动时要做的事     */    public void action(){        /*游戏开始时,要定义鼠标事件的监听*/        //step1: 创建MouseAdapter匿名内部类——事件的响应程序        MouseAdapter l = new MouseAdapter(){            //step2: 重写希望的鼠标事件——鼠标移动            @Override            public void mouseMoved(MouseEvent e) {                //只有在RUNNING状态下英雄机才跟随鼠标移动                if(state == RUNNING){                    //step3: 获得鼠标新位置                    int x = e.getX();                    int y = e.getY();                    //step4: 将鼠标位置传给英雄机的move方法                    hero.move(x, y);                }            }            @Override            public void mouseClicked(MouseEvent e) {                if(state == START state == PAUSE){ //START或者PAUSE状态,单击才会改改为RUNNING状态                    state = RUNNING;                }else if(state == RUNNING){ //游戏点击暂停                    state = PAUSE;                }else if(state == GAME_OVER){ //游戏结束后单击,游戏初始化                    state = START;                    //从GAME_OVER到START,要重新初始化游戏数据                    flyers = new Flyer[0];                    bullets = new Bullet[0];                    hero = new Hero();                }            }         &am      

	  
	  
	  
	  
	  
	  
        

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: