雷电飞机大战游戏|基于Java开发实现雷电飞机大战游戏

简介: 雷电飞机大战游戏|基于Java开发实现雷电飞机大战游戏

前言:

电脑游戏,是指在计算机上能够运转的游戏软件。这种软件具有较强的娱乐性。电脑游戏的创新和发展与硬件、软件的发展紧密相关。它能够给玩家提供一个虚拟的环境,使游戏带给了人们很多的享受和欢乐。雷电游戏因为操作简单,节奏明快,一直是纵轴射击游戏的经典之作。经常能够在手机或者计算机中见到这款游戏,深得广大玩家的喜爱,可以说是妇孺皆知的一款益智类游戏。

  本游戏基于Eclipse开发工具,以java作为编程语言,整个项目开发旨在模拟雷电游戏的飞机射击游戏。游戏界面的下部是玩家的飞机,可以根据按键控制子弹的发射,上部为敌方飞机,在界面中随机出现。在游戏过程当中,用户飞机的移动是被电脑键盘的方向键所控制的,在整个游戏过程当中,如果用户飞机的子弹与敌方飞机发生相撞时,敌方飞机就会有爆炸的效果产生。游戏中使用到的飞机、子弹均采用对应的类实现。

一,项目简介

我们在小时候都拥有属于自己的一台游戏机,里面形形色色大概有十来款游戏。像 “扫雷”、“推箱子”、“俄罗斯方块”等等,我们的童年有这些游戏陪伴我们是幸福的,令许多小伙伴都为之痴迷,即使现在,这些都是随处可见的休闲游戏。我之选择“雷电”游戏作为我的毕业设计,因为它可以代表一代人青春的回忆。

Java语言,实际上就是面向对象的编程语言。对于计算机编程者来说,使用Java最大的好处有两方面,一是就编写程序而言,非常的简单也容易使用,二是它的功能很强大。与此同时,面向对象理论得以很好的实现。“雷电”游戏的毕业设计使我对本科期间所学知识进行了巩固。

   目前常见的电脑游戏的类型有动作游戏、传统益智游戏、体育游戏、策略游戏、休闲游戏和角色扮演类游戏等。不同的类型的游戏有着自身的特点,每一种类型的游戏都有一定的支持人群。开发出一款良好的游戏,了解各种类型的基本特点是很有必要的。而“雷电”游戏就属于上述类型中的STG(射击类)游戏,STG(Shooting Game)类型游戏主要凭借远程武器与敌方开展模拟对抗,拥有绚丽的射击画面。

这个项目使我第一次全流程地独立完成整条链路的开发,对于我自己而言,是0-1的突破。万事开头难,有了这次完整项目开发的经历,以后再做游戏或者其它项目时就对全局有所把控,能够做到游刃有余。假如自己没有亲自动手设计这些,哪怕一次,就不能够真正的领会一个完整项目体系中的每个元素。在以后做一些大的项目时,就更不能对整体进行宏观思考,也就不能对具体项目中每一个细分的小模块进行合适的时间估计,导致项目开发超过预期时间,更有甚,不能完成。

大部分的射击类游戏都存在一定的相似性,雷电游戏也不存在特殊。其实就是一个周而复始的情形,一直到游戏结束才能够停止。游戏开始阶段接受玩家的输入并对这个输入办理,如果没有结束就会不断产生飞机,通过检查我方飞机的血条判断游戏是不是最终结束。

该雷电主要就是我方飞机与敌方飞机的射击比拼,首先需要有界面来装载整个项目,通过键盘的上、下、左、右键遥控自己的飞机,z、x键进行子弹发射的选择,然后是敌方飞机的出现方式,敌机子弹的生成,通过各个关卡,最后得出比赛的结果。

雷电游戏主要包括以下功能:

  1. 雷电游戏状态调整功能 :在游戏启动时,游戏会自动进行初始化的验证,若初始化成功后,界面会自动进行跳转,跳转到游戏开始界面,有开始、暂停、恢复游戏等选项。

   (2)雷电游戏难度的升级:当进入游戏后,随着时间越来越长,游戏难度会越来越大,界面中敌机增多,对飞机造成伤害的子弹增多,游戏难度增加,最后会遇到一个血条较长的怪兽,攻击其至血条为0时,自动过关跳转到下一关卡。

   (3)玩家对飞机的控制功能:玩家可以对飞机进行操控,通过前后左右键来控制飞机的飞行路线。

   (4)游戏界面绘画功能。

