基于Java语言在窗体上实现飞机大战小游戏的完整步骤

目录
  • 小组项目
  • 模块需求描述
  • 总体开发思想
  • 功能实现
    • 1.登录与结束界面
    • 2.播放音乐
    • 3.子弹
  • 运行测试
    • 登陆界面
    • 发射子弹
  • 总结

小组项目

飞机大战:用 Java 语言在窗体上实现飞机大战小游戏,运行程序后,出现一个窗体,在窗体上用鼠标控制英雄机的移动,通过子弹打击敌机进行分数的计算,以及英雄机血量的计算等。

主要模块:登陆界面、音乐、子弹、敌机、英雄机、背景图、结束界面、BOSS 机、分数计算、血量计算。

负责模块:登陆界面、音乐、子弹、结束界面。

模块需求描述

登陆界面:运行程序后,弹出窗体,在窗体上显示关卡模式的选择,点击其中的模式后,开始游戏。

结束界面:重新选择关卡模式,即可开始游戏

音乐:登陆音乐,开始游戏音乐。

  1. 子弹的创建
  2. 子弹的发射
  3. 子弹的移动
  • 一直向上:中间的子弹
  • 左上方向:左边的子弹
  • 右上方向:右边的子弹

4.子弹与敌机碰撞

5.子弹的类型升级

描述:当子弹打到道具机时,子弹一次发射的个数增加一个,最大为 3 个,当发射的个数为 3 时,子弹再打到道具机,子弹的类型就升一级,发射的个数置为 1,继续重新计算。第四种子弹只发射 3 个,发射后,子弹类型置为第三种子弹,第四种子弹无敌的,打到敌机不会消失。若期间英雄机被敌机碰到,子弹的类型置为 1,发射的个数置为 1。

类型:

  • 第一种子弹:伤害值:1
  • 第二种子弹:伤害值:2
  • 第三种子弹:伤害值:3
  • 第四种子弹:伤害值:100

6.子弹的一次发射个数的升级

描述:在子弹的类型升级中有涉及

类型:

  • 一次发射一个子弹
  • 一次发射两个子弹
  • 一次发射三个子弹

7.子弹与敌机碰撞

描述:当子弹与敌机碰撞后,子弹消失,敌机消失,消灭敌机数增加

总体开发思想

主要的数据结构

集合:用集合来存储子弹的对象,子弹的发射是从集合中调出对象,子弹的消失是从集合中删除相应的子弹对象

List<Fire> fires = new ArrayList<Fire>();

移动与碰撞原理

子弹的移动:子弹图片在窗口中显示位置横纵坐标的改变

移动方向:

直向上:子弹的横坐标不变,纵坐标逐渐变大

左上方向:子弹的横坐标逐渐变小,纵坐标逐渐变大

右上方向:子弹的横坐标逐渐变大,纵坐标逐渐变大

子弹与敌机的碰撞:子弹的位置坐标在敌机图片的位置大小范围内

音乐播放原理

在音乐类中,使用文档输入流来读入音频,再使用多线程实现游戏登陆和播放音乐、游戏运行和播放音乐的同时进行,在主类中调用音乐播放的方法。

界面设计原理

运行程序后,游戏运行状态为 false,此时调用画板画出背景图,选中相应的模式后,游戏运行状态为 ture,登录界面切换为游戏运行界面,游戏结束后,游戏运行状态为 false,重新显示登录界面。

选择关卡模式:调用鼠标监听器,用鼠标点击相应的模式字体区域,获取到鼠标点击的相应坐标后,在相应的坐标区域中选着相应的关卡模式,关卡模式是根据每循环多少次创建一个敌机来实现的。

开发语言:Java

功能实现

1.登录与结束界面

在画板类中:

登陆界面的实现:

