用java编写飞机大战

游戏界面使用JFrame和JPanel构建。背景图通过BG类绘制。英雄机和敌机在界面上显示并移动。子弹从英雄机发射并在屏幕上移动。游戏有四种状态:READY、RUNNING、PAUSE、GAMEOVER。状态通过鼠标点击进行切换:点击开始游戏(从READY变为RUNNING)。点击重新开始游戏(从GAMEOVER变为READY)。鼠标移出窗口时游戏暂停(从RUNNING变为PAUSE)。鼠标移入窗口时游戏继续(从PAUSE变为RUNNING)。开局默认玩家生命值为3,分数为0。每隔一定时间随机生成敌机(小飞机、大飞机、小飞碟)。敌机在屏幕上移动,并与英雄机进行碰撞检测。英雄机可以发射子弹。子弹在屏幕上移动,并与敌机进行碰撞检测。英雄机与敌机发生碰撞时,英雄机会损失一条生命值。子弹与敌机发生碰撞时,敌机会被摧毁,玩家的分增加。当子弹与奖励机发生碰撞时,奖励机会被摧毁,玩家随机获得两张奖励(生命值加1、双倍子弹)。在屏幕左上角显示当前的生命值和得分。生命值减少到0时,游戏进入结束状态。再次点击,重新开始游戏。

1.图片素材(百度网盘分享)

链接:https://pan.baidu.com/s/10QiTcddI_Zxw5jbn8fmOpA?pwd=huan 
提取码:huan

2.主页面world.java

package plane.gzeu;

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

public class World extends JPanel {
    //ImageIcon类:保存图片的路径----->读取图片
//    ImageIcon icon = new ImageIcon("images\\background.png");
//    BG bg = new BG(0,0,420,700,2);
//    Airplane airplane = new Airplane(100,200,300,620,2);
//    Bee bee = new Bee(200,100,200,700,2);
    BG bg = new BG();
    EnemyPlane [] planes;
    Hero hero;
    int index; //用来控制敌机的数量
    Bullet[] bullets;  //创建子弹的数组
    int life; //英雄机的生命值
    int score; //分数
    //定义游戏的四种状态:准备,运行,暂停,结束(常量)
    public static final int READY = 0;
    public static final int RUNNING = 1;
    public static final int PAUSE = 2;
    public static final int GAMEOVER = 3;
    //游戏的初始状态
    int state = READY;


    //    Airplane [] airPlanes = new Airplane[10];
//    Bigairplane [] bigAirPlanes = new Bigairplane[10];
//    Bee [] bee = new Bee[10];
//    Bom [] bom = new Bom[4];
//    Bullet [] bullets = new Bullet[3];
//    Hero [] hero =new Hero[2];
    //初始化方法
    public void init(){
        bg = new BG();
        hero = new Hero();
        planes = new EnemyPlane[0]; //默认一个敌机都没有
        bullets = new Bullet[0];  //默认一个子弹都没有
        index = 0; //默认从0开始
        life = 3; //默认3条命
        score = 0; //分数为0
    }
    public World() {
        init();

//        for(int i=0;i<planes.length;i++){
//            if(i%2==0){
//                planes[i]=new Airplane();
//            }
//            else if(i%5==0 && i%2!=0){
//                planes[i] = new Bee();
//            }
//            else {
//                planes[i] = new Bigairplane();
//            }
//        }
//        for(int i =0;i<airPlanes.length;i++){
//            airPlanes[i] = new Airplane();
//            bigAirPlanes[i]=new BigAirPlane();
//            bee[i]=new Bee();
//            bom[i]=new Bom();
//            bullets[i]=new Bullet();
//            hero[i]=new Hero();
    }
    //生成敌机的方法
    public void createPlane(){
        if(index%16==0){
            int n = (int)(Math.random()*10);
            EnemyPlane plane;
            switch (n){
                case 9 :
                    plane = new Bee(); //10%生成小飞碟
                    break;
                case 8 :
                case 7 :
                    plane = new Bigairplane(); //20%生成大飞机
                    break;
                default:
                    plane = new Airplane(); //70%生成小飞机

            }
            //将敌机存入数组中之前,要先对数组进行扩容处理
            planes = Arrays.copyOf(planes,planes.length+1);
            //将生存的敌机放入数组的最后一个位置
            planes[planes.length-1] = plane;
        }
    }


//        for(int i =0;i<bigAirPlanes.length;i++){
//            bigAirPlanes[i]=new Bigairplane();
//       }
//    }

