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.util.ArrayList;
import java.util.List;

import javax.sql.RowSetInternal;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
//xx.2
//创建面板类,继承面板,实现移动监听事件
public class MyPanel extends JPanel implements MouseMotionListener {
    //private ImageIcon bjImage = new ImageIcon("img/bj.png");
    
    //英雄机图片
    private ImageIcon heroImage = new ImageIcon("img/头.png"); 
    
    //显示logo
    //private ImageIcon logoImage = new ImageIcon("img/头.png");
    
    //英雄机的宽高
    private int width = heroImage.getIconWidth();
    private int height = heroImage.getIconHeight();
    
    //英雄机的坐标
    private int x=180;
    private int y=880;
    
    //创建一个敌机的集合,用于展示多个敌机
    List<Enemy> enemys = new ArrayList<>();
    //存储子弹集合
    List<Bullet> bullets = new ArrayList<>();
    //存储爆炸对象集合
    List<Bomb> bombs = new ArrayList<>();    
    //存储英雄机爆炸集合
    List<HeroDead> heroDeads = new ArrayList<>();
    
    private int number;//统计当前得分
    private int m;//统计剩余血条量
    
//    MyPanel jp = new MyPanel() {
//        {
//            setBackground(Color.gray);// 设置面板背景颜色
//        }

    
    
    public MyPanel() {
        //在构造方法中准备10个敌机
        for(int i=0;i<10;i++){
            enemys.add(new Enemy());
        }
    }
    
    @Override
    public void paint(Graphics g) { //用于绘制图片区域
        super.paint(g);
        
        //在窗口左侧展示打飞机得分
        //设置字体: 参数1:字体家族, 参数2:字体样式:加粗   参数3:字体大小
        g.setFont(new Font("宋体", Font.BOLD, 30));
        g.drawString("当前得分:"+number, 5, 30);
        g.drawString("发量(万根):"+(5-m), 5, 80);
        //g.drawImage(null, x, y, getBackground(), getFocusCycleRootAncestor());
        
        //绘制英雄机图片  参数1,图片  参数2和3:坐标
        g.drawImage(heroImage.getImage(), x, y, null);
        
        //g.drawImage(logoImage.getImage(), 19, 22, null);
        
        //在绘图中显示10辆敌机
        for(int i=0;i<enemys.size();i++){
            Enemy enemy =  enemys.get(i);  //获取敌机对象
            enemy.drawImage(g);     //然后分别展示
        }
        
        //展示子弹集合的图片
        for (int i = 0; i < bullets.size(); i++) {
            Bullet bullet = bullets.get(i);  //取出子弹对象
            bullet.drawImage(g);
        }
        
        //展示爆炸集合的图片
        for(int i=0;i<bombs.size();i++){
            Bomb bomb = bombs.get(i);
            bomb.drawImage(g);
        }
        
        //展示英雄机的销毁图片
        for(int i=0;i<heroDeads.size();i++){
            HeroDead heroDead = heroDeads.get(i);
            heroDead.drawImage(g);
        }
        
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        //System.out.println("鼠标移动并拖拽触发");
        
        //鼠标拖拽时,需要将英雄机也带着移动(只需改变x轴和y轴)
        x = e.getX()-width/2;  //英雄机的移动,随着鼠标触发移动的
        y = e.getY()-height/2;  //鼠标指定到英雄机中间位置
        
        repaint();  //重新绘制图片
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        //System.out.println("鼠标移动的触发..");
        
        //鼠标移动时,需要将英雄机也带着移动(只需改变x轴和y轴)
        x = e.getX()-width/2;  //英雄机的移动,随着鼠标触发移动的
        y = e.getY()-height/2;  //鼠标指定到英雄机中间位置
        
        repaint();  //重新绘制图片
    }