// 当游戏结束时,
if (gameover) {
//画游戏登陆时的界面
try {
bg = App.getImg("/img/face.png");
} catch (IOException e) {
printStackTrace();//捕获抛出异常
}

drawImage(bg, 0 ,  0, 512, 728,  null);//画背景图片
//选择关卡模式(鼠标点击相应的位置进行操作)
//画笔为黑色
setColor(Color.black);
//字体大小和类型
setFont(new Font("楷体", Font.BOLD, 30));
//画的内容和位置
drawString("请选择关卡模式:", 130, 450);
drawString("(鼠标点击相应的位置进行操作)", 40, 480);
//画笔为蓝色
setColor(Color.blue);
//字体大小和类型
setFont(new Font("楷体", Font.BOLD, 50));
//画的内容和位置
drawString("1、简单模式", 100, 550);
drawString("2、普通模式" , 100, 600);
drawString("3、困难模式" , 100, 650);
}

读取关卡模式:

//当游戏结束时,读取鼠标的点击位置
if(gameover&&ms==0) {
int x=e.getX();//获取鼠标的横坐标
int y=e.getY();//获取鼠标的纵坐标
if(y>=500&&y<550&&x>=100&&x<400) {
ms=1;//模式 1
}else if(y>=550&&y<600&&x>=100&&x<400) {
ms=2; //模式 2
}else if(y>=600&&y<650&&x>=100&&x<400) {
ms=3; //模式 3
}
// 刷新界面
repaint();
}

2.播放音乐

在音乐类中:

读取音乐文件的方法:

static Player player = null;
static void  play(String str) {
    try {
        File file = new File(str);//读取文件
        FileInputStream fis = new FileInputStream(file);
        BufferedInputStream stream = new BufferedInputStream(fis);//读取流的转化
        player = new Player(stream);//创建一个播放音乐类对象
        player.play();//播放音乐
    } catch (FileNotFoundException | JavaLayerException e1) {
        printStackTrace();//抛出捕获异常
    }
}

播放音乐的方法:

/*
播放音乐的线程
*/
//游戏运行音乐
public void music1() {
    new Thread() {
        @Override
        public void run() {
            while (true) {
                System.out.println("播放音乐");
//如果游戏没结束就播放
                if (!GamePanel.gameover) {
                    Music.play("D:\\java文件\\飞机大战.mp3");
                }
            }
        }
    } .start();
}
//登陆音乐
public void music2() {
    new Thread() {
        @Override
        public void run() {
            Music.play("D:\\java文件\\mini.mp3");
        }
    } .start();
}

在主类中:

//创建音乐类对象
Music music =new Music();
//播放登陆音乐
music.music2();
//播放游戏运行音乐
music.music1();

3.子弹

创建

子弹类中:

//hx、hy子弹的横纵坐标,dir子弹的移动方向,num子弹的类型
public Fire(int hx,int hy,int dir,int num) throws IOException {
//确定子弹的图片
    img=App.getImg("/img/fire"+num+".png");
//确定子弹火力的大小
    if(num==1) {
        fr=1;
    } else if(num==2) {
        fr=2;
    } else if(num==3) {
        fr=3;
    } else if(num==4) {
        fr=100;
    }
    w=35;
    h=35;
//确定子弹的位置(初始位置在英雄机上)
    x=hx;
    y=hy;
    this.dir=dir;
    this.num=num;
}

在画板类中:

