java实现飞机大战小游戏|java入门结课作业(代码片段)

Eric%258436 Eric%258436     2022-12-07     585

关键词:

** 如有错误,感谢指正**

请根据目录寻找自己需要的段落

导语:本博客为个人整理Java学习记录帖,如有错误,感谢指正。系统学习,欢迎持续关注,后续陆陆续续更新Java后端项目,Java部分我不打算更新基础部分知识,会从JavaWeb开始更新文章。
代码布局如下图代码布局

项目分析

通过键盘控制飞机前后移动,躲避炮弹,有时间计数器,计算游戏时间,飞机触碰炮弹,游戏结束,计时停止,显示本次游戏时长。

目前项目存在一个问题,运行时总是会对炮弹有空指针异常,但不影响游戏运行

下一步,博主会在次项目基础上完善登录系统。自主选择游戏难度等DIY,欢迎大家评论讨论实现。

Shell部分

package atluofu;

import java.awt.*;

/**
 * @program: com.atbaizhan
 * @description: 炮弹类
 * @author: atLuoFu
 * @create: 2021-07-17 22:41
 **/
public class Shell extends GameObject 
    double degree; //角度,炮弹沿着指定角度飞行

    public Shell() 
        x = 200;
        y = 200;
        degree = Math.random() * Math.PI * 2;
        width = 10;
        height = 10;
        speed = 7;
    

    @Override
    public void drawMySelf(Graphics g) 
        Color color = g.getColor();
        g.setColor(Color.yellow);
        g.fillOval((int) x, (int) y, width, height);
        g.setColor(color);
        x += speed * Math.cos(degree);
        y += speed * Math.sin(degree);
        if (y >= Constant.GAME_HEIGHT - this.height || y <= 40) 
            degree = -degree;
        
        if (x <= 0 || x >= Constant.GAME_WIDTH - this.width) 
            degree = Math.PI - degree;
        
    

Plane类

package atluofu;

import java.awt.*;
import java.awt.event.KeyEvent;

/**
 * @program: com.atbaizhan
 * @description: 飞机类
 * @author: atLuoFu
 * @create: 2021-07-17 11:54
 **/
public class Plane extends GameObject 

    boolean left, right, up, down; // 飞机方向的控制

    boolean live = true;

    public Plane(Image img, double x, double y, int speed) 
        super(img, x, y, speed);
    


    public void addDirection(KeyEvent e) 
        switch (e.getKeyCode()) 
            case KeyEvent.VK_LEFT:
                left = true;
                break;
            case KeyEvent.VK_RIGHT:
                right = true;
                break;
            case KeyEvent.VK_UP:
                up = true;
                break;
            case KeyEvent.VK_DOWN:
                down = true;
                break;
        
    

    public void minusDirection(KeyEvent e) 
        switch (e.getKeyCode()) 
            case KeyEvent.VK_LEFT:
                left = false;
                break;
            case KeyEvent.VK_RIGHT:
                right = false;
                break;
            case KeyEvent.VK_UP:
                up = false;
                break;
            case KeyEvent.VK_DOWN:
                down = false;
                break;
        
    

    @Override
    public void drawMySelf(Graphics g) 
        if (live) 
            super.drawMySelf(g);
            if (left) 
                x -= speed;
            
            if (right) 
                x += speed;
            
            if (up) 
                y -= speed;
            
            if (down) 
                y += speed;
            
        
    

MyGameFrame类

package atluofu;

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Date;

/**
 * @program: com.atbaizhan
 * @description: 游戏主窗口
 * @author: atLuoFu
 * @create: 2021-07-17 07:30
 **/
