返回顶部
首页 > 资讯 > 后端开发 > Python >Java实现简单的飞机大战游戏(敌机下落篇)
  • 334
分享到

Java实现简单的飞机大战游戏(敌机下落篇)

2024-04-02 19:04:59 334人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

本文实例为大家分享了Java实现简单飞机大战游戏,敌机下落的具体代码,供大家参考,具体内容如下 在实现这个游戏之前,我们首先需要知道项目可能要用到哪些知识点: 重绘,线程,双缓冲,数

本文实例为大家分享了Java实现简单飞机大战游戏,敌机下落的具体代码,供大家参考,具体内容如下

在实现这个游戏之前,我们首先需要知道项目可能要用到哪些知识点:

重绘,线程,双缓冲,数据结构的应用

差不多是这大概有这些,如果不够的话我们再加。
首先,我们应该实现敌机下落,在这里大概思路和利用线程使小球下落差不多。不同的是,我在这里用到了三种敌机,分别为小、大、BOSS机三种。然后给予这三种敌机不同的下落规则(即速度、出现的时间、是否伴随子弹的发射等等)来给游戏适当的增加点难度。

以下是我的大概设计思路和下落规则,大家可以参考一下

1.飞机是在一开始的时候就出现的,先出现什么飞机?速度?什么位置出现?频率?

先出小飞机,再出大飞机,当所有的大小飞机都消失以后出现BOSS机.
小飞机的速度较快:8    大飞机的速度较慢:4    BOSS机的速度最慢:2
频率:每隔1秒出现一架小飞机,每出现4架小飞机后出现一架大飞机,最后出现BOSS机.
位置:在窗体的范围内,考虑到png图片的高度和宽度,所以出现的时候注意减去相应的高度和宽度.    

2.小飞机,大飞机,BOSS机需要使用不同的vector类来保存,取出的时候再使用一个vector类来保存(保存的时候应该将三个vector类中原来的飞机移除).再将保存起来的飞机依次进行画出.当出现4架小飞机的时候就出现一架大飞机,当小飞机和大飞机都出现完了以后,出现BOSS机.注意:大飞机和BOSS机的时候伴随着子弹的发出.

3.子弹:

子弹在大飞机和BOSS机出现的时候出现.且速度优于大飞机和BOSS机.因为小飞机没有子弹,在这里我们利用byte标记来区别于小飞机和其他两种飞机,另外也需要将子弹标记,以防止子弹生成子弹。    

4.使用两个线程:

(1)一个线程用来实现将不同的vector向量取出的飞机(先将大小飞机取出以后,再取出BOSS机,每取一次小飞机的时候将count记一次数,当count==4的时候,取出一架大飞机.当小飞机和大飞机全部取完以后再取出BOSS机),并保存在一个统一的vector向量中.    

(2)另一个线程用来实现画飞机和子弹并使其移动.    

5.效果图出现过于闪烁的情况可以利用双缓冲技术来减少闪烁。

以下是代码主类,主要生成窗体和敌机,并将敌机保存在不同的vector向量中。

public class BallMain {

    public Graphics g;
    public Vector<Ball> vector, minVector, maxVector, bossVector;
    public ImageIcon img;

    public static void main(String[] args) {
        BallMain bm = new BallMain();
        bm.init();

    }

    public void init() {
        JFrame frame = new JFrame();
        frame.setTitle("飞机大战");
        frame.setSize(800, 800);
        frame.setDefaultCloseOperation(3);
        frame.setLocationRelativeTo(null);
        frame.setBackground(Color.white);
        frame.setResizable(false); // 不允许改变窗体大小

        frame.setVisible(true);

        this.g = frame.getGraphics();

        minVector = new Vector<Ball>();
        maxVector = new Vector<Ball>();
        bossVector = new Vector<Ball>();
        vector = new Vector<Ball>();

        initPlane(frame);

        BallThread bt = new BallThread(vector, minVector, maxVector,
                bossVector, frame);
        bt.start();

        BallGraThread bll = new BallGraThread(vector, frame,
                frame.getGraphics());
        bll.start();
    }