/*
*创建子弹的方法
*/
int findex = 0;// 记录shoot方法执行的次数
protected void shoot() throws IOException {
    findex++;
    if (findex == 20) {//减少创建的频率
        if (power == 1) {//当火力值为1,即一次发射一颗子弹
// 创建子弹,num子弹的类型
            Fire fire3 = new Fire(hero.x + 40, hero.y, 1, num);
// 将子弹加入到弹药库中
            fires.add(fire3);
//当火力值为2,即一次发射两颗子弹
        } else if (power == 2) {
// 创建子弹
            Fire fire1 = new Fire(hero.x + 10, hero.y, 1, num);
// 将子弹加入到弹药库中
            fires.add(fire1);
// 创建子弹
            Fire fire2 = new Fire(hero.x + 80, hero.y, 1, num);
// 将子弹加入到弹药库中
            fires.add(fire2);
//当火力值为3,即一次发射三颗子弹
        } else if (power == 3) {
// 创建子弹
            Fire fire1 = new Fire(hero.x, hero.y, 0, num);
// 将子弹加入到弹药库中
            fires.add(fire1);
// 创建子弹
            Fire fire2 = new Fire(hero.x + 50, hero.y - 20, 1, num);
// 将子弹加入到弹药库中
            fires.add(fire2);
// 创建子弹
            Fire fire3 = new Fire(hero.x + 100, hero.y, 2, num);
// 将子弹加入到弹药库中
            fires.add(fire3);
//当火力值为4,即一次发射三颗无敌子弹
        } else if (power == 4) {
// 创建子弹
            Fire fire1 = new Fire(hero.x+15, hero.y, 0, num);
// 将子弹加入到弹药库中
            fires.add(fire1);
// 创建子弹
            Fire fire2 = new Fire(hero.x, hero.y - 20, 1, num);
// 将子弹加入到弹药库中
            fires.add(fire2);
// 创建子弹
            Fire fire3 = new Fire(hero.x + 70, hero.y, 2, num);
// 将子弹加入到弹药库中
            fires.add(fire3);
//power置为1,无敌子弹创建完后,变成类型3
            power=1;
            num=3;
        }
        findex = 0;// 计数器归零
    }
}
-

发射

在画板类中:

// 在窗体上画子弹
// 遍历集合,画出所有的敌机
for (int i = 0; i < fires.size(); i++) {
// 获取每一个子弹
    Fire fire = fires.get(i);
//画出子弹
    drawImage(fire.img, fire.x, fire.y, fire.w, fire.h, null);
}

移动

子弹类中:

/*
* 子弹移动的方法
*/
public void move() {
if(dir==0) {
//左上
y=y-10;
x=x-2;
}else if(dir==1) {
//直走
y=y-10;
}else if(dir==2) {
//右上
y=y-10;
x=x+2;
}
}

碰撞敌机与升级

在画板类中:

/*

​    *判断一颗子弹是否击中了敌机

*/
private void bang(Fire fire) {
// 遍历所有的敌机
    for (int i = 0; i < eps.size(); i++) {
// 获取每一个敌机
        Ep e = eps.get(i);
// 判断该子弹是否击中敌机
        if (e.shootBy(fire)) {
// 如果敌机被子弹击中
// 如果不是导弹机(导弹机不会死亡,编号是15)
            if (e.type != 15) {
// 1.让敌机的血量减少
                hp=e.hp-fire.fr;
// 当敌机的血量减少到零时,死亡
                if (e.hp <= 0) {
// 判断敌机是否是道具机(道具机编号为12,打死道具机,子弹会升级)
                    if (e.type == 12) {
// 增加火力值,即一次发射的子弹数
                        power++;
// 如果power值大于3,增加英雄机血量,子弹类型升级
                        if (power > 3) {
                            hero.hp++;//英雄机增加血量
                            if (hero.hp > 5) {
                                hero.hp = 5;
                            }
//类型1-》类型2
                            if (num == 1) {
                                num = 2;
                                power=1;
//类型2-》类型3
                            } else if (num == 2) {
                                num = 3;
                                power=1;
//类型3-》类型4(创建完子弹类型4后,创建方法后面num置为3,power置为1)
                            } else if(num==3) {
                                num=4;
                                power=4;
                            }
                        }
                    }
// 2.敌机死亡(消失:从敌机大本营中删除)
                    eps.remove(e);
// 3.增加分数
                    score =e.type+ score;
//4.消灭的敌机数
                    Ep.number++;
                }
// 4.子弹消失:如果不是类型4(类型4无敌的),就从子弹库中删除
                if(num!=4) {
                    fires.remove(fire);
                }
            }
        }
    }
}

运行测试

登陆界面

发射子弹

子弹类型 1

子弹类型 2

子弹类型 3

子弹类型 4

总结

