Java实战飞机大战项目

前言:

游戏参考于B站是尚学堂飞机大战,主体框架不变,代码稍有改动

游戏Java知识:变量、数据类型、判断语句、循环结构、类的继承、简单窗口创建、图形图片的绘制、双缓存、鼠标事件、键盘事件

开发环境:开发语言为Java,开发环境IDEA,jdk-14.0.2

主要功能:

1.游戏可以产生:小敌机/大敌机-->随机产生

2.跟鼠标相关的操作:

a.点击开始游戏

b.自己的飞机移动

3.子弹打中小敌机:分数+1

4.当生产了100架小敌机,大敌机则会出现

5.大掉大boss敌机的血条游戏则通关

6.界面窗口实时显示:当前得分和当前生命值

游戏GAME OVER

游戏代码主要框架:

游戏素材包:

爆炸图:

大boss敌机/小敌机/对方子弹/我方飞机/我方子弹

关键代码:

package com.sxt;

import Obj.*;

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

public class GameWin extends JFrame {
    //游戏状态 0未开始 1游戏中 2暂停 3通关失败 4.通关成功
    public static int state = 0;
    //游戏得分
    public static int score = 0;
    Image offScreenImage = null;
    int width = 600;
    int height = 600;
    //游戏的重绘次数
    int count = 1;
    //敌机出现的数量
    int enemyCount = 0;


    //背景图片对象
    BgObj bgObj = new BgObj(GameUtils.bgImg, 0, -2000, 2);
    //我方飞机对象
    public PlaneObj planeObj = new PlaneObj(GameUtils.planeImg, 290, 550, 20, 30, 0, this);
    //敌方boss对象
    public BossObj bossObj = null;

    //启动方法
    public void launch() {
        //设置窗口是否可见
        this.setVisible(true);
        //设置窗口大小
        this.setSize(width, height);
        //设置窗口位置
        this.setLocationRelativeTo(null);
        //设置窗口标题
        this.setTitle("飞机大战");

        GameUtils.gameObjList.add(bgObj);
        GameUtils.gameObjList.add(planeObj);

        //鼠标点击事件
        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getButton() == 1 && state == 0) {
                    state = 1;
                }
            }
        });

        //暂停游戏:空格
        this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == 32) {
                    switch (state) {
                        case 1:
                            state = 2;
                            break;
                        case 2:
                            state = 1;
                            break;
                        default:
                    }
                }
            }
        });

        //重复绘制
        while (true) {
            if (state == 1) {
                createObj();
                repaint();
            }
            try {
                Thread.sleep(25);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

    @Override
    public void paint(Graphics g) {
        if (offScreenImage == null) {
            offScreenImage = createImage(width, height);
        }
        Graphics gImage = offScreenImage.getGraphics();
        gImage.fillRect(0, 0, width, height);
        if (state == 0) {
            //未开始
            gImage.drawImage(GameUtils.bgImg, 0, 0, null);
            gImage.drawImage(GameUtils.bossImg, 220, 120, null);
            gImage.drawImage(GameUtils.explodeImg, 270, 350, null);
            GameUtils.drawWord(gImage, "点击开始游戏", Color.yellow, 40, 180, 300);
        }
        if (state == 1) {
            GameUtils.gameObjList.addAll(GameUtils.explodeObjList);
            //运行中
            for (int i = 0; i < GameUtils.gameObjList.size(); i++) {
                GameUtils.gameObjList.get(i).paintSelf(gImage);
            }
            //碰撞消失
            GameUtils.gameObjList.removeAll(GameUtils.removeList);
        }
        if (state == 3) {
            //失败
            gImage.drawImage(GameUtils.explodeImg, planeObj.getX() - 35, planeObj.getY() - 50, null);
            GameUtils.drawWord(gImage, "GAME OVER", Color.red, 50, 180, 300);
        }
        if (state == 4) {
            //通关
            gImage.drawImage(GameUtils.explodeImg, bossObj.getX() + 30, bossObj.getY(), null);
            GameUtils.drawWord(gImage, "游戏通关", Color.green, 50, 190, 300);
        }
        GameUtils.drawWord(gImage, score + "分", Color.green, 40, 30, 100);
        g.drawImage(offScreenImage, 0, 0, null);
        count++;
        System.out.println(GameUtils.gameObjList.size());
    }

    void createObj() {
        //我方子弹
        if (count % 15 == 0) {
            GameUtils.shellObjList.add(new ShellObj(GameUtils.shellImg, planeObj.getX() + 3, planeObj.getY() - 16, 14, 29, 5, this));
            GameUtils.gameObjList.add(GameUtils.shellObjList.get(GameUtils.shellObjList.size() - 1));
        }
        if (count % 15 == 0) {
            GameUtils.enemyObjList.add(new EnemyObj(GameUtils.enemyImg, (int) (Math.random() * 12) * 50, 0, 49, 36, 5, this));
            GameUtils.gameObjList.add(GameUtils.enemyObjList.get(GameUtils.enemyObjList.size() - 1));
            enemyCount++;
        }
        //敌方子弹
        if (count % 15 == 0 && bossObj != null) {
            GameUtils.bulletObjList.add(new BulletObj(GameUtils.bulletImg, bossObj.getX() + 76, bossObj.getY() + 85, 15, 25, 5, this));
            GameUtils.gameObjList.add(GameUtils.bulletObjList.get(GameUtils.bulletObjList.size() - 1));

        }
        if (enemyCount > 100 && bossObj == null) {
            bossObj = new BossObj(GameUtils.bossImg, 250, 35, 155, 100, 5, this);
            GameUtils.gameObjList.add(bossObj);
        }
    }


    public static void main(String[] args) {
        GameWin gameWin = new GameWin();
        gameWin.launch();
    }
}

结束语:

游戏还有很多缺陷的地方,大家可以自行修改,可以按空格键暂停有文字提示,我没有加文字提示。还有游戏通关后可以按空格继续等等,可以自行加代码修改

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值