    //L-4. 创建子弹类Bullet,操作与敌机类类似
    public void init() {
        //定义一个标记,循环了自定义的次数后,才去添加,这样子弹数量会变少
        int flag = 0;
        while(true) { //循环地跑,模拟依次移动的效果
            flag++;  //
            if(flag==50) {  //控制子弹数量
                
              bullets.add(new Bullet(x+width/2, y)); //就是从英雄级的x,y轴位置发射子弹的
             
              flag=0;  //又回到0,依次计算15次
              //System.out.println("子弹数量:"+ bullets.size());
            }
                        
            //展示子弹,让子弹飞起来
            for(int i=0;i<bullets.size();i++) {
                 Bullet bullet = bullets.get(i);  //取出对象
                 if(i%2!=0)//设置子弹左右发射
                 bullet.move();  
                 else
                 bullet.move1();//移动子弹位置
                 
                 
                 //如果子弹移动到y轴为0,则移除掉
                 if(bullet.getY()<0){
                     bullets.remove(bullet);  //移除子弹对象
                 }
            }

            //xx.3.
            //敌机循环移动..
            for(int i=0;i<enemys.size();i++) {
                Enemy en = enemys.get(i);
                en.move();  //循环地移动每一架敌机y轴位置
                
                
                //超出屏幕范围后,需要移除,并重新添加一个对象
                if(en.getY()>GameMain.HEIGHT) {
                    //int count1=enemys.size();
                    enemys.remove(en);   //移除对象
                    
                    enemys.add(new Enemy());  //重新再创建对象
                }
                
            //L 3-4    
                //在敌机的循环中,再继续循环子弹; 需要判断是否有子弹和敌机重叠了,
                //则移除敌机对象,重新添加,移除子弹;如果有则添加爆炸对象
                for(int j=0;j<bullets.size();j++){
                    Bullet bu = bullets.get(j);
                    if(isHit(en,bu)){ //碰撞的判断
                        enemys.remove(en);  //移除敌机,并重新new一个
                        enemys.add(new Enemy());
                        
                        bullets.remove(bu);  //移除子弹
                        
                        //添加的爆炸位置和敌机位置一致
                        bombs.add(new Bomb(en.getX(), en.getY()));
                        
                        number += 10; //爆炸后,累加得分
                    }
                }

                //zz-6
                //判断英雄机与敌机的碰撞(英雄机的消亡)
                if(isHit(en)){
                    System.out.println("进入英雄机爆炸...");
                    //敌机的对象移除
                    enemys.remove(en);
                    
                    //英雄机爆炸图片位置应该与英雄机重叠
                    heroDeads.add(new HeroDead(x, y));

                    for(m=0;m<=heroDeads.size();m++) {
                        while(heroDeads.size()==5) {
                            return; 
                        }
                    }
                      //游戏结束,跳出死循环
                }
            }

            //L-5
            //将爆炸的所有对象,过一段时间则干掉
            for(int i=0;i<bombs.size();i++){
                Bomb bomb = bombs.get(i);
                bomb.move();  //计算次数,统一循环多少次后,再干掉
                
                if(bomb.getCount()>6){
                    bombs.remove(bomb);  //在循环的一定范围后,可以移除爆炸了
                }
            }
            
            //xx.2
            //每次的移动都需要停顿一下
            try {
                Thread.sleep(6);    //单位:毫秒  睡眠6毫秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            } 
            
            repaint();  //重新绘制图片
        }
    }

    
    
    
     //zz-6
     //英雄机与敌机的碰撞
    private boolean isHit(Enemy en) {
        //英雄机的碰撞区域
        Rectangle rect = new Rectangle(x, y, width, height);
        //碰撞点的位置,是在敌机的中心点
        Point point = new Point(en.getX()+en.getWidth()/2, en.getY()+en.getHeight()/2);
        
        return rect.contains(point);
    }

    
    
    //L-5
    private boolean isHit(Enemy en, Bullet bu) {
        //填充敌机的碰撞区域
        Rectangle rect = new Rectangle(en.getX(), en.getY(), en.getWidth(), en.getHeight());
        //将子弹的位置设置在中间
        Point point = new Point(bu.getX()+bu.getWidth()/2, bu.getY()+bu.getHeight()/2);
        //如果位置有重叠,返回true
        return rect.contains(point);
    }
}

HeroDead类

package  P;

import java.awt.Graphics;

import javax.swing.ImageIcon;

public class HeroDead {
    private ImageIcon heroImage = new ImageIcon("img/爆炸.gif");
    private int width = heroImage.getIconWidth();
    private int height = heroImage.getIconHeight();
    private int x;
    private int y;
    
    
    
    public ImageIcon getHeroImage() {
        return heroImage;
    }

