java版飞机大战代码

@

前言

很久之前整理的小东西,这个是从我个人博客网站拷过来的地址
下面是源码

Plane

package com.trhsy.cn.plane;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.io.IOException;

/**
 * @ClassName Plane
 * @Description todo
 * @Author Administrator
 * @Date 2020/3/24 002415:03
 **/
public class Plane {
    /**
     * @Author fan
     * @Description //TODO 定义一个飞机
     * @Date 15:07 2020/3/24 0024
     * @Param
     * @return
     **/
    Image planeImage = null;
    public int x = 300;
    public int y = 700;
    public int lifeCount = 5;

    /**
     * @return
     * @Author fan
     * @Description //TODO 给飞机附图片
     * @Date 15:19 2020/3/24 0024
     * @Param []
     **/
    public Plane() {
        try {
            planeImage = ImageIO.read(Plane.class.getClassLoader().getResourceAsStream("images/plane.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void draw(Graphics g) {
        // 画飞机图片
        g.drawImage(planeImage, x, y, null);
        // 飞机移动
        this.move();
        // 血条
        if (lifeCount > 0) {
            g.setColor(Color.WHITE);
            g.fillRect(20, 80, 100, 10);
            g.setColor(Color.red);
            g.fillRect(20, 80, (100 / 5) * lifeCount, 10);
            g.setColor(Color.blue);
            g.setFont(new Font("幼圆", Font.BOLD, 30));
            g.drawString("Score:" + Play.count, 20, 60);
        }
    }

    public void move() {
        if (isUP && !isDown && !isLeft && !isRight) {
            //上
            y = y - 5;
        } else if (!isUP && isDown && !isLeft && !isRight) {
            //下
            y = y + 5;
        } else if (!isUP && !isDown && isLeft && !isRight) {
            //左
            x = x - 5;
        } else if (!isUP && !isDown && !isLeft && isRight) {
            //右
            x = x + 5;
        } else if (isUP && !isDown && isLeft && !isRight) {
            //左上
            x = x - 5;
            y = y - 5;
        } else if (!isUP && isDown && isLeft && !isRight) {
            //左下
            x = x - 5;
            y = y + 5;
        } else if (isUP && !isDown && !isLeft && isRight) {
            //右上
            x = x + 5;
            y = y - 5;
        } else if (!isUP && isDown && !isLeft && isRight) {
            //右下
            x = x + 5;
            y = y + 5;
        }
    }

    boolean isUP = false;
    boolean isDown = false;
    boolean isLeft = false;
    boolean isRight = false;

    /**
     * @return void
     * @Author fan
     * @Description //TODO 按下
     * @Date 15:21 2020/3/24 0024
     * @Param [e]
     **/
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_RIGHT || keyCode == KeyEvent.VK_D) {
            isRight = true;
        } else if (keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_A) {
            isLeft = true;
        } else if (keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_W) {
            isUP = true;
        } else if (keyCode == KeyEvent.VK_DOWN || keyCode == KeyEvent.VK_S) {
            isDown = true;
        }
    }

    /**
     * @return void
     * @Author fan
     * @Description //TODO 松开
     * @Date 15:24 2020/3/24 0024
     * @Param [e]
     **/
    public void keyReleased(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_RIGHT || keyCode == KeyEvent.VK_D) {
            isRight = false;
        } else if (keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_A) {
            isLeft = false;
        } else if (keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_W) {
            isUP = false;
        } else if (keyCode == KeyEvent.VK_DOWN || keyCode == KeyEvent.VK_S) {
            isDown = false;
        }
    }

    public Rectangle getRectangle() {
        return new Rectangle(x, y, planeImage.getWidth(null), planeImage.getHeight(null));
    }

}

PlaneStatus类

package com.trhsy.cn.util;

/**
 * @ClassName PlaneStatus
 * @Description todo 0 游戏开始前 1 第一关 -1 游戏结束
 * @Author Administrator
 * @Date 2020/3/24 002415:28
 **/
public class PlaneStatus {
    public static int roleNum = 1;
    public static int playStatus = 0;
}

Power类

package com.trhsy.cn.power;

import javax.imageio.ImageIO;
import java.awt.*;
import java.io.IOException;

/**
 * @ClassName Power
 * @Description todo 血瓶类
 * @Author Administrator
 * @Date 2020/3/24 002415:29
 **/