关键技术

  1. 游戏美工。游戏中需要使用的游戏素材有自己控制的飞机、敌方飞机、游戏过程当中飞机所产生的子弹、飞机被命中的爆炸图片等。这些素材的选择尤为重要,游戏中清新亮丽的画面可以给玩家带来充足的美感和游戏体验。所以,在这个“雷电”游戏的素材选择中,应挑选一些立体感强的图片,给玩家更大的视觉冲击。
  2. 多线程技术的实现。多线程编程能够提供程序两个或两个以上并发执行任务的能力,极大改善程序的响应性能,有效提高资源的利用效率。采取Runnable接口的方法达到定义用户线程的功能,这样既不会对继承其他类有所变化,也不会改变实现其它接口。
  3. 用户飞机子弹与敌方飞机的相撞测试。包括自己控制的飞机与敌方飞机或子弹的相撞等。在这一过程中,将所有子弹对象的矩形区域与敌机对象的矩形区域逐个以此进行检测,如果出现重叠则说明子弹与敌机发生了碰撞。

(4)游戏地图滚动原理的实现。我们在坐火车时都产生过一种错觉:自己乘坐的火车没有发生移动,但如果旁边有其他火车发生移动,我们就会感到是自己的火车在移动。这种现象与飞机射击类游戏的地图原理类似,即通过背景图片的来回滚动,给游戏玩家一种是自己操纵的飞机向前飞行的感觉。

二,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

开发技术:JavaSwing 及多线程

三,系统展示

四,核心代码展示

package com.ideabobo.game.leidian;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import com.ideabobo.game.leidian.Boss;
public class Battle extends Role {
  private static Battle battle = new Battle();
  private int tamaIntCount;
  private float speed;
  private float oldx;
  private float oldy;
  public static float vx;
  public static float vy;
  public static boolean keygo = false;
  private float tv[] = { -1F, -7F, 0.0F, -8F, 1.0F, -7F };
  public int power;
  public int powerMax;
  public Battle() {
    super(GamePanel.heroImage);
    speed = 3F;
    tamaIntCount = 0;
    x = ((float) app.getWidth() - WIDTH) / 2.0F;
    y = (float) app.getHeight() - HEIGHT * 2.0F;
    power = 600;
    powerMax = power;
  }
  public static Battle getInstance() {
    return battle;
  }
  public void move() {
    oldx = x;
    oldy = y;
    if (Key.left) {
      if (Key.xkey)
        x -= (double) speed / 4D;
      else
        x -= speed;
      if (x <= 0.0F)
        x = 0.0F;
    }
    if (Key.right) {
      if (Key.xkey)
        x += (double) speed / 4D;
      else
        x += speed;
      if (x + WIDTH >= (float) app.getWidth())
        x = (float) app.getWidth() - WIDTH;
    }
    if (Key.down) {
      if (Key.xkey)
        y += (double) speed / 4D;
      else
        y += speed;
      if (y + HEIGHT >= (float) app.getHeight())
        y = (float) app.getHeight() - HEIGHT;
    }
    if (Key.up) {
      if (Key.xkey)
        y -= (double) speed / 4D;
      else
        y -= speed;
      if (y <= 0.0F)
        y = 0.0F;
    }
    //**//--///loonframewrk提供
    vx = x - oldx;
    vy = y - oldy;
    if (tamaIntCount > 0)
      tamaIntCount--;
    if (Key.zkey && tamaIntCount <= 0) {
      for (int i = 0; i < tv.length; i += 2) {
        GamePanel.addList(new BattleBasic(x + WIDTH / 2.0F, y, tv[i],
            tv[i + 1]));
        tamaIntCount = 8;
      }
    }
    if (Key.xkey && !Key.zkey && tamaIntCount <= 0) {
      GamePanel.addList(new BattleBeam(x + WIDTH / 2.0F, y, 0.0F, -8F));
      tamaIntCount = 2;
    }
    if(Key.space){
      if(!keygo){
        GamePanel.skillCount--;
      }
      app.skillAnime();
      if(GamePanel.skillCount < 0){
        GamePanel.skillCount = 0;
      }
      if(GamePanel.skillCount>0){
        for (int i = 0; i < GamePanel.list.size(); i++) {
          Role chara1 = (Role) GamePanel.list.get(i);
          if(!(chara1 instanceof Battle) && chara1.x>0 && chara1.y>0 && !(chara1 instanceof BossA)  && !(chara1 instanceof BossB)  && !(chara1 instanceof BossC)){
            GamePanel.list.remove(i);
          }else if((chara1 instanceof BossA)  || (chara1 instanceof BossB)  || (chara1 instanceof BossC)){
            Boss cb = (Boss)chara1;
            cb.power-=50;
          }
        }
      }
      keygo = true;
    }
    if(!Key.space){
      keygo = false;
    }
  }
  public boolean checkHit(Role chara) {
    if ((chara instanceof EnemyA) || (chara instanceof EnemyB)|| (chara instanceof EnemyC) || (chara instanceof EnemyShot)) {
      if ((x + WIDTH) - 14F > chara.x && x + 14F < chara.x + chara.WIDTH
          && (y + HEIGHT) - 12F > chara.y
          && y + 12F < chara.y + chara.HEIGHT) {
        //如果碰到敌人,敌人死亡
        chara.dead();
        //如果碰到子弹血量减少
        if (chara instanceof EnemyBeam){
          power--;
        }
        power -= 50;
        if (power <= 0) {
          dead();
          //绘制爆炸图片
          GamePanel.burst = new Burst(x, y);
        }
        return true;
      }
    } else if ((chara instanceof Boss) && (x + WIDTH) - 14F > chara.x + 50F
        && x + 14F < (chara.x + chara.WIDTH) - 50F
        && (y + HEIGHT) - 12F > chara.y + 50F
        && y + 12F < (chara.y + chara.HEIGHT) - 80F) {
      power--;
      if (power <= 0) {
        dead();
        GamePanel.burst = new Burst(x, y);
      }
      return true;
    }
    return false;
  }
  public void setX(float x) {
    this.x = x;
  }
  public void setY(float y) {
    this.y = y;
  }
  public float getWidth() {
    return WIDTH;
  }
  public float getHeight() {
    return HEIGHT;
  }
  public float getX() {
    return x;
  }
  public float getY() {
    return y;
  }
  public Image getImage() {
    return img;
  }
  public int getPower() {
    return power;
  }
  public int getPowerMax() {
    return powerMax;
  }
  public void setPower(int power) {
    this.power = power;
  }
  public void drawPower(Graphics g) {
    g.setColor(Color.white);
    g.drawRect(380, 450, 50, 15);
    g.setColor(Color.red);
    g.fillRect(381, 451,
        (int) ((50D / (double) (float) powerMax) * (double) power) - 1,
        14);
  }
  public void drawSkillCount(Graphics g){
    g.setColor(Color.white);
    Font font = new Font("宋体", 1, 20);
    g.setFont(font);
    g.drawString("全屏爆破:" + GamePanel.skillCount, 0, 450);
  }
}
package com.ideabobo.game.leidian;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
abstract class Boss extends Enemy {
  protected int powerMax;
  public Boss(Battle battle, Image enemyImage) {
    super(battle, enemyImage);
  }
  public abstract void move();
  public float getX() {
    return x;
  }
  public float getY() {
    return y;
  }
  public float getWidth() {
    return WIDTH;
  }
  public float getHeight() {
    return HEIGHT;
  }
  public int getPower() {
    return power;
  }
  public Image getImage() {
    return img;
  }
  public void drawPower(Graphics g) {
    g.setColor(Color.white);
    g.drawRect(200, 20, 150, 15);
    g.setColor(Color.green);
    g
        .fillRect(
            201,
            21,
            (int) ((150D / (double) (float) powerMax) * (double) power) - 1,
            14);
  }
  public int getPowerMax() {
    return powerMax;
  }
}

