飞机大战源码(Java)

《飞机大战》这款小游戏相信许多朋友早就已经玩过,但这个游戏是如何编写的呢,本文为大家介绍一下用Java如何编写飞机大战游戏,仅供参考。

源码链接:https://mp.weixin.qq.com/s/XTahERdKZW1ZzwOu_Yz0tQ

1.首先建立模板类,创建敌机和子弹模板,方便创建对象

敌机模板类Dj.java代码:

package model;

import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;

public class Dj {
    int x,y;
    String icon;
    
    public Dj(String icon) { //参数为敌机图片路径
        this.icon=icon;
        x=(int)(Math.random()*360)+10; //随机生成x坐标
        y=-30;
     }
    
    //画敌机
    public void drawPlane(Graphics g) {
        Image plane=new ImageIcon(icon).getImage();
        g.drawImage(plane, x-15, y-15, null);

    }

    //x,y的get和set方法
    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;
    }

}

子弹模板类Zd.java代码:

package model;

import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;

public class Zd {
    int x, y;

    //构造方法
    public Zd(int a, int b) { //参数为英雄机坐标
        
        this.x=a;
        this.y=b;
        
    }
    
    //画子弹
    public void drawZd(Graphics g) {
        Image zd=new ImageIcon("src/images/bullet_7.png").getImage();
        g.drawImage(zd, x-19, y-80, null);

    }

    //x,y的get和set方法
    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;
    }

}
  1. 创建碰撞判断类Crash

Crash类代码:


package model;

public class Crash {

    // 判断子弹和敌机碰撞
    public boolean Boom(Zd z, Dj d) {
        int zx, zy, dx, dy;
        boolean crash = false;

        //子弹坐标
        zx = z.getX();
        zy = z.getY();
        
        //敌机坐标
        dx = d.getX();
        dy = d.getY();

        if (dx < zx && zy - dy < 30 && dx + 30 > zx) {
            crash = true; //如果相撞返回真值

        }
        return crash;

    }

    //飞机相撞
    public boolean Boom2(Dj d, int x, int y) {
        int dx, dy;
        boolean crash = false;
        
        //敌机坐标
        dx = d.getX();
        dy = d.getY();
        
        //英雄机坐标
        x = x - 50;
        y = y - 80;

        //相撞条件
        if (dx > x+20 && y - dy < 20 && dx < x + 60) {
            crash = true; //如果相撞返回真值

        }
        return crash;

    }

}
  1. 创建画布类GamePanel

在画布类中创建敌机和子弹模板对象,并在画布上画出来,在新线程循环中改变坐标重画使其移动,获取鼠标坐标画出英雄机,循环遍历子弹和敌机集合,调用Crash类中的方法判断是否相撞,具体内容请参见代码注释。

画布类GamePanel.java代码


package panel;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

import model.Crash;
import model.Dj;
import model.Zd;

public class GamePanel extends JPanel implements MouseMotionListener, MouseListener {
    /**
     * 
     */
    private static final long serialVersionUID = 1682690307762671162L;
    int bx, by, x, y, dx, dy, score = 0,count=0,state; //背景坐标bx,by,英雄机坐标x,y,敌机坐标dx,dy,分数score,计数器count,运行状态state
    Image bg; //背景图
    boolean db = false; //敌机爆炸图片绘图开关
    List<Zd> zd = new ArrayList<Zd>(); //存储子弹对象
    List<Dj> dj = new ArrayList<Dj>(); //存储敌机对象
    
    //运行状态常量
    public static final int START=1;
    public static final int RUNNING=2;
    public static final int PAUSE=3;
    public static final int OVER=4;

    //构造方法
    public GamePanel() {
        state=START;
        bx = 0;
        by = -5350;
        bg = new ImageIcon("src/images/background_1.png").getImage();

    }