    //绘制图片printing
    @Override
    public void paint(Graphics g) { //paint挂载到当前类,当前类实例化(创建对象)时自动调用
//      super.paint(g);
//      icon.paintIcon(this,g,0,y1++); //绘制背景,默认第一个绘制
//        bg.icon.paintIcon(this,g,(int)bg.x,(int)bg.y);
//      bg.move();
//        airplane.icon.paintIcon(this,g,(int)airplane.x,(int)airplane.y);
//        bee.icon.paintIcon(this,g,(int)bee.x,(int)bee.y);
        bg.painting(g);
        hero.painting(g);
        for(int i=0;i<planes.length;i++){
            planes[i].painting(g);
        }
        for(int i=0;i<bullets.length;i++){
            bullets[i].painting(g);
        }
        g.setColor(new Color(255,255,255));
        //设置字体
        g.setFont(new Font("微软雅黑",Font.BOLD,20));
        g.drawString("生命值"+life,20,20);
        g.drawString("分数"+score,20,40);
        if(state==READY){
            Images.start.paintIcon(this,g,0,0);
        }
        if(state==PAUSE){
            Images.pause.paintIcon(this,g,0,0);
        }
        if(state==GAMEOVER){
            Images.gameover.paintIcon(this,g,0,0);
        }

//            for(int i =0;i<airPlanes.length;i++){
//                airPlanes[i].painting(g);
//            bigAirPlanes[i].painting(g);
//            bee[i].painting(g);
//            bom[i].painting(g);
//            bullets[i].painting(g);
//            hero[i].painting(g);
//            }
//            for(int i =0;i<bigAirPlanes.length;i++){
//                bigAirPlanes[i].painting(g);
//            }
        repaint();//刷新窗口
    }
    public static void main(String[] args) {
        //1.显示画框(外层):JFrame
        JFrame jf = new JFrame();

        //2.显示面板:Jpanel
        World jp =new World();

        //3.将面板放入画框中:
        jf.add(jp);

        //对窗口进行设置
        jf.setTitle("我的窗口");//设置标题
        jf.setSize(436,700); //设置窗口大小
        jf.setLocationRelativeTo(null); //居中显示
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置关闭窗口后自动结束程序

        //4.显示窗口
        jf.setVisible(true);
        jp.action();
    }
    //唤醒定时器的方法
    public void action(){
        java.util.Timer timer = new Timer();
        MyTesk mt = new MyTesk();
        timer.schedule(mt,1000,1000/50);
        this.addMouseListener(new MouseAdapter() {
            //监听鼠标点击
            @Override
            public void mouseClicked(MouseEvent e) {
                if(state==READY){
                    state=RUNNING;
                }
                if(state==GAMEOVER){
                    state=READY;
                    init();
                }
            }
            //鼠标移除
            @Override
            public void mouseExited(MouseEvent e) {
//                System.out.println("鼠标移出");
                if(state==RUNNING){
                    state=PAUSE;
                }
            }
            //鼠标移入
            @Override
            public void mouseEntered(MouseEvent e) {
                if(state==PAUSE){
                    state=RUNNING;
                }
            }
        });
        //匿名内部类
        MouseAdapter mouseAdapter = new MouseAdapter() {
            @Override
            public void mouseMoved(MouseEvent e) {
                if(state==RUNNING){
                    int x = e.getX();
                    int y = e.getY();
                    hero.move(x,y);
                }
            }
        };
        //安装监听器
        this.addMouseMotionListener(mouseAdapter);
    }
    public void createBullet(){
        if(!hero.isLiving()){ //英雄机死亡不发射子弹
            return;
        }
        if(index%17==0){
            Bullet[] bullets1 = hero.double_fire();
            //俩个数组的合并
           Bullet[] arr = Arrays.copyOf(bullets,bullets.length+bullets1.length);
            System.arraycopy(bullets1,0,arr,bullets.length,bullets1.length);
            bullets = arr;
//            Bullet bullet =hero.fire();  //英雄机调用fire方法生成子弹
//            //将子弹放入数组中
//            bullets = Arrays.copyOf(bullets,bullets.length+1); //子弹扩容
//            bullets[bullets.length-1] = bullet;
        }
    }
    //加分的方法
    public void addScore(FlyingObjesct plane){
        if(plane.isDead()){
            if(plane instanceof Enemy){
                Enemy enemy = (Enemy) plane; //需要做一个强制转化
                score += enemy.getScore();
            }
            if(plane instanceof Aword){
                Aword aword = (Aword) plane;
                int  type =aword.getAword();
                if(type == Aword.DOUBLE_FIRE){
                    hero.getdouble_fire();
                }
                if(type == Aword.LIFE){
                    life++;
                }
            }
        }
    }
    //检测敌机与英雄机的碰撞
    public void hero_hit(){
        if(hero.isLiving()){
            for(int i=0;i<planes.length;i++){
                if(!planes[i].isLiving()){
                    continue;
                }
                if(hero.bong(planes[i])){
                    hero.goDead();
                    planes[i].goDead();
                    break;
                }
            }
        }
        else if(hero.isWait()){ //僵尸状态
            if(life>1){
                //重新开始
                hero = new Hero();
                //清屏
                for(int i=0;i<planes.length;i++){
                    planes[i].goDead();
                }
                life--;
            }

            else{
                life--;
                state=GAMEOVER;
            }

        }
    }
    //检测每个敌机与子弹的碰撞情况
    public void hit(){
        for(int i=0;i<bullets.length;i++){
            Bullet bullet = bullets[i]; //拿出每一颗子弹
            if(!bullet.isLiving()){
                continue;
            }
            for(int j=0;j<planes.length;j++){
                FlyingObjesct p = planes[j];
                if(!p.isLiving()){
                    continue;
                }
                if(p.bong(bullet)){  //被击中
                    p.attack();
                    bullet.goDead();
                    addScore(p);
                }
            }
        }
    }