五,项目总结

本次项目开发是基于JAVA的雷电游戏。

此雷电游戏通俗来说就是我方飞机和敌方之间的对决,先要做的应该是通过一个界面来达到装载整个游戏,然后就是我方飞机的移动方式(也就是通过键盘来移动),接着就是生成我方飞机的子弹(依据子弹类型的不同有不同的实现形式),准备就绪后会有敌方飞机的出现,每一个飞机会对应发射不同种类的子弹,最后是我方飞机通过键盘进行移动、射击,显示出游戏结果,然后结束游戏。

该雷电应该满足以下一些要求:

(1)游戏状态控制功能

在进行游戏的设计时,我们应该考虑到,如何进行游戏状态的划分。简单来说,我们需要设置开始,并且要考虑到游戏中断,以及中断后回到游戏中。玩家点击开始之后,程序会调用启动页面的代码,然后进入游戏,在游戏的过程中,玩家如果由于其它工作需要离开时,可以将其中断,比如单击空格键,当需要恢复游戏现场时,再单击空格键,就可以继续游戏,当自己控制的飞机被击毁时,会有游戏结束的显现。

(2)游戏难度的调整

   随着游戏的进行、关卡的提高,敌机的速度会越来越快、敌方飞机的数目会越来越多、子弹数量也会越快且越多。此时,带给游戏玩家的视觉冲击变得更强,需要玩家更加冷静地去躲闪以及攻击敌机。

(3)游戏界面绘画功能