    //重写paint方法
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        if(state==RUNNING){
            String sc = "分数:" + String.valueOf(score);
            g.drawImage(bg, bx, by, null); //画出背景
            g.drawRoundRect(0, 0, 120, 30, 5, 5); //分数框
            g.setFont(new Font("TimesRoman", Font.BOLD, 24));
            g.setColor(Color.RED);
            g.drawString(sc, 2, 20); //画出分数

            Image hero = new ImageIcon("src/images/plane_2.png").getImage(); 
            g.drawImage(hero, x - 50, y - 80, null);  //画出英雄机

            if (db) { //在敌机爆炸时画出爆炸图片
                Image boom = new ImageIcon("src/images/boom1.png").getImage();
                g.drawImage(boom, dx, dy, null);
                db = false;
            }

            for (int i = 0; i < zd.size(); i++) {
                zd.get(i).drawZd(g);  //画出所有子弹

            }

            for (int j = 0; j < dj.size(); j++) {
                dj.get(j).drawPlane(g); //画出所有敌机

            }
        }else if(state==START){ //开始界面
            Image start=new ImageIcon("src/images/start.png").getImage();
            g.drawImage(start, 0, 0, 400, 650, null);
        }else if(state==OVER){ //结束界面
            Image over=new ImageIcon("src/images/over.png").getImage();
            g.drawImage(over, 0, 0, 400, 650, null);
        }else if(state==PAUSE){ //暂停界面
            Image pause=new ImageIcon("src/images/pause.png").getImage();
            g.drawImage(pause, 0, 0, 400, 650, null);
        }
        

    }

    // 移动类
    public void Move() {
        new Thread() {
            @Override
            public void run() {
                super.run();
                
                while (true) {
                    if(state==RUNNING){
                        
                        // 背景移动
                        count++;
                        by += 2;
                        if (by > 0) {
                            by = -5350;
                            bg = new ImageIcon("src/images/background_2.png").getImage();
                        }

                        // 创建子弹
                        if (count % 3 == 0) {
                            zd.add(new Zd(x, y));
                        } 
                        for (int a = 0; a < zd.size(); a++) {
                            zd.get(a).setY(zd.get(a).getY() - 30); //改变子弹坐标,使子弹移动
                            if (zd.get(a).getY() < 0) { //判断子弹越界
                                zd.remove(a);

                            }
                        }

                        // 创建敌机
                        if (count % 21 == 0) {
                            dj.add(new Dj("src/images/e4.png"));
                        }else if (count % 31 == 0) {
                            dj.add(new Dj("src/images/e5.png"));
                        }else if (count % 41 == 0) {
                            dj.add(new Dj("src/images/e6.png"));
                        }
                        for (int b = 0; b < dj.size(); b++) {
                            dj.get(b).setY(dj.get(b).getY() + 3); //改变敌机坐标,使敌机移动
                            if (dj.get(b).getY() > 650) { //判断敌机越界
                                state=OVER; //游戏结束

                            }

                        }

                        // 子弹和敌机碰撞
                        Crash crash = new Crash();
                        for (int j = 0; j < zd.size(); j++) {
                            Zd z = zd.get(j);
                            for (int i = 0; i < dj.size(); i++) {
                                Dj d = dj.get(i);
                                if (crash.Boom(z, d)) { //调用Crash对象的Boom方法判断是否相撞
                                    score += 2; //分数加2
                                    dx = dj.get(i).getX(); //敌机坐标
                                    dy = dj.get(i).getY();
                                    db = true; //敌机爆炸
                                    dj.remove(i); //从集合中删除敌机
                                    zd.remove(j); //从集合中删除子弹
                                    break;
                                }
                            }
                        }
                        
                        //判断飞机相撞
                        for (int i = 0; i < dj.size(); i++) {
                            Dj d = dj.get(i);
                            if (crash.Boom2(d, x, y)) {
                                dx = dj.get(i).getX();
                                dy = dj.get(i).getY();
                                db = true;
                                state=OVER; //游戏结束
                            }
                        }
                    }

                    
                    repaint(); //重画
                    try {
                        Thread.sleep(20); //线程休眠
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

    //鼠标点击事件
    @Override
    public void mouseClicked(MouseEvent e) {
        if(state==START||state==PAUSE){
            state=RUNNING;
        }else if (state==RUNNING){
            state=PAUSE;;
        }else if(state==OVER){
            
            //重新开始后初始化参数值
            state=RUNNING;
            score=0;
            count=0;
            bx = 0;
            bg = new ImageIcon("src/images/background_1.png").getImage();
            by = -5350;
            zd = new ArrayList<Zd>();
            dj = new ArrayList<Dj>();
            
        }

    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO 自动生成的方法存根

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO 自动生成的方法存根

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO 自动生成的方法存根

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO 自动生成的方法存根

    }

    @Override
    public void mouseDragged(MouseEvent e) {
        // TODO 自动生成的方法存根

    }

    @Override
    public void mouseMoved(MouseEvent e) {
        x = e.getX(); //动态获取鼠标的坐标值
        y = e.getY();

    }

}
  1. 创建游戏主线程和游戏窗口,把画布加入窗口,注册监听器

窗口类Game.java代码如下:


package frame;

import javax.swing.JFrame;

import panel.GamePanel;

public class Game {

    public static void main(String[] args) {
        JFrame j = new JFrame(); //创建窗口
        GamePanel g = new GamePanel(); //创建画布
        j.add(g); //添加画布
        j.setSize(400, 650);
        j.setTitle("PlaneWar"); //设置标题
        j.setLocationRelativeTo(null); //设置居中
        j.setDefaultCloseOperation(3); //默认关闭
        j.setVisible(true); //窗口可见性
        g.Move(); //调用Move方法
        j.addMouseListener(g); //添加监听器
        j.addMouseMotionListener(g);

    }

}

以上是关于“Java如何写出飞机大战游戏”的全部内容,其实学习Java不仅仅要有理论的基础,更要有实战的操作,搭配一些视频教程来学习,一定会遇见更优秀的自己。

  • Java视频教程 +2833142073 领取

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
关注千问千知公众号(qwqz1000),了解更多技术文章
在这里插入图片描述

  • 23
    点赞
  • 163
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
package cn.feike.shoot; import java.awt.Graphics; import java.awt.image.BufferedImage; public abstract class FlyingObject { protected double x;//物体的x坐标 protected double y;//物体的y坐标 protected double width;//物体的宽 protected double heigth;//物体的高 protected BufferedImage image;//当前正在显示的图片 protected int index = 0;//图片数组下标序号,子类中使用 protected double step;//飞行物每次(1/24秒)移动的距离 protected int life;//命 protected int state;//飞行物的状态 public static final int ACTIVE=0;//活着状态 public static final int DEAD=1;//死亡状态 public static final int REMOVE=2;//回收状态 //默认构造器 public FlyingObject() { life = 1; state = ACTIVE; } //有参构造器 public FlyingObject(double width,double heigth){ this();//调用无参数的构造器,必须写在第一行. this.x = (int)(Math.random()*(480-width)); this.y = -heigth; this.width = width; this.heigth = heigth; step = Math.random()*3+0.8;//初始化step为[0.8,3.8)之间的数 } //重写toString方法 public String toString() { return x+","+y+","+width+","+heigth+","+image; } //重写paint,方便子类对象的使用 public void paint(Graphics g) { g.drawImage(image, (int)x, (int)y, null);//绘制图片 } //飞行物移动的move方法 /** * 重构了move,方法实现播放销毁动画功能 */ public void move(){ if(state == ACTIVE){ y += step; return ; } if(state == DEAD){ //从子类对象中获取下一张照片 BufferedImage img = nextImage(); if(img == null){ state = REMOVE;//没有照片则回收 }else{ image = img;//否则把子类的图片传给image } //越界则销毁 if(y>=825){ state = REMOVE; } } } /** * 子类中必须有的方法,返回下一个要播放的照片引用, * 如果返回null表示没有可播放的照片了. */ protected abstract BufferedImage nextImage(); /** * 飞行物被打了一下 */ public void hit(){ if(life>0){ life--; } if(life==0){ state = DEAD; } } /** * 碰撞检测的方法 * 检测物体的位置是否在碰撞的范围内. * (子弹是否在飞行物的碰撞范围内) */ public boolean duang(FlyingObject obj){ //this(x,y,w,h) //obj(x,y,w,h) double x1 = this.x - obj.width; double x2 = this.x + this.width; double y1 = this.y - obj.width; double y2 = this.y + this.heigth; return x1<obj.x&&obj;.x<x2&&y1;<obj.y&&obj;.y<y2; } /** 重构FlyingObject,添加了状态检查方法 */ /** 检查飞行物死了吗 */ public boolean isDead(){ return state == DEAD; } /** 检查飞行物是否活动的 */ public boolean isActive(){ return state == ACTIVE; } /** 检查飞行是否可以被删除*/ public boolean canRemove(){ return state == REMOVE; } /** 飞行物添加"去死"方法*/ public void goDead(){ if(isActive()){ state = DEAD; } } }
Java飞机大战游戏是一款飞行射击游戏,数据库设计是为了管理和存储游戏中的用户数据、游戏进度、记录和排行榜等信息。 首先,我们需要设计一个用户表来存储用户的基本信息,如用户名、密码、等级、经验等。这样可以方便用户注册、登录和管理。 其次,我们可以设计一个游戏进度表,用于保存用户的游戏进度,包括击败的敌人数量、当前关卡、得分等。这样用户可以随时保存和加载游戏进度。 另外,我们还可以设计一个记录表,用于记录用户的游戏记录,包括玩家的得分、用时、击败的敌人数量等。这样可以为玩家提供对比和分享的机会。 最后,我们还可以设计一个排行榜表,用于保存玩家的排名和成绩。可以根据得分或者击败敌人的数量进行排序,并在游戏界面中展示给其他玩家。 在数据库设计中,需要注意使用合适的数据类型和约束来确保数据的完整性和一致性。同时,还需要考虑数据库的性能和扩展性,选择合适的索引和优化查询语句,以提高游戏的运行效率。 总的来说,Java飞机大战游戏的数据库设计需要包括用户表、游戏进度表、记录表和排行榜表,这些表可以保存用户的基本信息、游戏进度、记录和排名,为用户提供更好的游戏体验。同时,需要考虑数据的完整性和一致性,以及数据库的性能和扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值