    //清理爆炸的飞机
    public void clean(){
        //清除飞机
        EnemyPlane[] living = new EnemyPlane[planes.length];
        int index = 0;
        for(int i=0;i<planes.length;i++){  //遍历敌机数组
            if(planes[i].isWait() || planes[i].outOfBound()){  //如果是等待状态的效果就跳过
                continue;
            }
            living[index++] = planes[i];  //将不是等待状态的敌机存在living里面
        }
        planes = Arrays.copyOf(living,index);
        //清除子弹
        Bullet[] livingBullet = new Bullet[bullets.length];
        index = 0;
        for(int i=0;i<bullets.length;i++){
            if(bullets[i].isDead() || bullets[i].outOfBound()){    //如果是已经爆炸的子弹就跳过
                continue;
            }
            livingBullet[index++] = bullets[i];
        }
        bullets = Arrays.copyOf(livingBullet,index);
    }


    class MyTesk extends TimerTask {

        @Override
        public void run() {
            index++;
            if(state == RUNNING){
                createPlane(); //调用生成敌机的方法
                createBullet(); //调用生成子弹的方法
                hit();//调用子弹击打的效果
                clean(); //调用清理敌机方法
                hero_hit();
                bg.move();
                for(int i =0;i<planes.length;i++){
                    planes[i].move();
                }
                for(int i =0;i<bullets.length;i++){
                    bullets[i].move();
                }
            }

        }
    }
}

3.小飞机类Airplane.java

package plane.gzeu;

import javax.swing.*;
//飞机类
public class Airplane extends EnemyPlane implements Enemy{ // 实现接口时,要实现接口中的方法
    public Airplane(){
        this.images = Images.airplane;
        w = images[0].getIconWidth();
        h = images[0].getIconHeight();
        x=(int)(Math.random()*(420-images[0].getIconWidth()));
        y=-2*images[0].getIconHeight();
        this.step=(Math.random()*2.5+0.7);
        this.icon=new ImageIcon("images\\airplane1.png");
//        this.icon = Images.airplane[0];
    }
    public Airplane(double x, double y, double w, double h,double speed) {
//        super(x, y, w, h);
        this.step=speed;
        this.icon=Images.airplane[0];
    }


