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.File;
import java.io.IOException;

//游戏图片包装
public class ImageUtil {

  //图片大小
  public static int WIDTH_BACK;
  public static int HEIGHT_BACK;
  public static int WIDTH_PLANE;
  public static int HEIGHT_PLANE;

  //图片
  public static BufferedImage START;
  public static ImageIcon BUTTON;
  public static BufferedImage PLANE_1;
  public static BufferedImage PLANE_2;
  public static BufferedImage Bullet_1;
  public static BufferedImage Bullet_2;
  public static BufferedImage XIAO_PLANE;
  public static BufferedImage BOMB_PLANE1;
  public static BufferedImage BOMB_PLANE2;

  static {
    try {
      START = ImageIO.read(new File("src\\image\\背景2.png"));
      BUTTON = new ImageIcon("src\\image\\开始.png");
      PLANE_1 = ImageIO.read(new File("src\\image\\飞机1.png"));
      PLANE_2 = ImageIO.read(new File("src\\image\\飞机2.png"));
      Bullet_1 = ImageIO.read(new File("src\\image\\导弹1.png"));
      Bullet_2 = ImageIO.read(new File("src\\image\\导弹2.png"));
      XIAO_PLANE = ImageIO.read(new File("src\\image\\小飞机.png"));
      BOMB_PLANE1 = ImageIO.read(new File("src\\image\\飞机爆炸1.png"));
      BOMB_PLANE2 = ImageIO.read(new File("src\\image\\飞机爆炸2.png"));
    } catch (IOException e) {
      e.printStackTrace();
    }
    WIDTH_BACK = START.getWidth();
    HEIGHT_BACK = START.getHeight();
    WIDTH_PLANE = PLANE_1.getWidth();
    HEIGHT_PLANE = PLANE_1.getHeight();
  }
}

播放游戏背景音乐类

package forGame;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import java.io.File;

//播放背景音乐(.wav文件)
public class PlayMusic {
  private Clip clip;
  //需要传入要播放的文件位置的字符串
  public void start(File file)
  {
    try
    {
      //创建相当于音乐播放器的对象
      clip = AudioSystem.getClip();
      //转成可播放的文件
      AudioInputStream audioInput = AudioSystem.getAudioInputStream(file);
      //播放器打开这个文件
      clip.open(audioInput);
      //clip.start();//只播放一次
      //循环播放
      clip.loop(Clip.LOOP_CONTINUOUSLY);
    } catch(Exception ex){
      ex.printStackTrace();
    }
    //死循环不让主程序结束(swing可不用)
    /*
      while(true){
      }
    */
  }

  //关闭音乐播放
  public void exit(){
    clip.close();//停止音乐播放,下次播放重新开始
  }

  //停止音乐播放
  public void stop(){
    clip.stop();//停止音乐播放,下次播放继续播放
  }
}

package planeGame

接口

package planeGame;

import java.awt.*;

//绘制接口
public interface DrawMe {
  void drawMe(Graphics g);
}
package planeGame;

//分数接口
public interface Grade {
  int getGrade();
}

窗口父类

package planeGame;

import forGame.ImageUtil;
import forGame.PlayMusic;

import javax.swing.*;
import java.io.File;

//窗口父类
public class MyJFrameFather extends JFrame{
  protected int y1 = 0;
  protected int y2 = -830;
  protected PlayMusic playMusic = new PlayMusic();
  public MyJFrameFather(String name){
    super(name);
    setSize(ImageUtil.WIDTH_BACK, ImageUtil.HEIGHT_BACK);
    setLocationRelativeTo(null);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    playMusic.start(new File("src\\music\\bgm.wav"));
  }
}

开始界面

package planeGame;

import forGame.ImageUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

//游戏开始界面
public class StartJFrame extends MyJFrameFather{
  public StartJFrame(){
    super("开始界面");
    ImageIcon imageIcon = ImageUtil.BUTTON;
    JButton jButton = new JButton(imageIcon);
    //设置按钮没有边框
    jButton.setBorder(null);
    jButton.setBounds(200,350,imageIcon.getIconWidth(),imageIcon.getIconHeight());
    jButton.setBackground(Color.lightGray);
    setLayout(null);
    add(jButton);
    setVisible(true);
    jButton.addActionListener(actionListener);
  }

  @Override
  public void paint(Graphics g) {
    g.drawImage(ImageUtil.START,0,0 ,null );
  }

  private ActionListener actionListener = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
      playMusic.exit();
      new GameJFrame();
      dispose();
    }
  };
}