public class MyGameFrame extends Frame 

    Image planeImg = GameUtil.getImage("images/plane.png");
    Image bg = GameUtil.getImage("images/bg.jpg");

    Plane plane = new Plane(planeImg, 100, 100, 7);
    Shell shell = new Shell();
    Shell[] shells = new Shell[30];
    Explode explode;

    Date start = new Date();
    Date end;
    long period = 0;

    @Override
    public void paint(Graphics g)      // g当作是一个画笔

        g.drawImage(bg, 0, 0, 500, 500, null);

        drawTime(g);
        plane.drawMySelf(g);
        shell.drawMySelf(g);
        for (int i = 0; i < shells.length; i++) 
            shells[i].drawMySelf(g);
            boolean isCollision = shells[i].getRec().intersects(plane.getRec());
            if (isCollision) 
                plane.live = false;
                if (explode == null) 
                    explode = new Explode(plane.x, plane.y);
                
                explode.drawMySelf(g);
            
        
    

    public void drawTime(Graphics g) 
        Color color = g.getColor();
        Font font = g.getFont();
        if (plane.live) 
            g.setColor(Color.green);
            period = (System.currentTimeMillis() - start.getTime()) / 1000;
            g.drawString("坚持了" + period + "秒", 100, 100);
         else 
            g.setColor(Color.red);
            if (end == null) 
                end = new Date();
                period = (end.getTime() - start.getTime()) / 1000;
            
            g.setFont(new Font("微软雅黑", Font.BOLD, 30));
            g.drawString("坚持了" + period + "秒", 200, 200);
        
        g.setColor(color);
        g.setFont(font);
    

    //初始化窗口
    public void launchFrame() 
        this.setTitle("飞机大战-atLuoFu");
        setVisible(true);
        setSize(500, 500);
        setLocation(400, 400);

        // 正常退出程序
        this.addWindowListener(new WindowAdapter() 
            @Override
            public void windowClosing(WindowEvent e) 
                System.exit(0);
            
        );

        new PainThread().start();   // 启动重画线程
        this.addKeyListener(new KeyMonitor()); //启动键盘监听

        for (int i = 0; i < shells.length; i++) 
            shells[i] = new Shell();
        
    

    /**
     * 定义了一个重画窗口的线程
     * 定义成内部类是为了方便直接使用窗口类的相关方法
     */
    class PainThread extends Thread 
        @Override
        public void run() 
            while (true) 
                repaint();

                try 
                    Thread.sleep(50);
                 catch (InterruptedException e) 
                    e.printStackTrace();
                
            
        
    

    /**
     * 内部类 实现键盘监听处理
     */
    class KeyMonitor extends KeyAdapter 
        @Override
        public void keyPressed(KeyEvent e) 
            plane.addDirection(e);
        

        @Override
        public void keyReleased(KeyEvent e) 
            plane.minusDirection(e);

        
    

    // 双缓冲技术,解决屏幕闪烁问题
    private Image offScreenImage = null;

    public void update(Graphics g) 
        if (offScreenImage == null) 
            offScreenImage = this.createImage(Constant.GAME_WIDTH, Constant.GAME_HEIGHT); //这是游戏窗口的宽度和高度
        
        Graphics gOff = offScreenImage.getGraphics();
        paint(gOff);
        g.drawImage(offScreenImage, 0, 0, null);
    

    public static void main(String[] args) 
        MyGameFrame myGameFrame = new MyGameFrame();
        myGameFrame.launchFrame();
    


GameUtil

package atluofu;


import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

/**
 * @program: com.atbaizhan
 * @description: 游戏工具类
 * @author: atLuoFu
 * @create: 2021-07-17 07:46
 **/
public class GameUtil 

    // 构造器私有 防止创建此类对象
    private GameUtil()

    

    public static BufferedImage getImage(String path) 
        BufferedImage image = null;
        URL u = GameUtil.class.getClassLoader().getResource(path);
        try 
            image = ImageIO.read(u);
         catch (IOException e) 
            e.printStackTrace();
        
        return image;
    

    public static void main(String[] args) 
        Image img= GameUtil.getImage("images/plane.png");
        System.out.println(img);
    


GameObject类

package atluofu;

import java.awt.*;

/**
 * @program: com.atbaizhan
 * @description: 游戏物体的根类
 * @author: atLuoFu
 * @create: 2021-07-17 11:43
 **/
public class GameObject 
    Image img;
    double x, y;
    int speed;
    int width, height;


    public GameObject() 
    

    public GameObject(Image img, double x, double y, int speed) 
        this.img = img;
        this.x = x;
        this.y = y;
        this.speed = speed;
        this.width = img.getWidth(null);
        this.height = img.getHeight(null);
    

    public GameObject(Image img, double x, double y, int speed, int width, int height) 
        this.img = img;
        this.x = x;
        this.y = y;
        this.speed = speed;
        this.width = width;
        this.height = height;
    

    public void drawMySelf(Graphics g) 
        g.drawImage(img, (int) x, (int) y, width, height, null);
    

    public Rectangle getRec() 
        return new Rectangle((int) x, (int) y, width, height);
    


Explode类

package atluofu;

import java.awt.*;

/**
 * @program: com.atbaizhan
 * @description: 爆炸特效实现类
 * @author: atLuoFu
 * @create: 2021-07-17 23:12
 **/
public class Explode 
    double x, y;
    static Image[] images = new Image[16];

    int count;

    static 
        for (int i = 0; i < images.length; i++) 
            images[i] = GameUtil.getImage("images/explode/e" + (i + 1) + ".gif");
            //images[i].getWidth(null);
        
    

    public Explode() 

    

    public Explode(double x, double y) 
        this.x = x;
        this.y = y;
    

    public void drawMySelf(Graphics g) 
        if (count < 16) 
            g.drawImage(images[count], (int) x, (int) y, null);
            count++;
        
    

Constant

package atluofu;

/**
 * @program: com.atbaizhan
 * @description: 存放相关常量
 * @author: atLuoFu
 * @create: 2021-07-17 08:14
 **/
public class Constant 
    public static final int GAME_WIDTH = 查看详情  

java实现《飞机大战-iii》游戏

...撼感受,体验飞行战斗的无限乐趣。游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想。主要需求基于JavaSwing 查看详情

基于java的飞机大战的课程设计与实现(代码片段)

...f0c;点击“开始游戏”既可以进入游戏,通过鼠标移动实现我方飞机的移动,我方飞机自动发射子弹,敌方飞机在十二个轨道随机生成,如果我方飞机与之碰撞,则游戏结束;如果我方飞机发射的子弹与敌... 查看详情