    @Override
    public int getScore() {
        return 10;
    }
}

4.大飞机类Bigairplane

package plane.gzeu;

//大飞机类
public class Bigairplane extends EnemyPlane implements Enemy{
    public Bigairplane(double x, double y, double w, double h,double step) {
//        super(x, y, w, h);
        this.step=step;
        this.icon = Images.bigairplane[0];
    }
    public Bigairplane(){
        this.images = Images.bigairplane; //初始化数组
        w = images[0].getIconWidth();
        h = images[0].getIconHeight();
        x=(int)(Math.random()*(420-images[0].getIconWidth()));
        y=-2*images[0].getIconHeight();
        this.step=(Math.random()*3.5+0.7);
//        this.icon = Images.bigairplane[0];
        life = 4;
    }

    @Override
    public int getScore() {
        return 50;
    }
}

5.英雄机类Hero.java

package plane.gzeu;

import javax.swing.*;

import static plane.gzeu.Images.bullet;

public class Hero  extends EnemyPlane{
    public Hero(){
        this.images = Images.hero;
        x=431/2-images[0].getIconWidth()/2;
        y=510;
        w=images[0].getIconWidth();
        h=images[0].getIconHeight();
//        this.speed=0.2;
        this.icon = Images.hero[0];
    }
    public Hero(double x, double y, double w, double h,double step) {
//        super(x, y, w, h);
        this.step=step;
//        this.icon = new ImageIcon("images\\hero1.png"); //设置了Images类直接调用类名就可以引用图片
        this.icon = Images.hero[0];
    }
    @Override
    public void move() {}
    //接收鼠标的坐标
    public void move(int x,int y) {
        this.x= x-images[0].getIconWidth()/2;
        this.y = y-images[0].getIconHeight()/2;
    }
    /*
     * 子弹的位置(在英雄机上) b.x = h.x-images[0].getIconWidth()/2; b.y=h.y
     * 子弹的移动:向上:b.y-=b.step;
     * 子弹是无限的:数序扩容
     * 射击方法:当英雄机调用一次射击方法时,就发射一个子弹
     * */
    //射击的方法
    public Bullet fire(){
        double x = this.x+w/2-4; //获取英雄机的x坐标
        Bullet bullet = new Bullet(x,y);//将处理过后的坐标传给子弹
        return bullet; //将子弹返回
    }
    //获取双倍子弹的方法
    int doubleTime = 0; // 双倍子弹的时间,20次
    public void getdouble_fire(){
        doubleTime = 20;
    }
    //双倍子弹方法
    public Bullet[] double_fire(){
        if(doubleTime>0){
            double x = this.x+w/2-7;
            double x1 = this.x+w/2-2; //获取英雄机的x坐标
            Bullet bullet1 = new Bullet(x,y);
            Bullet bullet2 = new Bullet(x1,y);//将处理过后的坐标传给子弹
            Bullet [] bullets = new Bullet[]{bullet1,bullet2};
//            return new Bullet[]{bullet1,bullet2};
            return bullets;
        }
        else {
            double x = this.x+w/2-4; //获取英雄机的x坐标
            Bullet bullet1 = new Bullet(x,y);
            return new Bullet[]{bullet1};
        }
//
    }

    //测试
//    public static void main(String[] args) {
//        Hero hero = new Hero();
//        hero.move(200,300);
//        Bullet bullet = hero.fire();
//        System.out.println(bullet.x+"  "+bullet.y);
//    }
}

6.敌机类Bee.java

package plane.gzeu;

import javax.swing.*;

public class Bee extends EnemyPlane implements Aword {
    double speed1;
    public Bee(){
        this.images = Images.bee;
        w = images[0].getIconWidth();
        h = images[0].getIconHeight();
        x=(int)(Math.random()*(420-images[0].getIconWidth()));
        y=-2*images[0].getIconHeight();
        this.step=(Math.random()*4.5+2.5);
        this.speed1=(Math.random()*3.5+0.5);
//        this.icon=new ImageIcon("images\\bee0.png");
        this.icon=Images.bee[0];
        life = 6;
    }
    public Bee(double x, double y, double w, double h,double step) {
//        super(x, y, w, h);
        this.step=step;
        this.icon = Images.bee[0];
    }
    @Override
    public void move() {
        y+=speed1;
        x+=step;
        if(x>431-images[0].getIconWidth()){
            step = -step;
        }
        if(x<=0){
            step = -step;
        }
    }