飞机父类(抽象类)

package planeGame;

import java.awt.*;

//飞机父类
public abstract class Plane implements DrawMe{
  //飞机坐标
  protected Point p = new Point();
  //飞机是否活着
  protected boolean isLive = true;
  //飞机移动速度
  protected int speed;
  public Plane(int x,int y){
    p.x = x;
    p.y = y;
  }
  //修改飞机坐标以重复使用
  public abstract void setP(int x);
  //画自己
  public abstract void drawMe(Graphics g);
  //移动
  public abstract void move();
  //获取飞机坐标
  protected Point getP(){
    return p;
  }

  //飞机发射子弹
  public void playBullet(Bullet bullet){
   //子弹状态为true
    bullet.setLive();
  }

  //改变飞机状态
  public void setLive(boolean aboolean){
    isLive = aboolean;
  }

  //返回飞机状态
  public boolean getIsLive(){
    return isLive;
  }
}

主飞机类

package planeGame;

import forGame.ImageUtil;

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

//主飞机
public class MainPlane extends Plane{
  //移动方向 1;上 -1:下 2:右 -2:左
  private int direction = 1;
  public MainPlane(int x, int y) {
    super(x, y);
  }

  @Override
  public void setP(int x) {}

  private boolean aBoolean = true;//绘制动态主飞机
  @Override
  public void drawMe(Graphics g) {
    if(isLive){
      if(aBoolean) {
        g.drawImage(ImageUtil.PLANE_1, p.x, p.y, null);
        aBoolean = false;
      }
      else {
        g.drawImage(ImageUtil.PLANE_2, p.x, p.y, null);
        aBoolean = true;
      }
    }
    else{
      g.drawImage(ImageUtil.BOMB_PLANE1, p.x, p.y, null);//未绘制动态爆炸效果
    }
  }

  @Override
  public void move() {
    if(direction == 1 && p.y > 30)
      p.move(p.x,p.y + speed);
    else if(direction == -1 && p.y < ImageUtil.HEIGHT_BACK - ImageUtil.HEIGHT_PLANE)
      p.move(p.x,p.y + speed);
    else if(direction == 2 && p.x < ImageUtil.WIDTH_BACK - ImageUtil.HEIGHT_PLANE)
      p.move(p.x + speed,p.y);
    if(direction == -2 && p.x > 0)
      p.move(p.x + speed,p.y);
  }

  //监听飞机移动
  private KeyListener keyListener = new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
      int keyCode = e.getKeyCode();
      //移动方向 1;上 -1:下 2:右 -2:左
      //上
      if(keyCode == KeyEvent.VK_UP){
        direction = 1;
        speed = -20;
        move();
      }
      //下
      if(keyCode == KeyEvent.VK_DOWN){
        direction = -1;
        speed = 20;
        move();
      }
      //左
      if(keyCode == KeyEvent.VK_LEFT){
        direction = -2;
        speed = -32;
        move();
      }
      //右
      if(keyCode == KeyEvent.VK_RIGHT){
        direction = 2;
        speed = 32;
        move();
      }
    }
  };
  //返回键盘监听器
  public KeyListener getKeyListener(){
    return keyListener;
  }
  //主飞机是否与敌机相撞
  public void isBomb(Plane[] planes){
    for(int i = 0;i < planes.length; i++) {
      if (planes[i].getIsLive()) {
        if(planes[i].getP().x > p.x && planes[i].getP().x < p.x + 128 && (p.y - planes[i].getP().y < 64)) {
          isLive = false;
          planes[i].setLive(false);
        }
      }
    }
  }
}

敌机类

package planeGame;

import forGame.ImageUtil;

import java.awt.*;

//敌机,未设置发射子弹功能
public class GamePlane extends Plane implements Grade{
  public GamePlane(int x, int y) {
    super(x, y);
  }

  @Override
  public void setP(int x) {
    p.x = x;
    p.y = 0;
  }

  @Override
  public void drawMe(Graphics g) {
    g.drawImage(ImageUtil.XIAO_PLANE,p.x,p.y,null);
    move();
  }

  @Override
  public void move() {
    if(p.y < 900)
      p.y = p.y +20;
    else
      isLive = false;
  }

 //未实现
  @Override
  public int getGrade() {
    return 0;
  }
}

子弹类

package planeGame;

import forGame.ImageUtil;

import java.awt.*;