到此这篇关于基于Java语言在窗体上实现飞机大战小游戏的文章就介绍到这了,更多相关Java在窗体实现飞机大战小游戏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 一天时间用Java写了个飞机大战游戏,朋友直呼高手

    一.代码实现 创建窗口 首先创建一个游戏窗体类GameFrame,继承至JFrame,用来显示在屏幕上(window的对象),每个游戏都有一个窗口,设置好窗口标题.尺寸.布局等就可以. /* * 游戏窗体类 */ public class GameFrame extends JFrame { public GameFrame() { setTitle("飞机大战");//设置标题 setSize(526, 685);//设定尺寸 setLayout(new BorderLayout()

  • java实战之飞机大战小游戏(源码加注释)

    一.工程文件 二.Main.java 主函数,实现类 package ui; //主函数实现 public class Main { public static void main(String[] args) { //创建窗体 GameFrame frame = new GameFrame(); //创建面板 GamePanel panel = new GamePanel(frame); //调用开始游戏的方法启动游戏 panel.action(); //将面板加入到窗体中 frame.add

  • Java实现飞机大战-II游戏详解

    目录 前言 主要设计 功能截图 代码实现 启动类 玩家飞机 总结 前言 <飞机大战-II>是一款融合了街机.竞技等多种元素的经典射击手游.华丽精致的游戏画面,超炫带感的技能特效,超火爆画面让你肾上腺素爆棚,给你带来全方位震撼感受,体验飞行战斗的无限乐趣. 游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求: 玩家控制一台战斗机,以保证自己不被敌机消灭,消灭越多的敌机可以收取能量,补充玩家战斗机数量.玩家战斗机数量为0,则游戏结束. 主要设计 1

  • Java实现游戏飞机大战-III的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏面板类 商店类 总结 前言 <飞机大战-III>是一款融合了街机.竞技等多种元素的经典射击手游.华丽精致的游戏画面,超炫带感的技能特效,超火爆画面让你肾上腺素爆棚,给你带来全方位震撼感受,体验飞行战斗的无限乐趣. 游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 基于Java Swing,以飞机大战为原形,以抗日电视剧<亮剑>中的“李云龙”为主题,实现菜单.选关.难度.等级.技能等功能

  • java实现飞机大战游戏

    java实现飞机大战 用Java写个飞机大战游戏练习一下,实现可播放游戏背景音乐和游戏的基本功能 设计 1.准备好相应的图片和背景音乐(.wav文件): 2.直接看源码: 3.还有部分功能未实现. 源码 package forGame 加载游戏图片类 package forGame; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.image.BufferedImage; import java.io.Fil

  • Java实现经典游戏飞机大战-I的示例代码

    目录 前言 主要设计 功能截图 代码实现 启动类 核心类 核心算法 总结 前言 <飞机大战-I>是一款融合了街机.竞技等多种元素的经典射击手游.华丽精致的游戏画面,超炫带感的技能特效,超火爆画面让你肾上腺素爆棚,给你带来全方位震撼感受,体验飞行战斗的无限乐趣. 游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 玩家控制一台战斗机,以消灭所有的敌机为胜利,有些敌机会掉落装备,不可错过哦 主要设计 1. 用Swing库做可视化界面 2.鼠标控制战

  • 基于Java语言在窗体上实现飞机大战小游戏的完整步骤

    目录 小组项目 模块需求描述 总体开发思想 功能实现 1.登录与结束界面 2.播放音乐 3.子弹 运行测试 登陆界面 发射子弹 总结 小组项目 飞机大战:用 Java 语言在窗体上实现飞机大战小游戏,运行程序后,出现一个窗体,在窗体上用鼠标控制英雄机的移动,通过子弹打击敌机进行分数的计算,以及英雄机血量的计算等. 主要模块:登陆界面.音乐.子弹.敌机.英雄机.背景图.结束界面.BOSS 机.分数计算.血量计算. 负责模块:登陆界面.音乐.子弹.结束界面. 模块需求描述 登陆界面:运行程序后,弹出

  • C语言实现飞机大战小游戏完整代码

    大一课设做的飞机大战,可以进行登入和注册,这个是利用单链表做的,源代码已经给出,这个是最基本的飞机大战模式,我设置了几个功能,比如排行榜之类的.排行榜是用结构体数组做的,已及冒泡排序,并且在文件里保存信息.比较简单. 这个是注册页面规范: 这个是登入页面: 游戏菜单:  飞机大战页面:  话不多说,直接上代码 以下是源代码  #include"stdio.h" #include"windows.h" //用于获取窗口的句柄与屏幕控制 #include"co

  • 基于C语言编写一个简单的抽卡小游戏

    目录 效果图展示 开始的界面 输入1 输入10 输入0 实现代码 test4.26.c 许愿.c game.h 下载 小奔最近学了C语言不少的东西,但是想用学到的东西来搞一个小游戏. 不过小奔就不做那些猜数字等小游戏了,虽然很经典,但是可以尝试一下其他比较好玩的. 小奔喜欢玩原神,但它抽卡系统的中奖概率太低了,所以就类似做一个它的抽卡系统吧,不过没有保底功能哦(小奔还不想搞,还要学习新的知识,不过以后熟练了就可能会搞一个),是全角色抽卡,只有角色没有武器的,可以十连抽,没有保底功能,抽中的概率只

  • C语言实现飞机大战小游戏

    本文实例为大家分享了C语言实现飞机大战小游戏的具体代码,供大家参考,具体内容如下 技术原型 1.void gotoxy(int x, int y) 函数,该函数可以使光标去到(x,y)的位置进行打印:2.链表,用于存储状态:3.windows.h中有非阻塞输入,_kbhit():4.随机生成数:5.视觉暂留:6.碰撞检测:7.清屏函数:8.设置边界: 技术路线 1.设置一个边界:2.维护一个子弹的列表:3.维护一个敌机的列表:4.初始化飞机的位置:5.每隔一秒钟生成一架敌机,生成位置x坐标随机,

  • C++基于EasyX框架实现飞机大战小游戏

    正式使用Easyx之前,你需要先安装他!! EasyX 2022 版 (2022-9-1 更新) - EasyX 选择合适的版本安装 安装结束后就可以开始敲代码啦! 这里作者使用的是Visual Studio 2022所以安装EasyX_20220901版本 启动Visual Studio 2022,新建一个空项目 这是工程目录: 首先来看看Bullet(子弹)类 头文件: #pragma once class Bullet { public: Bullet(int x, int y, int

  • 原生JS实现飞机大战小游戏

    本文实例为大家分享了JS实现飞机大战小游戏的具体代码,供大家参考,具体内容如下 <html> <head> <title> 飞机大战 </title> <style type="text/css"> *{margin:0;padding:0;font-family:"Microsoft yahei"} body{overflow:hidden;;} </style> </head>

  • javascript实现简单飞机大战小游戏

    本文实例为大家分享了javascript实现飞机大战小游戏的具体代码,供大家参考,具体内容如下 效果图 html文件 <!DOCTYPE html><html lang='zh'><head>    <meta charset='UTF-8'>    <title>mm</title>    <link rel="stylesheet" href="./css/index.css">

  • Vue实现飞机大战小游戏

    目录 使用 Vue 开发一个简略版的飞机大战小游戏 一.实现思路 二.所需知识点 三.实现步骤 使用 Vue 开发一个简略版的飞机大战小游戏 如题,假设你为了向更多访问你博客的人展示你的技术,你决定小试身手开发一个飞机大战小游戏.功能: 开始游戏前用户名必填,玩家可以发射子弹,敌军与行星随机出现,鼠标可操控玩家移动,敌军可发射子弹 一.实现思路 如题所述: 玩家可操控玩家飞机可发射子弹,敌军与行星随机生成: 这意味着我们需要一个单独的玩家飞机dom,以及敌军.行星与子弹 用 vue 循环生成的3

  • 用JS实现飞机大战小游戏

    本文实例为大家分享了JS实现飞机大战小游戏的具体代码,供大家参考,具体内容如下 小的时候玩的飞机大战感觉还蛮神奇,今天自己就学着做了一个 先制作好要做好的几步以及背景样式 var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); var start = 0; // 开始阶段 var starting = 1; // 开始的加载阶段 var running =

随机推荐