    @Override
    public int getAword() {
        return Math.random()>0.5?DOUBLE_FIRE:LIFE;
    }
}

7.背景类BG.java

package plane.gzeu;

import javax.swing.*;
import java.awt.*;

//背景类(子类)
//继承FlyingObjesct类,得到FlyingObjesct类的方法及属性
public class BG extends FlyingObjesct {
    double y0;
    public BG(){
        x = 0;
        y = 0;
        icon = Images.bg;
        w = icon.getIconWidth();
        h = icon.getIconHeight();
        y0 = -h;
        step = 2;

    }
    public BG(double x, double y, double w, double h,double step) {
        super(x, y, w, h); //重载:调用父类的构造方法,实现方法复用
        this.step = step;
        this.icon = Images.bg; //背景是固定的
    }
    public void painting(Graphics g){
        icon.paintIcon(null,g,(int)x,(int)y);
        icon.paintIcon(null,g,(int)x,(int)y0);
    }
    @Override
    public void move() {
        y+=step;
        y0+=step;
        if(y>=h){
            y=-h;
        }
        if(y0>=h){
            y0=-h;
        }
    }
}

8.爆炸类Bom.java

package plane.gzeu;

import javax.swing.*;


public class Bom extends EnemyPlane{
    public Bom(){
        x=(int)(Math.random()*370);
        y=(int)(Math.random()*370);
        this.step = 0.2;
        this.icon = Images.bom[0];
    }
    public Bom(double x, double y, double w, double h, double speed) {//要重写父类的构造方法。新增一个速度
//        super(x, y, w, h);//重载:调用父类的构造方法,实现方法复用
        this.step=speed;
        this.icon=Images.bom[0];
    }
}

9.子弹类Bullet.java

package plane.gzeu;

import javax.swing.*;

//继承FlyingObjesct类,得到FlyingObjesct类的方法及属性
public class Bullet extends EnemyPlane {
    public Bullet(double x,double y){
        this.icon = Images.bullet;
        w = icon.getIconWidth();
        h = icon.getIconHeight();
        this.x = x;
        this.y = y;
        step = 2;
    }
    public Bullet(){
        x=(int)(Math.random()*370);
        y=(int)(Math.random()*370);
        this.step = 0.2;
        this.icon = Images.bullet;
    }
    public Bullet(double x, double y, double w, double h, double step) {
//        super(x, y, w, h); //重载:调用父类的构造方法,实现方法复用
        this.step = step;
        this.icon = Images.bullet; //背景是固定的
    }

    @Override
    public void move() {
        y-=step;
    }
}

10.三种敌机总类EnemyPlane.java

package plane.gzeu;
public abstract class EnemyPlane extends FlyingObjesct {
    @Override
    public void move() {
        y+=step;
    }
}

11.飞行物的总类(父类)FlyingObjesct.java

package plane.gzeu;

import javax.swing.*;
import java.awt.*;

//飞行物的总类(父类)
public abstract class FlyingObjesct {
    public static final int LIVING = 1; //活着
    public static final int DEAD = 0; //死亡
    public static final int WAIT = -1;  //等待死亡(播放爆炸动画)
    //飞机默认是活着的
    public int state = LIVING;
    //飞机的生命值
    public int life = 2;
    public double x,y,step,w,h;//step速度
    public ImageIcon icon; //图片
//    Images images;
    public ImageIcon[] images; //数组
    public int index = 0;
    public ImageIcon [] boms = Images.bom; //存放爆炸效果的图片
    //赋初值:构造方法
    //快速生成构建方法:快捷键Alt+Insert
    public FlyingObjesct(double x, double y, double w, double h) {
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;

    }
    //当飞机击打一次,生命值减一,当生命值为0时,进入死亡状态
    public boolean attack(){
        if(life>0){
           life--;
           if(life==0){
               state = DEAD;
           }
           return true;
        }
        return false;
    }
//让敌机快速去死
    public boolean goDead(){
        if(state==LIVING){
            life = 0;
            state = DEAD;
            return true;
        }else{
            return false;
        }
    }
    //判断飞机的三种状态
    public boolean isLiving(){
        return state==LIVING;  //判断是否活着
    }
    public boolean isDead(){
        return state==DEAD;  //判断是否死了
    }
    public boolean isWait(){
        return state==WAIT;  //判断是否等待死亡
    }