//子弹类
public class Bullet implements DrawMe {
  private boolean isLive = false;//是否绘制子弹
  private int x;//子弹初始横坐标
  private int y;//子弹初始纵坐标
  private int color;//绘制什么子弹的标志
  public Bullet(int number,int x,int y){
    this.color = number;
    this.x =x;
    this.y =y;
  }

  //修改子弹坐标
  public void setXY(int x,int y){
    this.x =x;
    this.y =y;
  }

  //修改子弹状态
  public void setLive(){
    isLive = true;
  }
  public boolean getLive(){
    return isLive;
  }
  //绘制子弹
  @Override
  public void drawMe(Graphics g) {
    if(color == 1){
      g.drawImage(ImageUtil.Bullet_1, x, y,null);
    } else {
      g.drawImage(ImageUtil.Bullet_2, x, y, null);
    }
    move();
  }

  //子弹移动
  private void move(){
    if(color == 1){
      if(y > 30)
        y = y - 50;
      else
        isLive = false;
    }else{
      if(y < 900)
        y = y + 100;
      else
        isLive = false;
    }
  }

  //子弹是否击中敌机
  public boolean isBom(Plane[] planes){
    boolean is = false;
    for(int i = 0;i < planes.length;i ++){
      if(planes[i].getIsLive()){
        if(x > planes[i].getP().x && x < planes[i].getP().x + 64){
          if(y - planes[i].getP().y <= 64) {
            isLive = false;
            planes[i].setLive(false);
            is = true;
          }
        }
      }
    }
    return is;
  }

  //子弹是否与主机相撞
  private void isBom(Plane plane){

  }

}

创建主飞机、敌机、子弹类

package planeGame;

import java.util.Random;

//生产飞机、子弹
public class Production{
  Random random = new Random();
  private GamePlane[] gamePlanes = new GamePlane[16];
  private Bullet[] bullets = new Bullet[50];

  //背景图:596 x 854
  //飞机图:128 x 128
  //子弹图:9 x 21
  private MainPlane mainPlane = new MainPlane(random.nextInt(400),random.nextInt(160) + 400);
  public MainPlane getMainPlane() {
    return mainPlane;
  }

  //生产敌机

  public GamePlane[] getGamePlanes() {
    for(int i = 0;i < 16;i ++){
      gamePlanes[i] = new GamePlane(0,0);
      gamePlanes[i].setLive(false);
    }
    return gamePlanes;
  }

 //修改一个敌机状态为true
  public void setGamePlanes(){
    for(int i = 0;i < 16;i ++){
      if(!gamePlanes[i].isLive){
        gamePlanes[i].setP(random.nextInt(12) * 45 + 32);
        gamePlanes[i].setLive(true);
        break;
      }
    }
  }
 //随机产生一个boolean值
  public boolean getBoolean(){
    return random.nextBoolean();
  }

  //生产子弹
  public Bullet[] getBullets() {
    for(int i = 0;i < 50;i ++){
      if(i < 20)
        bullets[i] = new Bullet(1,0,0);
      else
        bullets[i] = new Bullet(2,0,0);
    }
    return bullets;
  }
}

游戏界面

package planeGame;

import forGame.ImageUtil;
import forGame.PlayMusic;

import java.awt.*;

//游戏界面,绘制并显示
public class GameJFrame extends MyJFrameFather{
  private boolean isRepaint = true;
  private PlayMusic playMusicB = new PlayMusic();
  private Production production = new Production();
  private GamePlane[] gamePlanes;
  private Bullet[] bullets;
  private MainPlane mainPlane = production.getMainPlane();
  private int grade = 0;
  public GameJFrame(){
    super("游戏界面");
    setVisible(true);
    addKeyListener(mainPlane.getKeyListener());
    MyRunning myRunning = new MyRunning();
    myRunning.start();
    gamePlanes = production.getGamePlanes();
    bullets = production.getBullets();
  }