    public void setHeroImage(ImageIcon heroImage) {
        this.heroImage = heroImage;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public HeroDead(int x,int y){
        this.x=x;
        this.y=y;
    }

    public void drawImage(Graphics g) {
        g.drawImage(heroImage.getImage(), x, y, null);
    }
}

GameMain类

package  P;

import java.awt.Color;

import javax.swing.BorderFactory;
import javax.swing.JFrame;

//游戏入口类
public class GameMain {
    static final int WIDTH = 860;  //设置静态常量,作为状态值使用
    static final int HEIGHT = 660;
    public static void main(String[] args) {
        JFrame jFrame = new JFrame();  //实例化顶级窗口类
        jFrame.setSize(WIDTH, HEIGHT);  //设置宽高像素
        jFrame.setTitle("小秃头历险记");  //设置标题
        jFrame.setLocationRelativeTo(null);  //设置居中效果
        //JFrame.EXIT_ON_CLOSE: 状态值  3
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口的同时,把程序关闭
        

        //在窗口中,加入面板
        MyPanel pl = new MyPanel();
        pl.setBackground(Color.pink);
        pl.setBorder(BorderFactory.createLineBorder(Color.cyan, 3));
        jFrame.add(pl);  //添加面板组件
        jFrame.addMouseMotionListener(pl);  //添加鼠标移动事件  
        
        jFrame.setVisible(true);  //使窗口可视化
        
        pl.init();  //在面板中循环将组件跑起来
    }
}

Enemy类

package  P;

import java.awt.Graphics;
import java.util.Random;

import javax.swing.ImageIcon;

//创建敌机类
public class Enemy {
    //创建敌机图片,宽高,坐标等属性
    private ImageIcon enemyImage = new ImageIcon("img/错误.png");
    
    private int width = enemyImage.getIconWidth();
    private int height = enemyImage.getIconHeight();
    
    private int x;
    private int y;
    
    public ImageIcon getEnemyImage() {
        return enemyImage;
    }

    public void setEnemyImage(ImageIcon enemyImage) {
        this.enemyImage = enemyImage;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public Enemy(){
        //创建随机类,在窗口宽高范围内随机
        Random random = new Random();
        //随机出来的敌机位置可以显示一半图片
        x = random.nextInt(GameMain.WIDTH-width/2);
        y = -random.nextInt(GameMain.HEIGHT-height/2);  //初始敌机位置为负数
    }

    public void drawImage(Graphics g) {
        //绘制敌机图片
        g.drawImage(enemyImage.getImage(), x, y, null);
    }

    public void move() {
        y +=2;  //控制y轴速度
    }
}

Bullet类

package  P;

import java.awt.Graphics;

import javax.swing.ImageIcon;

//创建子弹类
public class Bullet {
    //创建属性,子弹图片,宽高,位置
    private ImageIcon bulletImage = new ImageIcon("img/aaa.gif");
    
    private int width = bulletImage.getIconWidth();
    private int height = bulletImage.getIconHeight();
    
    private int x;
    private int y;
    
    public ImageIcon getBulletImage() {
        return bulletImage;
    }

    public void setBulletImage(ImageIcon bulletImage) {
        this.bulletImage = bulletImage;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public Bullet(int x,int y) { //x,y轴位置从外面传入(等于英雄级的位置)
        this.x = x;
        this.y = y;
    }

    public void drawImage(Graphics g) {
        g.drawImage(bulletImage.getImage(), x, y, null);
    }

    public void move() {
        x-=1;
        y -= 2;  //让子弹y轴从下往上递减
    }
    public void move1() {
        x+=1;
        y -= 2;  //让子弹y轴从下往上递减
    }
}

爆炸类bomb类

package P;

import java.awt.Graphics;

import javax.swing.ImageIcon;

//创建爆炸的实体了
public class Bomb {
    //爆炸的图片,宽高,位置属性
    private ImageIcon bombImage=new ImageIcon("img/zz.png");
    private int width = bombImage.getIconWidth();
    private int height = bombImage.getIconHeight();
    private int x;
    private int y;
    
    private int count;  //记录多少次数后爆炸
    
    public ImageIcon getBombImage() {
        return bombImage;
    }

    public void setBombImage(ImageIcon bombImage) {
        this.bombImage = bombImage;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public Bomb(int x,int y){
        this.x = x;
        this.y = y;
    }

    public void drawImage(Graphics g) {
        g.drawImage(bombImage.getImage(), x, y, null);
    }

    public void move() {
        count++;
    }
    
}

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

(0)

相关推荐

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

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

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

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

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

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

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

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

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

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

  • 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实现飞机大战-连接数据库并把得分写入数据库

    编写飞行物类 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实现飞机大战 用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实现飞机大战-II游戏详解

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

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

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

随机推荐