    /*实现动画效果
     * 1.用数组存储动画效果图片
     * 2.初始化数组
     * 3.定义一个计数器,作为切换图片的控制条件
     * 4.写一个方法,实现切换图片的操作
     * */
    int i;
    public void nextImage(){
        switch (state){
            case LIVING:
                if(images == null) {
                    return;
                }
                icon = images[index++/300%images.length]; //0-[数组的长度-1]
                break;
            case DEAD:
                if(boms==null){
                    return;
                }
                if(i++/300==boms.length){
                    state = WAIT;
                    return;
                }
                icon = boms[i++/300];
        }


    }

    public FlyingObjesct(){}//无参构造

    //移动
    public abstract void move();

    //绘制图形 方法
    public void painting(Graphics g){
        nextImage();
        icon.paintIcon(null,g,(int)x,(int)y);
    }
    //检测敌机是否碰到子弹:判断条件中心距c=H/2+h/2
    public boolean bong(FlyingObjesct bullet){
        FlyingObjesct p =this;
        double a = Math.min(p.w,p.h)/2;
        double b = Math.min(bullet.w,bullet.h)/2;
        double x1=p.x+p.w/2;
        double y1=p.y+p.h/2;
        double x2=bullet.x+bullet.w/2;
        double y2=bullet.y+bullet.h/2;
        double c = Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
        return c<=a+b;
    }
    //清除越界的敌机和子弹条件: y<-h-100 || y>700+100
    public boolean outOfBound(){
        if(y<-h-100){
            return true;
        }else if(y>700+100){
            return true;
        }
        return false;
    }
}

12.图片类Images.java

package plane.gzeu;

import javax.swing.*;

public class Images {
    public static ImageIcon bg;
    public static ImageIcon bullet;
    public static ImageIcon start;
    public static ImageIcon pause;
    public static ImageIcon gameover;
    public static ImageIcon[] hero;
    public static ImageIcon[] bigairplane;
    public static ImageIcon[] bee;
    public static ImageIcon[] airplane;
    public static ImageIcon[] bom;
    static {
        airplane = new ImageIcon[2];
        airplane[0] = new ImageIcon("images/airplane0.png");
        airplane[1] = new ImageIcon("images/airplane1.png");
        bigairplane = new ImageIcon[2];
        bigairplane[0] = new ImageIcon("images/bigairplane0.png");
        bigairplane[1] = new ImageIcon("images/bigairplane1.png");
        bee = new ImageIcon[2];
        bee[0] = new ImageIcon("images\\bee0.png");
        bee[1] = new ImageIcon("images\\bee1.png");
        bom = new ImageIcon[4];
        bom[0] = new ImageIcon("images/bom1.png");
        bom[1] = new ImageIcon("images/bom2.png");
        bom[2] = new ImageIcon("images/bom3.png");
        bom[3] = new ImageIcon("images/bom4.png");
        bg = new ImageIcon("images\\background.png");
        bullet = new ImageIcon("images\\bullet.png");
        start = new ImageIcon("images\\start.png");
        pause = new ImageIcon("images\\pause.png");
        gameover = new ImageIcon("images\\gameover.png");
        hero = new ImageIcon[2];
        hero[0] = new ImageIcon("images\\hero0.png");
        hero[1] = new ImageIcon("images\\hero1.png");

    }
    //测试图片是否传过来了
    public static void main(String[] args) {
        System.out.println(start.getImageLoadStatus()); //如果输出8那图片传过来了,输出其他数字有问题
        System.out.println(bg.getImageLoadStatus());
        System.out.println(bom[0].getImageLoadStatus());
        System.out.println(bee[1].getImageLoadStatus());
        System.out.println(airplane[1].getImageLoadStatus());

    }

}