    public void initPlane(JFrame frame) {
        Random rand = new Random();
        // 小飞机的生成
        for (int i = 0; i < 8; i++) {
            ImageIcon icon = new ImageIcon("plane/plane0.png");
            int r = icon.getIconWidth() / 2;
            int x = rand.nextInt(frame.getWidth() - icon.getIconWidth()) + r;
            int y = -icon.getIconHeight();
            int vy = 8;
            Ball b = new Ball(icon.getImage(), x, y, r, vy, (byte) 1);
            minVector.add(b);
        }
        // 大飞机的生成
        for (int i = 0; i < 2; i++) {
            ImageIcon icon = new ImageIcon("plane/plane1.png");
            int r = icon.getIconWidth() / 2;
            int x = rand.nextInt(frame.getWidth() - icon.getIconWidth()) + r;
            int y = -icon.getIconHeight();
            int vy = 4;

            Ball b = new Ball(icon.getImage(), x, y, r, vy, (byte) 2);
            maxVector.add(b);
        }
        // Boss机的生成
        ImageIcon icon = new ImageIcon("plane/plane2.png");
        int r = icon.getIconWidth() / 2;
        int x = rand.nextInt(frame.getWidth() - icon.getIconWidth()) + r;
        int y = -icon.getIconHeight();
        int vy = 2;
        Ball b = new Ball(icon.getImage(), x, y, r, vy, (byte) 3);
        bossVector.add(b);
    }
}

以下为飞机的下落规则:

