day20 飞机大战射击游戏

游戏内容

有飞行物类 飞行 爆炸 的连环画, 

飞行的背景图 ,

子弹图,

还有游戏开始  暂停  结束  的画面图。

设计一个飞机大战的小游戏,

玩家用鼠标操作hero飞行机,

射出子弹杀死敌机,小蜜蜂。

敌机可以获得分数,蜜蜂可以随机获得命 或者子弹火力(射出双倍子弹)

hero机碰到敌人会掉命。

没命了游戏结束。

world.java世界代码

package com.oracle.shoot;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

/**
 * 整个游戏世界
 */
public class World extends JPanel{
    public static final int WIDTH = 400;  //窗口的宽
    public static final int HEIGHT = 700; //窗口的高


    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; //游戏结束状态
    private int state = START; //当前状态(默认为启动状态)

    private static BufferedImage start;    //启动图
    private static BufferedImage pause;    //暂停图
    private static BufferedImage gameover; //游戏结束图
    static { //初始化静态资源
        start = FlyingObject.loadImage("start.png");
        pause = FlyingObject.loadImage("pause.png");
        gameover = FlyingObject.loadImage("gameover.png");
    }

    private Sky sky = new Sky();    //天空
    private Hero hero = new Hero(); //英雄机

    private FlyingObject[] enemies = {}; //敌人(小敌机、大敌机、小蜜蜂)数组
    private Bullet[] bullets = {}; //子弹数组

    /**
     * 生成敌人对象
     */
    public FlyingObject nextOne() {
        Random rand = new Random(); //随机数对象
        int type = rand.nextInt(20); //0到19之间
        if(type<5) { //0到4,生成小蜜蜂
            return new Bee();
        }else if(type<12) { //5到11,生成小敌机
            return new Airplane();
        }else { //12到19,生成大敌机
            return new BigAirplane();
        }
    }


    int enterIndex = 0; //敌人入场计数
    /** 敌人(小敌机、大敌机、小蜜蜂)入场 */
    public void enterAction() { //每10毫秒走一次
        enterIndex++; //每10毫秒增1
        if(enterIndex%40==0) { //每400(40*10)毫秒走一次
            FlyingObject obj = nextOne(); //获取敌人对象
            enemies = Arrays.copyOf(enemies,enemies.length+1); //扩容
            enemies[enemies.length-1] = obj; //将敌人添加到enemies最后一个元素上
        }
    }