13.获得奖励的接口Aword.java

package plane.gzeu;
//获得奖励的接口
public interface Aword {
    int DOUBLE_FIRE = 1; //第一种奖励,双倍火力
    int LIFE = 2; //加生命值
   int getAword(); //获得奖励的方法
}

14.获得分数的接口Enemy.java

package plane.gzeu;
//获得分数的接口
public interface Enemy { //加分
//    int a = 5;//都是静态常量
//    public abstract void add(); //都是抽象方法
    public int getScore(); //获得分数的方法
}

运行界面:

开始界面

存活界面:

暂停界面

结束界面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/888399.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx06-静态资源部署

零、文章目录 Nginx06-静态资源部署 1、静态资源概述 静态资源&#xff1a;是在Web开发中不经常改变的文件&#xff0c;比如图片、CSS样式表、JavaScript脚本文件等。这些资源通常是预先编译好的&#xff0c;不需要服务器端的动态处理。动态资源&#xff1a;是在Web开发中需…

前端编程艺术(3)---JavaScript

目录 1.JavaScript 1.输出 2.变量和数据类型 3.运算符 4.数组 5.函数 6.面向对象 7.ES6面向对象 2.BOM 1.document对象 3.DOM 4.JSON 1.JavaScript JavaScript是一种脚本编程语言&#xff0c;通常用于为网页增加交互性和动态效果。它是一种高级语言&#xff…

面试(十)

目录 一. 单元测试 二. FreeRTOS和裸机哪个实时性好&#xff1f; 三. 怎么判断某个程序的运行时间 四. 函数指针 五. 全局变量被线程使用冲突 5.1 使用互斥锁 5.2 使用读写锁 5.3 使用原子操作 六. 局部变量没有初始化是什么值 七. uint_8 n 255 , n等于多少 八. …

【springboot】简易模块化开发项目整合Swagger2

接上一项目【springboot】简易模块化开发项目整合MyBatis-plus&#xff0c;进行拓展项目 1.新建模块 右键项目→New→Module&#xff0c;新建一个模块 父项目选择fast-demo&#xff0c;命名为fast-demo-config&#xff0c;用于存放所有配置项 添加后&#xff0c;项目结构如图…

计算机网络:物理层 —— 信道复用技术

文章目录 信道信道复用技术信道复用技术的作用基本原理常用的信道复用技术频分复用 FDM时分复用 TDM波分复用 WDM码分复用 CDM码片向量基本原理 信道 信道是指信息传输的通道或介质。在通信中&#xff0c;信道扮演着传输信息的媒介的角色&#xff0c;将发送方发送的信号传递给…

Flink 03 | 数据流基本操作

Flink数据流结构 DataStream 转换 通常我们需要分析的业务数据可能存在如下问题&#xff1a; 数据中包含一些我们不需要的数据 数据格式不方面分析 因此我们需要对原始数据流进行加工&#xff0c;比如过滤、转换等操作才可以进行数据分析。 “ Flink DataStream 转换主要作…

PHP变量(第④篇)

本栏目教学是php零基础到精通&#xff0c;如果你还没有安装php开发工具请查看下方链接&#xff1a; Vscode、小皮面板安装-CSDN博客 今天来讲一讲php中的变量&#xff0c;变量是用于存储信息的"容器"&#xff0c;这些数据可以在程序执行期间被修改&#xff08;即其…

nginx配置https加密

安装nginx 官网&#xff1a; https://nginx.org/ yum安装&#xff1a; https://nginx.org/en/linux_packages.html /etc/yum.repos.d/nginx.repo [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck1 enabled1 …

(C语言贪吃蛇)15.贪吃蛇吃食物

目录 前言 注意事项⚠️ 效果预览 实现方法 运行效果 新的问题&#x1f64b; 最终效果 总结 前言 我们上一节实现了解决了贪吃蛇不合理走位的情况&#xff0c;不理解的再回去看看(传送门&#xff1a;解决贪吃蛇不合理走位)&#xff0c;那么贪吃蛇自然是要吃食物的啊&…

【GEE学习第三期】GEE常用函数总结