public BallThread(Vector<Ball> vector, Vector<Ball> minVector,
            Vector<Ball> maxVector, Vector<Ball> bossVector, JFrame frame) {
        this.vector = vector;
        this.minVector = minVector;
        this.maxVector = maxVector;
        this.bossVector = bossVector;

        this.frame = frame;
    }

    public void run() {
        int count = 0;
        while (true) {
            if (minVector.size() > 0) {
                vector.add(minVector.remove(0));
                ++count;
                if (count == 4) {
                    if (maxVector.size() > 0) {
                        vector.add(maxVector.remove(0));
                        count = 0;
                    }
                }
            }
            if (vector.size() == 0) {
                vector.add(bossVector.remove(0));
                break;
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

利用双缓冲减少闪烁,画出飞机并擦除,使其不断更新位置:

public class BallGraThread extends Thread {

    public Vector<Ball> vector;
    public JFrame frame;
    public Graphics g;
    public BufferedImage image;
    public Graphics ig;

    public BallGraThread(Vector<Ball> vector, JFrame frame, Graphics g) {
        this.vector = vector;
        this.frame = frame;
        this.g = g;
    }

    public void run() {
        if (image == null) {
            
            //创建一个带透明色的BufferedImage对象
            image = new BufferedImage(frame.getWidth(), frame.getHeight(),
                    BufferedImage.TYPE_INT_ARGB);
            //获取画笔对象.
            ig = image.getGraphics();
        }
        while (true) {
            //擦除.
            ig.setColor(frame.getContentPane().getBackground());
            ig.fillRect(0, 0, frame.getWidth(), frame.getHeight());

            for (int i = 0; i < vector.size(); i++) {
                Ball ball = vector.get(i);
                ball.draw(ig);
                ball.move(vector, frame, ig);
            }

            g.drawImage(image, 0, 0, frame);

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
}

子弹类,标记子弹来区分三种敌机,当飞机和子弹飞出窗体外后将其移除与vector:

public class Ball {
    public int x, y;
    public int flag = 1;
    public Color color;
    public Image img;
    public BulletThread ba;
    int r;
    int vy;
    byte type;
    Random random = new Random();

    public Ball(Image img, int x, int y, int r, int vy, byte type) {
        this.img = img;
        this.x = x;
        this.y = y;
        this.r = r;
        this.vy = vy;
        this.type = type;
    }

    public void move(Vector<Ball> vector, JFrame frame, Graphics g) {
        if (y >= 0 && flag == 1) {
            // 如果是大飞机或者BOSS机的话,就发射子弹.
            if (type == 2 || type == 3) {
                ba = new BulletThread(vector, this);
                ba.start();
                flag = 2;
                System.out.println(ba);
            }
        }

        if (y >= frame.getHeight()) {
            img = new ImageIcon("planne/bullet.png").getImage();
            g.drawImage(img, x, y, 2 * r, 2 * r, null);
            System.out.println(ba);
            if (type == 2 || type == 3)
                ba.stopFlag = false;
            vector.remove(this);
        }
        y = y + vy;
    }

    public void draw(Graphics g) {
        // 需要将ImageIcon转为Image类型的.
        g.drawImage(img, x, y, 2 * r, 2 * r, null);

    }

}

画出子弹并添加于vector向量中,使其移动:

public class BulletThread extends Thread {
    public Vector<Ball> vector;
    public Ball ball;// 大飞机的数据来生成子弹
    public boolean stopFlag = true;
    public boolean pauseFlag = true;

    public BulletThread(Vector<Ball> vector, Ball ball) {
        this.vector = vector;
        this.ball = ball;
    }

    public void run() {
        while (stopFlag) {
            if (pauseFlag) {
                int x = ball.x + ball.r;
                int y = ball.y + 2 * ball.r;
                int r = 20;
                Image img = new ImageIcon("plane/bullet.png").getImage();
                int vy = ball.vy + 4;
                Ball bullet = new Ball(img, x, y, r, vy, (byte) 0);
                vector.add(bullet);
            }
            try {
                Thread.sleep(4000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

以上差不多就是敌机的下落,其他的一些功能尚未完善,比如可以给敌机添加不同的血量再来增加难度,大家可以根据自己的发挥来写出属于自己的飞机大战游戏。

希望这篇文章对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Java实现简单的飞机大战游戏(敌机下落篇)

本文链接: https://lsjlt.com/news/148202.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java实现简单的飞机大战游戏(敌机下落篇)
    本文实例为大家分享了Java实现简单飞机大战游戏,敌机下落的具体代码,供大家参考,具体内容如下 在实现这个游戏之前,我们首先需要知道项目可能要用到哪些知识点: 重绘,线程,双缓冲,数...
    99+
    2024-04-02
  • Java实现简单的飞机大战游戏(控制主飞机篇)
    本文实例为大家分享了Java实现简单的飞机大战游戏,控制主飞机的具体代码,供大家参考,具体内容如下 接着上一篇:Java实现简单的飞机大战游戏(敌机下落篇),首先我们需要明白,在控制...
    99+
    2024-04-02
  • python实现简单的飞机大战游戏
    本文实例为大家分享了python实现飞机大战游戏的具体代码,供大家参考,具体内容如下 1、准备环境 下载python(这里建议不需要安装最新的,好像pygame还没有对3.8支持的包...
    99+
    2024-04-02
  • python实现简单飞机大战小游戏
    为了熟悉Python基础语法,学习了一个经典的案例:飞机大战,最后实现效果如下: 实现步骤: ①下载64位对应python版本的pygame:pygame-1.9.6-cp38-c...
    99+
    2024-04-02
  • javascript实现简单飞机大战小游戏
    本文实例为大家分享了javascript实现飞机大战小游戏的具体代码,供大家参考,具体内容如下 效果图 html文件 <!DOCTYPE html> <html ...
    99+
    2024-04-02
  • java实现飞机大战游戏
    java实现飞机大战,供大家参考,具体内容如下 用Java写个飞机大战游戏练习一下,实现可播放游戏背景音乐和游戏的基本功能 设计 1、准备好相应的图片和背景音乐(.wav文件); 2...
    99+
    2024-04-02
  • C语言实现简单的飞机大战游戏
    目录一、项目描述和最终的成果展示二、输出一个飞机模型三、实现控制飞机移动的功能四、添加发射激光功能五、添加靶子和分数统计功能本文实例为大家分享了C语言实现简单飞机大战游戏的具体代码,...
    99+
    2024-04-02
  • java实现飞机大战小游戏
    本文实例为大家分享了java实现飞机大战游戏的具体代码,供大家参考,具体内容如下 MyPanel类 package  P; import java.awt.Font; import...
    99+
    2024-04-02
  • JavaScript实现飞机大战游戏
    本文实例为大家分享了canvas ,js 实现一个简单的飞机大战,供大家参考,具体内容如下 预览图: 代码: <!DOCTYPE html> <html>...
    99+
    2024-04-02
  • jQuery实现飞机大战游戏
    目录一、效果图二、核心代码1.创建地图  2.用户选择飞机界面3.设置背景循环4.创建飞机5.创建敌机6.敌机移动7.设置敌机爆炸8.创建子弹9.检测子弹的移动(...
    99+
    2024-04-02
  • C++实现飞机大战游戏
    本文实例为大家分享了C++实现飞机大战游戏的具体代码,供大家参考,具体内容如下 代码是单线程执行,无界面,(博主下一步学习QT之后融入)还有待改进。先放张界面图: 话不多说 上...
    99+
    2024-04-02
  • Android实战打飞机游戏之怪物(敌机)类的实现(4)
    先看看效果图: 分析: 根据敌机类型区分 敌机 运动逻辑 以及绘制 public class Enemy { // 敌机的种类标识 public int type...
    99+
    2022-06-06
    Android
  • Java实现飞机大战-II游戏详解
    目录前言主要设计功能截图代码实现启动类玩家飞机总结前言 《飞机大战-II》是一款融合了街机、竞技等多种元素的经典射击手游。华丽精致的游戏画面,超炫带感的技能特效,超火爆画面让你肾上腺...
    99+
    2024-04-02
  • java如何实现飞机大战小游戏
    本篇内容介绍了“java如何实现飞机大战小游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MyPanel类package &nb...
    99+
    2023-07-01
  • javascript实现飞机大战小游戏
    本文实例为大家分享了javascript实现飞机大战游戏的具体代码,供大家参考,具体内容如下 文档结构如下 其中tool文件中只使用了随机数,audio中是存放的音乐文件,imag...
    99+
    2024-04-02
  • Vue实现飞机大战小游戏
    目录使用 Vue 开发一个简略版的飞机大战小游戏一、实现思路二、所需知识点三、实现步骤使用 Vue 开发一个简略版的飞机大战小游戏 如题,假设你为了向更多访问你博客的人展示你的技术,...
    99+
    2024-04-02
  • js+css实现飞机大战游戏
    本文实例为大家分享了js+css实现飞机大战游戏的具体代码,供大家参考,具体内容如下 用js和css实现,css中定义样式,js中定义了具体的实现事件,例如碰撞、子弹、飞机等。 ma...
    99+
    2024-04-02
  • Python实现简单飞机大战
    本文实例为大家分享了Python实现简单飞机大战的具体代码,供大家参考,具体内容如下 功能 玩家飞机可以移动,可以发射子弹,敌机随机产生,自由坠落。未添加击落敌机的功能。主要用来练习类的封装与继承。 源码 # ...
    99+
    2022-06-02
    python 飞机大战
  • python实现简单的飞机大战
    本文实例为大家分享了python实现简单的飞机大战的具体代码,供大家参考,具体内容如下 制作初衷 这几天闲来没事干,就想起来好长时间没做过游戏了,于是就想做一个游戏练练手,为了起到一...
    99+
    2024-04-02
  • java实现简易飞机大战
    目录整体思路代码实现英雄战机类敌机类子弹类图片工具类游戏窗体类启动游戏类运行效果图本文实例为大家分享了java实现简易飞机大战的具体代码,供大家参考,具体内容如下 整体思路 1.创建...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作