  @Override
  public void paint(Graphics g) {
    Image image = this.createImage(getWidth(),getHeight());
    Graphics gImage = image.getGraphics();
    gImage.setColor(gImage.getColor());
    gImage.fillRect(0,0,getWidth(),getHeight());
    super.paint(gImage);

    //596 x 854
    //绘制动态背景
    if(y2 == 0){
      y1 = 0;
      y2 = -830;
    }
    gImage.drawImage(ImageUtil.START,0 ,y1 ,null );
    gImage.drawImage(ImageUtil.START,0 ,y2 ,null );
    y1 = y1 + 10;
    y2 = y2 + 10;
    //绘制飞机子弹
    if(mainPlane.isLive){//主飞机活着
      for(int i = 0;i < 20;i ++){
       //找子弹状态为false,重新设置坐标并修改状态
        if(!bullets[i].getLive()){
          bullets[i].setXY(mainPlane.getP().x + 60,mainPlane.getP().y - 21);
          mainPlane.playBullet(bullets[i]);
          break;
        }
      }
      //绘制活着的敌机
      for(int i =0;i < 10;i ++){
        if(gamePlanes[i].isLive){
          gamePlanes[i].drawMe(gImage);
        }
      }
      //控制什么时候让敌机活
      if(production.getBoolean() && production.getBoolean())
        production.setGamePlanes();
      //判断主飞机是否爆炸
      mainPlane.isBomb(gamePlanes);
      //绘制主飞机
      mainPlane.drawMe(gImage);
      //首先判断子弹是否击中敌机,没有击中则绘制子弹
      for(int i = 0;i < bullets.length;i ++){
        if(bullets[i].getLive()) {
          if (bullets[i].isBom(gamePlanes))
            grade = grade + 10;
          else
            bullets[i].drawMe(gImage);
        }
      }
    }else{
      isRepaint = false;
      mainPlane.drawMe(gImage);
      gImage.setFont(new Font("宋体",Font.ITALIC ,50));
      gImage.drawString("GameOver",200,350);
    }
    gImage.drawString("得分:" + grade,10,100);
    //最后绘制缓冲后的图片
    g.drawImage(image,0 ,0 , null);
  }