【GEE学习第三期】GEE常用函数总结 数据统计类ee.List.sequence函数 图像处理类ee.Geometry类‌defaultVisualizationVis函数 数据输入输出数值与绘图导出影像 参考 数据统计类 ee.List.sequence函数 用法如下&#xff1a; ee.List.sequence &#xff08;开始&#xff0c;结…

windows C++-创建图像处理的异步消息(二)

创建图像处理网络 此部分介绍如何创建对给定目录中的每个 JPEG (.jpg) 图像执行图像处理的异步消息块网络。 网络执行以下图像处理操作&#xff1a; 对于 Tom 创作的任何图像&#xff0c;转换为灰度。 对于任何以红色作为主色的图像&#xff0c;移除绿色和蓝色分量&#xff0…

提升开机速度:有效管理Windows电脑自启动项,打开、关闭自启动项教程分享

日常使用Windows电脑时&#xff0c;总会需要下载各种各样的办公软件。部分软件会默认开机自启功能&#xff0c;开机启动项是指那些在电脑启动时自动运行的程序和服务。电脑开机自启太多的情况下会导致电脑卡顿&#xff0c;开机慢&#xff0c;运行不流畅的情况出现&#xff0c;而…

Unity各个操作功能+基本游戏物体创建与编辑+Unity场景概念及文件导入导出

各个操作功能 部分功能 几种操作游戏物体的方式&#xff1a; Center:有游戏物体父子关系的时候&#xff0c;中心点位置 Global/Local:世界坐标系方向/自身坐标系方向 &#xff1a;调试/暂停/下一帧 快捷键 1.Alt鼠标左键&#xff1a;可以实现巡游角度查看场景 2.鼠标滚轮…

mysql join的使用

MySQL 支持以下 JOIN 语法用于 SELECT 语句和多表 DELETE 和 UPDATE 语句中的 table_references 部分&#xff1a; table_references: 查询中涉及的一个或多个表的引用&#xff0c;可以是简单表名或 JOIN 表达式的组合。 escaped_table_reference [, escaped_table_referenc…

10.7学习

1.安全认证 ●Session 认证中最常用的一种方式&#xff0c;也是最简单的。存在多节点session丢失的情况&#xff0c;可通过nginx粘性Cookie和Redis集中式Session存储解决 ●HTTP Basic Authentication 服务端针对请求头中base64加密的Authorization 和用户名和密码进行校验。…

《贪吃蛇小游戏 1.0》源码

好久不见&#xff01; 终于搞好了简易版贪吃蛇小游戏&#xff08;C语言版&#xff09;&#xff0c;邀请你来玩一下~ 目录 Snake.h Snake.c test.c Snake.h #include<stdio.h> #include<windows.h> #include<stdbool.h> #include<stdlib.h> #inclu…

Ascend C 自定义算子开发:高效的算子实现

Ascend C 自定义算子开发&#xff1a;高效的算子实现 在 Ascend C 平台上&#xff0c;开发自定义算子能够充分发挥硬件的性能优势&#xff0c;帮助开发者针对不同的应用场景进行优化。本文将以 AddCustom 算子为例&#xff0c;介绍 Ascend C 中自定义算子的开发流程及关键技术…

FireRedTTS - 小红书最新开源AI语音克隆合成系统 免训练一键音频克隆 本地一键整合包下载

小红书技术团队FireRed最近推出了一款名为FireRedTTS的先进语音合成系统&#xff0c;该系统能够基于少量参考音频快速模仿任意音色和说话风格&#xff0c;实现独特的音频内容创造。 FireRedTTS 只需要给定文本和几秒钟参考音频&#xff0c;无需训练&#xff0c;就可模仿任意音色…

[记录]-安装pycharm

官网下载安装包&#xff1a;https://www.jetbrains.com/pycharm/ 然后按照引导安装 全部勾选

【数据管理】DAMA-元数据专题

导读&#xff1a;元数据是关于数据的组织、数据域及其关系的信息&#xff0c;是描述数据的数据。在数据治理中&#xff0c;元数据扮演着至关重要的角色&#xff0c;是数据治理的基础和支撑。以下是对数据治理中元数据专题方案的详细介绍&#xff1a; 目录 一、元数据的重要性 …