游戏主屏主要用来输出用户对我方的控制与敌方的动作显示。在游戏屏幕的左下角有全屏爆破次数的显示,这相当于游戏玩家的特殊技能,可以瞬间清除当前屏幕上的所有敌机以及子弹,在游戏屏幕的右下角会呈现玩家飞机血条,代表着当前我方飞机的状态。当血条格为空时,表示我方飞机已经被击毁,整个雷电游戏也将结束。

  1. 玩家游戏控制功能

对于我方飞机的移动和子弹的发射,游戏用户可以通过控制键盘来控制。飞机的左右移动通过键盘的上、下、左、右键来实现,而我方飞机子弹的释放方式有两种,z键会释放出点状子弹,而x键会释放出线状子弹,可供游戏玩家依据需要自行选择。

相关文章
|
3月前
|
Java
Java实现贪吃蛇游戏
本文介绍了如何使用Java实现一个简单的贪吃蛇游戏。
105 4
|
2天前
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
26 5
|
1月前
|
机器学习/深度学习 人工智能 NoSQL
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
随着大模型的越来越盛行,现在很多企业开始接入大模型的接口,今天我从java开发角度来写一个demo的示例,用于接入DeepSeek大模型,国内的大模型有很多的接入渠道,今天主要介绍下阿里云的百炼模型,因为这个模型是免费的,只要注册一个账户,就会免费送百万的token进行学习,今天就从一个简单的可以执行的示例开始进行介绍,希望可以分享给各位正在学习的同学们。
211 3
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
|
18天前
|
人工智能 Java 物联网
没有好的学历,Java开发未来的路应该怎么走?
在数字化时代,Java开发者即使没有高学历,也能通过拥抱新兴技术(如大模型应用与鸿蒙系统开发)、积累实战经验、持续学习新技能等途径实现职业突破。从参与开源项目到关注行业动态,再到规划技术专家或管理路线,建立人脉网络并利用教育平台提升能力,开发者可拓宽技术边界,适应日新月异的技术需求,在未来发展中占据一席之地。
|
2月前
|
人工智能 安全 IDE
一天成为Java开发高手:用飞算JavaAI实现十倍提效
“一天成为Java开发高手”曾被视为天方夜谭,但飞算JavaAI的出现改变了这一局面。这款AI开发助手通过智能引导、需求分析、自动化逻辑处理和完整代码工程生成,大幅简化了Java开发流程。它不仅帮助新手快速上手,还让资深开发者提高效率,减少调试时间。现在,参与“飞算JavaAI炫技赛”,展示你的开发实力,赢取丰厚奖品!
|
2月前
|
JavaScript 安全 Java
智慧产科一体化管理平台源码,基于Java,Vue,ElementUI技术开发,二开快捷
智慧产科一体化管理平台覆盖从备孕到产后42天的全流程管理,构建科室协同、医患沟通及智能设备互联平台。通过移动端扫码建卡、自助报道、智能采集数据等手段优化就诊流程,提升孕妇就诊体验,并实现高危孕产妇五色管理和孕妇学校三位一体化管理,全面提升妇幼健康宣教质量。
67 12
|
1月前
|
搜索推荐 Java Android开发
课时146:使用JDT开发Java程序
在 Eclipse 之中提供有 JDT环境可以实现java 程序的开发,下面就通过一些功能进行演示。 项目开发流程
|
1月前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
|
2月前
|
人工智能 Java 数据处理
Java高级应用开发:基于AI的微服务架构优化与性能调优
在现代企业级应用开发中,微服务架构虽带来灵活性和可扩展性,但也增加了系统复杂性和性能瓶颈。本文探讨如何利用AI技术,特别是像DeepSeek这样的智能工具,优化Java微服务架构。AI通过智能分析系统运行数据,自动识别并解决性能瓶颈,优化服务拆分、通信方式及资源管理,实现高效性能调优,助力开发者设计更合理的微服务架构,迎接未来智能化开发的新时代。
|
3月前
|
前端开发 Java 程序员
菜鸟之路day02-04拼图小游戏开发一一JAVA基础综合项目
本项目基于黑马程序员教程,涵盖面向对象进阶、继承、多态等知识,历时约24小时完成。项目去除了登录和注册模块,专注于单机游戏体验。使用Git进行版本管理,代码托管于Gitee。项目包含窗体搭建、事件监听、图片加载与打乱、交互逻辑实现、菜单功能及美化界面等内容。通过此项目,巩固了Java基础并提升了实际开发能力。 仓库地址:[https://gitee.com/zhang-tenglan/puzzlegame.git](https://gitee.com/zhang-tenglan/puzzlegame.git)
89 6