 //多线程去控制重新绘制的时间
  private class MyRunning extends Thread{
    @Override
    public void run() {
      while (isRepaint){
        try {
          sleep(100);
          repaint();
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    }
  }
}

测试类

package planeGame;

//测试类
public class Demo {
  public static void main(String[] args) {
    new StartJFrame();//创建开始界面
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java版飞机大战实战项目详细步骤

    本文为大家分享了java版飞机大战实战项目,供大家参考,具体内容如下 分析 飞机大战 首先对这个游戏分析,在屏幕上的物体都是飞行物,我们可以把建一个类,让其他飞行物继承这个类.游戏中应有英雄机(也就是自己控制的飞机).敌人.而敌人应该分为打死给分的飞机(就是普通飞机),另一种就是打死有奖励的敌人.他们都应该是飞行物的子类,我们也可以为普通飞机和给奖励的敌人设一个接口让他们去实现接口,这样有利于以后的扩展,我在这里给的简化版的飞机大战,主要是为了让大家了解面向对象. 第一步建立飞行物类 impor

  • java实现飞机大战案例详解

    前言 飞机大战是一个非常经典的案例,因为它包含了多种新手需要掌握的概念,是一个非常契合面向对象思想的入门练习案例 程序分析: 在此游戏中共有六个对象: 小敌机Airplane,大敌机BigAirplane,小蜜蜂Bee,天空Sky,英雄机Hero,子弹Bullet 其次我们还需要三个类: 超类Flyer,图片类Images,测试类World 还需: 英雄机2张,小敌机,大敌机,小蜜蜂,子弹,天空各1张,爆炸图4张,游戏开始,暂停,游戏结束各1张,共14张图片放入与图片类Images同包中 超类F

  • Java实现飞机航班管理系统的思路详解

    学习Java实现飞机航班管理系统,本文有该系统的功能截图,和数据库设计SQL语句供大家参考 1.飞机航班管理系统背景 本系统模拟飞机航班管理业务开发. 2.飞机航班管理系统技术架构 主要技术 Spring.SpringMVC.Mybatis JSP.JSTL.jQuery.HTML.CSS.JS Mysql bootstrap 开发工具和环境 Eclipse Maven Tomcat 7 JDK 1.8 Mysql 5.6 Win10 操作系统 3.飞机航班管理系统数据库设计 CREATE TA

  • java实现飞机游戏代码

    本文实例为大家分享了java实现飞机游戏的具体代码,供大家参考,具体内容如下 MyGameFrame类: 主要的调用类 package sc.wh.game; import javax.swing.JFrame; import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import sc.wh.game.*; impor

  • Java实现打飞机小游戏(附完整源码)

    写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习.java确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop面向对象编程的过程,纯属娱乐.代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习. 效果如下 完整代码 敌飞机 import java.util.Random; 敌飞机: 是飞行物,也是敌人 public class Airplane extends FlyingObject implements Enemy

  • 微信游戏打飞机游戏制作(java模拟微信打飞机游戏)

    复制代码 代码如下: package com.beancore.ui; import java.awt.BorderLayout;import java.awt.Container;import java.awt.Dimension;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.IOException;import java

  • Java实现飞机大战-连接数据库并把得分写入数据库

    编写飞行物类 package com.tarena.shoot; import java.awt.image.BufferedImage; /** * 飞行物(敌机,蜜蜂,子弹,英雄机) */ public abstract class FlyingObject { protected int x; protected int y; protected int width; protected int height; protected BufferedImage image; protecte

  • java实现抖音飞机大作战

    本文实例为大家分享了java抖音飞机大作战的具体代码,供大家参考,具体内容如下 Airplane.java package zmf.game.shoot; import java.util.Random; /** * @author jcf * @Description: Airplane----敌机既是飞行物 * @date 2018-03-28 11:17:16 */ public class Airplane extends FlyingObject implements Enemy{ /

  • Java实现飞机大战游戏 附完整源码

    目录 飞机大战详细文档 实现效果: 结构设计 详细分析 Main界面类使用边框布局,给面板分三个区,如图所示 绘制背景地图 飞行道具类UML图 绘制线程: 如何让我们的游戏动起来 背景的绘制 我的飞机的绘制 移动线程 如何控制我的飞机移动? 敌方飞机线程 : 如何生成敌方飞机呢? 敌方子弹线程 : 使每一个敌方飞机开火 检测碰撞线程 : 在子弹与敌机碰撞时,移除敌机 其他功能:显示玩家hp,掉落道具,得分,升级,更换地图 飞机大战详细文档 文末有源代码,以及本游戏使用的所有素材,将plane2文

  • 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实现飞机大战小游戏

    本文实例为大家分享了java实现飞机大战游戏的具体代码,供大家参考,具体内容如下 MyPanel类 package  P; import java.awt.Font; import java.awt.Graphics; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.u

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

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

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

    本文实例为大家分享了Java实现简单飞机大战游戏,敌机下落的具体代码,供大家参考,具体内容如下 在实现这个游戏之前,我们首先需要知道项目可能要用到哪些知识点: 重绘,线程,双缓冲,数据结构的应用 差不多是这大概有这些,如果不够的话我们再加.首先,我们应该实现敌机下落,在这里大概思路和利用线程使小球下落差不多.不同的是,我在这里用到了三种敌机,分别为小.大.BOSS机三种.然后给予这三种敌机不同的下落规则(即速度.出现的时间.是否伴随子弹的发射等等)来给游戏适当的增加点难度. 以下是我的大概设计思

  • Java实现简单的飞机大战游戏(控制主飞机篇)

    本文实例为大家分享了Java实现简单的飞机大战游戏,控制主飞机的具体代码,供大家参考,具体内容如下 接着上一篇:Java实现简单的飞机大战游戏(敌机下落篇),首先我们需要明白,在控制一架飞机的时候,需要通过对键盘的监听.上下左右比较简单,因为是对单一按键的监听,在这里我们可以通过switch语句,通过读取键盘上每个按键的ASCII值.但是如果想要实现边飞行边发射子弹,又或者是实现斜飞怎么办?这里就需要通过对多个按键的监听.解决的方法是:单一的方向控制我们还是使用switch语句,但是如果牵扯到2

  • Python3实现飞机大战游戏

    本文实例为大家分享了Python3实现飞机大战游戏的具体代码,供大家参考,具体内容如下 1.主程序:plane_main.py import pygame from plane_sprites import * class PlaneGame(object): #飞机大战主游戏类 def __init__(self): print("游戏初始化") #1.创建游戏的窗口 self.screen = pygame.display.set_mode(SCREEN_RECT.size) #2

  • js实现飞机大战游戏

    本文实例为大家分享了js实现飞机大战游戏的具体代码,供大家参考,具体内容如下 CSS部分的代码: <style> * { margin: 0px; padding: 0px; } canvas{ border: 1px solid #000; display: block; margin: auto; } </style> JavaScript代码: <!-- 先创建一个画布 --> <canvas id="canvas" width=&quo

  • Java实现飞机小游戏

    本文实例为大家分享了Java实现飞机小游戏的具体代码,供大家参考,具体内容如下 该小游戏使用java语言实现,使用工具idea. 共写9个类 Constant:Explode:GameObject:GameUtil:Plane:Shell:image:images:Plan: 本文实例为大家分享了vue + element ui实现锚点定位的具体代码,供大家参考,具体内容如下 1,Constant:专门放常量 package com.game2; //专门放常量的一个类 public class

随机推荐