    int shootIndex = 0; //子弹入场计数
    /** 子弹入场 */
    public void shootAction() { //每10毫秒走一次
        shootIndex++; //每10毫秒增1
        if(shootIndex%30==0) { //每300(30*10)毫秒走一次
            Bullet[] bs = hero.shoot(); //获取子弹对象
            bullets = Arrays.copyOf(bullets,bullets.length+bs.length); //扩容(bs有几个元素就扩大几个容量)
            System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length); //数组的追加
        }
    }

    /** 飞行物移动 */
    public void stepAction() { //每10毫秒走一次
        sky.step(); //天空动
        for(int i=0;i<enemies.length;i++) { //遍历所有敌人
            enemies[i].step(); //敌人动
        }
        for(int i=0;i<bullets.length;i++) { //遍历所有子弹
            bullets[i].step(); //子弹动
        }
    }


    /**
     * 删除越界的敌人和子弹
     */
    public void outOfBoundsAction() { //每10毫秒走一次
        int index = 0; //1)不越界敌人数组的下标 2)不越界敌人的个数
        FlyingObject[] enemyLives = new FlyingObject[enemies.length]; //不越界敌人数组
        for(int i=0;i<enemies.length;i++) { //遍历所有敌人
            FlyingObject f = enemies[i]; //获取每一个敌人
            if(!f.outOfBounds()) { //不越界
                enemyLives[index] = f; //将不越界敌人对象添加到不越界敌人数组中
                index++; //1)不越界敌人数组下标增一 2)不越界敌人个数增一
            }
        }
        enemies = Arrays.copyOf(enemyLives,index); //将不越界敌人数组复制到enemies中,index为几则enemies长度为几

        index = 0; //1)下标归零 2)个数归零
        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);

    }



    int score = 0; //玩家的得分
    /**
     * 子弹与敌人的碰撞
     */
    public void bulletBangAction() { //每10毫秒走一次
        for(int i=0;i<bullets.length;i++) { //遍历所有子弹
            Bullet b = bullets[i]; //获取每一个子弹
            for(int j=0;j<enemies.length;j++) { //遍历所有敌人
                FlyingObject f = enemies[j]; //获取每一个敌人
                if(b.isLife() && f.isLife() && f.hit(b)) { //撞上了
                    b.goDead(); //子弹去死
                    f.goDead(); //敌人去死
                    if(f instanceof Enemy) { //若被撞敌人能得分
                        Enemy e = (Enemy)f;  //则强转为得分接口
                        score += e.getScore(); //玩家得分
                    }
                    if(f instanceof Award) { //若被撞敌人为奖励
                        Award a = (Award)f;  //则强转为奖励接口
                        int type = a.getAwardType(); //获取奖励类型
                        switch(type) { //根据奖励类型让英雄机获取不同的奖励
                            case Award.DOUBLE_FIRE:   //若奖励类型为火力值
                                hero.addDoubleFire(); //则英雄机增火力
                                break;
                            case Award.LIFE:    //若奖励类型为命
                                hero.addLife(); //则英雄机增命
                                break;
                        }
                    }
                }
            }
        }
    }


    /**
     * 英雄机与敌人的碰撞
     */
    public void heroBangAction() { //每10毫秒走一次
        for(int i=0;i<enemies.length;i++) { //遍历所有敌人
            FlyingObject f = enemies[i]; //获取每一个敌人
            if(hero.isLife() && f.isLife() && f.hit(hero)) { //撞上了
                f.goDead(); //敌人去死
                hero.subtractLife(); //英雄机减命
                hero.clearDoubleFire(); //英雄机清空火力值
            }
        }
    }

    /**
     * 检测游戏结束
     */
    public void checkGameOverAction() { //每10毫秒走一次
        if(hero.getLife()<=0) { //游戏结束了
            state=GAME_OVER; //当前状态修改为游戏结束状态
        }
    }


    /**
     * 程序启动的执行
     */
    public void action() { //定时器对象
        //鼠标侦听器对象
        MouseAdapter l = new MouseAdapter() {
            /** 重写mouseMoved()鼠标移动 */
            public void mouseMoved(MouseEvent e) {
                if(state==RUNNING) { //运行状态时执行
                    int x = e.getX(); //获取鼠标的x坐标
                    int y = e.getY(); //获取鼠标的y坐标
                    hero.moveTo(x, y); //英雄机随着鼠标移动
                }
            }
            /** 重写mouseClicked()鼠标点击 */
            public void mouseClicked(MouseEvent e) {
                switch(state) { //根据当前状态做不同的处理
                    case START:        //启动状态时
                        state=RUNNING; //修改为运行状态
                        break;
                    case GAME_OVER:  //游戏结束状态时
                        score = 0; //清理现场
                        sky = new Sky();
                        hero = new Hero();
                        enemies = new FlyingObject[0];
                        bullets = new Bullet[0];
                        state=START; //修改为启动状态
                        break;
                }
            }
            /** 重写mouseExited()鼠标移出 */
            public void mouseExited(MouseEvent e) {
                if(state==RUNNING) { //运行状态时
                    state=PAUSE;     //修改为暂停状态
                }
            }
            /** 重写mouseEntered()鼠标移入 */
            public void mouseEntered(MouseEvent e) {
                if(state==PAUSE) { //暂停状态时
                    state=RUNNING; //修改为运行状态
                }
            }
        };
        this.addMouseListener(l); //处理鼠标操作事件
        this.addMouseMotionListener(l); //处理鼠标滑动事件

        Timer timer = new Timer(); //定时器对象
        int intervel = 10; //以毫秒为单位
        timer.schedule(new TimerTask() {
            public void run() { //定时干的事--每10毫秒走一次
                if(state==RUNNING) { //运行状态时执行
                    enterAction(); //敌人(小敌机、大敌机、小蜜蜂)入场
                    shootAction(); //子弹入场(英雄机发射子弹对象)
                    stepAction();  //飞行物移动
                    outOfBoundsAction(); //删除越界的敌人和子弹
                    bulletBangAction();  //子弹与敌人的碰撞
                    heroBangAction(); //英雄机与敌人的碰撞
                    checkGameOverAction(); //检测游戏结束
                }
                repaint();     //重画(调用paint())
            }
        },intervel,intervel); //定时计划
    }

    /**
     * 重写paint()画
     */
    public void paint(Graphics g) {
        sky.paintObject(g);  //画天空
        hero.paintObject(g); //画英雄机
        for(int i=0;i<enemies.length;i++) { //遍历所有敌人
            enemies[i].paintObject(g); //画敌人
        }
        for(int i=0;i<bullets.length;i++) { //遍历所有子弹
            bullets[i].paintObject(g); //画子弹
        }
        g.drawString("SCORE: "+score,10,25); //画分
        g.drawString("LIFE: "+hero.getLife(),10,45); //画命

        switch(state) { //在不同状态下画不同的图
            case START: //启动状态下画启动图
                g.drawImage(start,0,0,null);
                break;
            case PAUSE: //暂停状态下画暂停图
                g.drawImage(pause,0,0,null);
                break;
            case GAME_OVER: //游戏结束状态下画游戏结束图
                g.drawImage(gameover,0,0,null);
                break;
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        World world = new World();
        frame.add(world);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH,HEIGHT);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true); //1)设置窗口可见 2)尽快调用paint()方法

        world.action();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值