java开发飞机大战

...行开发,最近抽了一些时间出来使用java的GUI开发了一个飞机大战游戏。最底部提供了下载链接。   游戏里有敌机、英雄机、装备、加血物资、boss等元素。敌机可以发射子弹移动的子弹和直到的子弹,英雄机有两个等级的... 查看详情

飞机大战(代码片段)

目标项目准备使用pygame创建图形窗口理解图像并实现图像绘制理解游戏循环和游戏时钟理解精灵和精灵组项目准备新建飞机大战项目新建一个hm_01_pygame入门.py导入游戏素材图片游戏的第一印象把一些静止的图像绘制到游戏窗口中... 查看详情

pygame实现飞机大战游戏

标题:pygame实现飞机大战游戏源码链接:我的github地址一、具体演示1.怪兽分为小怪,和大怪;大怪可以发射子弹2.英雄飞机共有10个生命值3.英雄飞机可以上下左右移动4.显示了英雄生命值,消灭怪兽数量,... 查看详情

java练手小项目飞机大战2.0加强版

...和大家能够一起来学习。今天up主给大家伙带来了一款Java小游戏————飞机大战2/0加强版,对滴就是大家偷偷在机房玩的那种,希望这次能够给大家带来快乐的同时也能教会大家应该如何制作这类游戏。 飞机大战2.0加... 查看详情

javaswing飞机大战游戏github免费开源公开源码

本次项目来自:java飞机大战游戏开发教程子弹打飞机游戏经典游戏开发教程Java项目实战最详细的游戏开发课程但是它不是开源的,课程讲到一半就要付费了所以我把该项目的源码公开了,放在了github与码云上,... 查看详情

javaswing飞机大战游戏github免费开源公开源码

本次项目来自:java飞机大战游戏开发教程子弹打飞机游戏经典游戏开发教程Java项目实战最详细的游戏开发课程但是它不是开源的,课程讲到一半就要付费了所以我把该项目的源码公开了,放在了github与码云上,... 查看详情

python飞机大战,pygame入门,源码

...用alt+ctrl+L进行格式化但是很多规范还是要靠自己调整2、飞机大战学习的意义学习飞机大战不是为了让大家做游戏,而是巩固之前学习的知识,让大家了解框架或者三方模块的使用方式学习飞机大战要学会查询api文档,而不是将... 查看详情

python入门到精通,一篇就够。40个python游戏经典开源项目(开源分享:俄罗斯方块魂斗罗植物大战僵尸飞机大战超级玛丽...)

...微信名片即可免费获取!童年回忆1、“剪刀石头布”小游戏该程序可以实现游戏轮次统计,双方得分、平局次数统计和重新开始功能,不管是1局决胜负,还是三 查看详情

《java小游戏实现》:坦克大战(续2)

《Java小游戏实现》:坦克大战(续2)相关博文:《Java小游戏实现》:坦克大战http://blog.csdn.net/u010412719/article/details/51712663《Java小游戏实现》:坦克大战(续一):http://blog.csdn.net/u010412719/article/details/51723570博文《Java小游戏实现》... 查看详情

python项目实战:飞机大战(代码片段)

...快速入门目标项目准备使用pygame创建图形窗口理解图像并实现图像绘制理解游戏循环和游戏时钟理解精灵和精灵组项目准备新建飞机大战项目新建一个hm_01_pygame入门.py导入游戏素材图片游戏的第一印象把一些静止的图像绘制到游... 查看详情

飞机大战项目(代码片段)

...hon的一个小项目项目名称:飞机大战项目项目语言:python实现功能:飞机连续发射三个子弹,打中敌机,敌机销毁,飞机碰到敌机,飞机销毁,游戏结束importpygamefromplane_spritesimport*classPlaneGame(object):‘‘‘飞机大战主游戏‘‘‘def... 查看详情

java五子棋(人机版),昨天买的棋子今天就用不上了(代码片段)

...与您一起学习、成长、起飞!热门专栏推荐【1】Java小游戏(俄罗斯方块、飞机大战、植物大战僵尸等)【2】JavaWeb项目实战(图书管理、在线考试、宿舍管理等)【3】JavaScript精彩实例(飞机大战、贪吃蛇... 查看详情

java入门到精通-第48讲-坦克大战12

...游戏界面?响应“开始新游戏”这个按钮就OK了;让JFrame实现一个接口:对用户不同的点击作出不同的处理//先删除旧的开始面板this.remove(msp);//显示,刷新JFrame----------- 查看详情

h5canvas实现飞机大战游戏

首先看几张效果图:上面三张图分别对应游戏的三种状态ready,play,pause。体验一下先介绍一下canvas画图的原理,在这个游戏中的背景,飞机,子弹以及飞机被击中爆炸的效果都是一张张的图片,通过canvas的drawImage()函数把这一... 查看详情

一文教你实现「飞机大战」里战机的控制逻辑(代码片段)

...飞机大战」相信每个人都玩过,那么今天就来教大家如何实现游戏里战机的控制逻辑。 1.首先创建一个游戏场景GameScene,在场景中添加游戏背景和今天的主角&m 查看详情