public class Power {
    Image PowerImage = null;
    //初始位置
    int x = 20;
    int y = 0;

    public Power() {
        this.x = (int) (Math.random() * 540) + 20;
        try {
            PowerImage = ImageIO.read(Gift.class.getClassLoader()
                    .getResourceAsStream("images/power.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void draw(Graphics g) {
        // 画血瓶图片
        g.drawImage(PowerImage, x, y, null);
        // 血瓶移动
        y++;
    }

    public Rectangle getRectangle() {
        return new Rectangle(x, y, PowerImage.getWidth(null), PowerImage.getHeight(null));
    }

}

Gift

package com.trhsy.cn.power;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Gift {
    Image GiftImage = null;
    int x = 20;
    int y = 0;

    public Gift() {
        this.x = (int) (Math.random() * 540) + 20;
        try {
            GiftImage = ImageIO.read(Gift.class.getClassLoader()
                    .getResourceAsStream("images/blood.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void draw(Graphics g) {
        // 画血瓶图片
        g.drawImage(GiftImage, x, y, null);
        // 血瓶移动
        y++;
    }

    public Rectangle getRectangle() {
        return new Rectangle(x, y, GiftImage.getWidth(null), GiftImage.getHeight(null));
    }
}

Diji

package com.trhsy.cn.plane;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Diji {
    Image dijiImage = null;
    public int y = -20;
    /**
     *20 ~ 760
     **/
    public int x = 10;
    int r;

    public Diji() {
        this.x = (int) (Math.random() * 540) + 40;
        try {
            r = (int) (Math.random() * 3) + 1;
            dijiImage = ImageIO.read(Diji.class.getClassLoader()
                    .getResourceAsStream("images/diji_" + r + ".png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void draw(Graphics g) {
        //画 敌机图片
        g.drawImage(dijiImage, x, y, null);
        //敌机移动
        if (r == 1) {
            y += 4;
        } else if (r == 2) {
            y += 4;
        } else if (r == 3) {
            y += 7;
        }
    }

    public Rectangle getRectangle() {
        return new Rectangle(x, y, dijiImage.getWidth(null), dijiImage.getHeight(null));
    }
}

play类

package com.trhsy.cn.plane;

import com.trhsy.cn.bullet.DijiZiDan;
import com.trhsy.cn.bullet.MyZiDan;
import com.trhsy.cn.power.Gift;
import com.trhsy.cn.power.Power;
import com.trhsy.cn.util.PlaneStatus;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
 * @ClassName Play
 * @Description todo
 * @Author Administrator
 * @Date 2020/3/24 002415:40
 **/
public class Play {
    static int count = 0;
    Image bgImage = null;
    /**
     * @Author fan
     * @Description //TODO 战机
     * @Date 16:11 2020/3/24 0024
     * @Param
     * @return
     **/
    Plane plane = new Plane();
    /**
     * @Author fan
     * @Description //TODO 战机子弹
     * @Date 16:11 2020/3/24 0024
     * @Param
     * @return
     **/
    List<MyZiDan> mzds = new ArrayList<MyZiDan>();
    /**
     * @Author fan
     * @Description //TODO 敌机
     * @Date 16:11 2020/3/24 0024
     * @Param
     * @return
     **/
    List<Diji> dijis = new ArrayList<Diji>();
    /**
     * @Author fan
     * @Description //TODO 敌机子弹
     * @Date 16:11 2020/3/24 0024
     * @Param
     * @return
     **/
    List<DijiZiDan> dijizidans = new ArrayList<DijiZiDan>();
    /**
     * @Author fan
     * @Description //TODO 血瓶
     * @Date 16:11 2020/3/24 0024
     * @Param
     * @return
     **/
    List<Gift> gifts = new ArrayList<Gift>();

    List<Power> powers = new ArrayList<Power>();

    public Play() {
        try {
            bgImage = ImageIO.read(Play.class.getClassLoader().getResourceAsStream("images/bg_01.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    int bgY1 = 0;
    int bgY2 = -600;
    int fireTime = 0;
    boolean flag = false;

    public void draw(Graphics g) {
        // 画背景图片
        g.drawImage(bgImage, 0, bgY1, null);
        bgY1 += 5;
        bgY1 = 0;
        g.drawImage(bgImage, 0, bgY2, null);
        bgY2 += 5;
        if (bgY2 >= 0) {
            bgY2 = -600;
        }
        // 清理战机子弹
        for (int i = 0; i < mzds.size(); i++) {
            MyZiDan myZidan = mzds.get(i);
            if (myZidan.x > 800) {
                mzds.remove(i);
            }
        }
        // 添加子弹
        if (isFire1 == true && flag == false) {
            if (fireTime % 8 == 0) {
                mzds.add(new MyZiDan(plane.x + 25, plane.y + 0));
            }
            fireTime++;
        }
        if (isFire1 == true && flag == true) {
            if (fireTime % 4 == 0) {
            }
            mzds.add(new MyZiDan(plane.x + 8, plane.y + 0));
            mzds.add(new MyZiDan(plane.x + 52, plane.y + 0));
        }
        fireTime++;
        // 画战机子弹
        for (int i = 0; i < mzds.size(); i++) {
            MyZiDan myZidan = mzds.get(i);
            myZidan.draw(g);
        }
        // 清理敌机
        for (int i = 0; i < dijis.size(); i++) {
            Diji dj = dijis.get(i);
            if (dj.x < -100) {
                dijis.remove(i);
            }
        }
        // 抽奖:添加敌机
        dijis.add(new Diji());

        // 抽奖:添加血瓶
        if ((int) (Math.random() * 1000) == 5) {
            gifts.add(new Gift());
        }
        for (int i = 0; i < gifts.size(); i++) {
            Gift gift = gifts.get(i);
            gift.draw(g);
        }
        //抽奖:添加power
        if ((int) (Math.random() * 1000) == 5) {
            powers.add(new Power());
        }
        for (int i = 0; i < powers.size(); i++) {
            Power power = powers.get(i);
            power.draw(g);
        }
        // 画敌机
        for (int i = 0; i < dijis.size(); i++) {
            Diji dj = dijis.get(i);
            dj.draw(g);
        }
        // 画飞机
        plane.draw(g);
        // 判断战机相撞
        for (int i = 0; i < dijis.size(); i++) {
            // 先得到每一个敌机
            Diji dj = dijis.get(i);
            Rectangle r1 = dj.getRectangle();
            Rectangle r2 = plane.getRectangle();
            if (r1.intersects(r2)) {
                dijis.remove(i);
                plane.lifeCount = plane.lifeCount - 1;
                if (plane.lifeCount > 0) {
                    flag = false;
                }
                if (plane.lifeCount < 1) {
                    PlaneStatus.playStatus = -1;
                }
            }
            // 判断战机和血瓶相撞
            for (int q = 0; q < gifts.size(); q++) {
                // 先得到每一个血瓶
                Gift gift = gifts.get(q);
                Rectangle rectangle = gift.getRectangle();
                Rectangle rectangle1 = plane.getRectangle();
                if (rectangle.intersects(rectangle1)) {
                    gifts.remove(q);
                }
                if (plane.lifeCount < 5) {
                }

                plane.lifeCount = plane.lifeCount + 1;
                //// 判断战机和Power相撞
                for (int w = 0; w < powers.size(); w++) {
                    // 先得到每一个power
                    Power power = powers.get(w);
                    Rectangle rectangle2 = power.getRectangle();
                    Rectangle rectangle3 = plane.getRectangle();
                    if (rectangle2.intersects(rectangle3)) {
                        powers.remove(w);
                        flag = true;
                    }
                }
                // 判断敌机在中弹
                for (int e = 0; e < mzds.size(); e++) {
                    // 得到每个战机子弹
                    MyZiDan myzidan = mzds.get(e);
                    Rectangle rectangle2 = myzidan.getRectangle();
                    for (int j = 0; j < dijis.size(); j++) {
                        // 每一个敌机
                        Diji diji = dijis.get(j);
                        Rectangle rectangle3 = diji.getRectangle();
                        if (rectangle2.intersects(rectangle3)) {
                            mzds.remove(i);
                            dijis.remove(j);
                            count++;
                        }
                    }
                }
            }
        }

    }

    boolean isFire1 = false;
    boolean isFire2 = false;

    public void keyPressed(KeyEvent e) {
        plane.keyPressed(e);
        if (e.getKeyCode() == KeyEvent.VK_J) {
            isFire1 = true;
        } /*if (e.getKeyCode() == KeyEvent.VK_K) { isFire2 = true; }*/
    }

    public void keyReleased(KeyEvent e) {
        plane.keyReleased(e);
        if (e.getKeyCode() == KeyEvent.VK_J) {
            isFire1 = false;
            fireTime = 0;
        } /*if (e.getKeyCode() == KeyEvent.VK_K) { isFire2 = false; fireTime = 0; }*/
        if (e.getKeyCode() == KeyEvent.VK_P) {
            for (int i = 0; i < dijis.size(); i++) {
                dijis.remove(i);
            }
        }
    }
}

over类

package com.trhsy.cn.util;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.io.IOException;

/**
 * @ClassName Over
 * @Description todo
 * @Author Administrator
 * @Date 2020/3/24 002416:03
 **/
public class Over {
    Image obg=null;
    Image ng=null;
    public Over() {
        try {
            obg=ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/obg.jpg"));
            ng=ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/ng.png")); } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void draw(Graphics g){
        g.drawImage(obg, 0, 0, null);
        g.drawImage(ng, 120,100, null);
        g.setColor(Color.black);
        g.setFont(new Font("幼圆", Font.BOLD, 40));
        g.drawString("游戏结束啦!",200 ,600 );
    }
    public void keyPressed(KeyEvent e) {
    }
    public void keyReleased(KeyEvent e) {
    }
}

MainFrame主类

import com.trhsy.cn.plane.Play;
import com.trhsy.cn.util.Before;
import com.trhsy.cn.util.Over;
import com.trhsy.cn.util.PlaneStatus;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

/**
 * @ClassName MainFrame
 * @Description todo
 * @Author Administrator
 * @Date 2020/3/24 002416:04
 **/
public class MainFrame extends JFrame{
    private static final long serialVersionUID = 1L;
    Before before =new Before();
    Play play = new Play();
    Over over = new Over();
    public MainFrame() {
        //设 置标题
        this.setTitle(" 让子弹飞一会~");
        //设置大小
        this.setSize(600, 800);
        //定位居中
        this.setLocationRelativeTo(null);
        //添加关闭操作
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //禁止重置大小z
        this.setResizable(false);
        //添加键盘监听器 KeyListener -->KeyAdapter
        this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if(PlaneStatus.playStatus == 0){
                    before.keyPressed(e);
                }else if(PlaneStatus.playStatus ==1){
                    play.keyPressed(e);
                }else if(PlaneStatus.playStatus==-1){
                    over.keyPressed(e);
                }
            }
            @Override
            public void keyReleased(KeyEvent e) {
                if(PlaneStatus.playStatus == 0){
                    before.keyReleased(e);
                }else if(PlaneStatus.playStatus ==1){
                    play.keyReleased(e);
                }else if(PlaneStatus.playStatus==-1){
                    over.keyReleased(e);
                }
            }
        });

        //启 动一个线程:每隔20 毫秒执行一次
        new Thread(){
            public void run(){
                while(true){
                    MainFrame.this.repaint();
                    try {
                        Thread.sleep(20);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start(); //显示
        this.setVisible(true);
    }
    Image bufferImage =null;
    /**
     * @Author fan
     * @Description //TODO 这个方法也是20毫秒执行一次
     * @Date 16:10 2020/3/24 0024
     * @Param [g]
     * @return void
     **/
    @Override
    public void paint(Graphics g){
        if(bufferImage==null){
            bufferImage = this.createImage(600, 800);
        }
        Graphics g4Image = bufferImage.getGraphics();
        g4Image.setColor(Color.BLACK);
        g4Image.fillRect(0, 0, 600, 800);
        this.draw(g4Image);
        g.drawImage(bufferImage, 0, 0, null);
    }
    public void draw(Graphics g){
        if(PlaneStatus.playStatus == 0){
            before.draw(g);
        }else if(PlaneStatus.playStatus ==1){
            play.draw(g);
        }else if(PlaneStatus.playStatus==-1){
            over.draw(g);
        }
    }
    public static void main(String[] args) {
        new MainFrame();
    }

}


MyZiDan

package com.trhsy.cn.bullet;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.io.IOException;
import javax.imageio.ImageIO;

public class MyZiDan {
    Image zidanImage = null;
    public int x;
    public int y;

    public MyZiDan(int x, int y) {
        this.x = x;
        this.y = y;
        try {
            zidanImage = ImageIO.read(MyZiDan.class.getClassLoader().getResourceAsStream("images/zidan.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void draw(Graphics g) {
        // 画我军子弹图片
        g.drawImage(zidanImage, x, y, null);
        // 我的飞机子弹移动速度
        y -= 20;
    }

    public Rectangle getRectangle() {
        return new Rectangle(x, y, zidanImage.getWidth(null), zidanImage.getHeight(null));
    }
}

DijiZiDan

package com.trhsy.cn.bullet;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.io.IOException;
import javax.imageio.ImageIO;

public class DijiZiDan {
    Image zidanImage = null;
    int x;
    int y;
    int fangxiang = 0;

    public DijiZiDan(int x, int y) {
        this.x = x;
        this.y = y;
        fangxiang = (int) (Math.random() * 5);//0 ~ 7
        try {
            zidanImage = ImageIO.read(DijiZiDan.class.getClassLoader()
                    .getResourceAsStream("images/dijizidan.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void draw(Graphics g) {
        //画 敌机子弹图片
        g.drawImage(zidanImage, x, y, null);
        //移动
        this.move();
    }

    public void move() {
        if (fangxiang == 0) {
            //下
            y = y + 2;
        } else if (fangxiang == 1) {
            //左
            x = x - 2;
        } else if (fangxiang == 2) {
            //右
            x = x + 2;
        } else if (fangxiang == 3) {
            //左下
            x = x - 2;
            y = y + 2;
        } else if (fangxiang == 4) {
            // 右下
            x = x + 2;
            y = y + 2;
        }
    }

    public Rectangle getRectangle() {
        return new Rectangle(x, y, zidanImage.getWidth(null), zidanImage.getHeight(null));
    }
}

Before

package com.trhsy.cn.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.io.IOException;
import javax.imageio.ImageIO;

/**
 * @Author fan
 * @Description //TODO 游戏开始之前加载
 * @Date 16:07 2020/3/24 0024
 * @Param
 * @return
 **/
public class Before {
    Image bg = null;
    Image wfeiji = null;
    Image kdiji1 = null;
    Image kdiji2 = null;
    Image kdiji3 = null;

    public Before() {
        try {
            bg = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/bg.jpg"));
            wfeiji = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/feiji_1.png"));
            kdiji1 = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/kdiji_01.png"));
            kdiji2 = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/kdiji_02.png"));
            kdiji3 = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/kdiji_03.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    int time = 0;

    public void draw(Graphics g) {
        if (PlaneStatus.roleNum == 1) {
            // 画妹妹
            g.drawImage(bg, 0, 0, null);
            g.drawImage(wfeiji, 260, 600, null);
            g.drawImage(kdiji1, 200, 50, null);
            g.drawImage(kdiji1, 400, 50, null);
            g.drawImage(kdiji1, 150, 480, null);
            g.drawImage(kdiji1, 400, 480, null);
            g.drawImage(kdiji2, 100, 200, null);
            g.drawImage(kdiji2, 300, 100, null);
            g.drawImage(kdiji2, 480, 200, null);
            g.drawImage(kdiji3, 300, 300, null);
            g.drawImage(kdiji3, 70, 400, null);
            g.drawImage(kdiji3, 510, 400, null);
            //画回车符
            time++;
            g.setColor(Color.YELLOW);
            g.setFont(new Font("幼圆", Font.BOLD, 30));

        }
        if (time <= 10) {
            g.drawString("[Enter]>>", 50, 750);
        } else if (time <= 20) {
            g.drawString("[Enter] >>", 50, 750);
        } else if (time <= 30) {
            g.drawString("[Enter] >>", 50, 750);
            if (time == 30) {
                time = 0;
            }
        }
    }

    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_ENTER) {

        }
        if (keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_RIGHT) {
            PlaneStatus.roleNum = 3 - PlaneStatus.roleNum;
            //1~2 互换
        }
    }

    public void keyReleased(KeyEvent e) {

    }

}

你的资助就是我最大的动力!
金额随意,欢迎来赏!

如果你认为阅读这边博客让您有些收获,不妨点击一下右下角的推荐按钮。
如果,您希望更容易发现我的新博客,不妨点击一下绿色通道的关注我

如果,想给予我更多鼓励,求打

因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【无与伦比的傻】!

联系或者打赏博主【无与伦比的傻】!

原文地址:https://www.cnblogs.com/trhsy/p/14003570.html