欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

小游戏——飞机大战java实现

程序员文章站 2024-03-18 14:45:34
...

话不多说,先来看看效果图
小游戏——飞机大战java实现
小游戏——飞机大战java实现
这个java实现的飞机大战小游戏可以用鼠标控制飞机的移动也可以使用键盘控制上下左右
在不同的分数段,飞机的子弹也不一样,不过击杀每个飞机的分数是一样,你可以自己修改每个飞机的分数
如果只想要素材,不要代码的可以到这里去拿:https://download.csdn.net/download/liang13654/12609460

我使用的是IDEA软件,你需要在src下新建两个包,img和ui(当然,这两个包的名字可以随便命名),然后把素材放到img里
接下来就是部分代码了
peizhi.java

package ui;

import java.awt.image.BufferedImage;

public class peizhi {
    //窗口名字
    public static String NAME= "飞机大战";
    //背景图片路径
    public static String  img="/img/bg1.jpg";
    //我方飞机图片路径
    public static String  img2="/img/wo.png";
    //敌方飞机图片路径1
    public static String  di1="/img/di1.png";
    //敌方飞机图片路径2
    public static String  di2="/img/di2.png";
    //我方飞机子弹图片路径1
    public static String  zi="/img/wozi.png";
    //爆炸效果的图片路径1
    public static String  bao="/img/bao.png";
    //爆炸效果的音效路径1
    //public static String  bomb="/src/img/bomb.wav";
    //窗口宽度
    public static int Width=600;
    //窗口高度
    public static int Height=800;
}

在paizhi有爆炸效果图以及音效,不过我没有搞这个,如果有兴趣的话你们可以搞搞
Hero.java`

package ui;

import java.awt.image.BufferedImage;

//我方飞机
public class Hero extends Fly{
    int hp;
    public Hero(){
        //确定游戏开始时,显示我方飞机的图片
        img=App.getImge(peizhi.img2);
        //确定我方飞机的大小
        w=img.getWidth();
        h=img.getHeight();
        //确定我方飞机在游戏开始时的位置
        x=(peizhi.Width-w)/2;
        y=peizhi.Height-h*2;
        //游戏开始时我方飞机的血量
        hp=3;
    }
    //让飞机移动到鼠标位置上的方法
    public void moveToMouse(int mx,int my){
        x=mx-w/2;
        y=my-h/2+10;
    }
    //上
    public void moveUp(){
        y-=10;
        if(y<0){
            y=0;
        }
    }
    //下
    public void moveDown(){
        y+=10;
        if(y>(peizhi.Height-h*3/2)){
            y=peizhi.Height-h*3/2;
        }
    }
    //左
    public void moveLeft(){
        x-=10;
        if(x<0){
            x=0;
        }
    }
    //右
    public void moveRight(){
        x+=10;
        if(x>(peizhi.Width-w-15)){
            x=peizhi.Width-w-15;
        }
    }
}

Ep.java

package ui;

import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Ep extends Fly {
    //敌机速度
    int sp;
    int hp;
    //构造器:给敌机定型
    public Ep(){
        //定义随机数
        Random rd=new Random();
        //生成随机数来选取图片
        int index=rd.nextInt(4)+1;
        hp=index;
        //确定敌机显示的图片
        img=App.getImge("/img/di"+index+".png");
        //确定敌机的大小
        w=img.getWidth();
        h=img.getHeight();
        //确定敌机的位置
        x=rd.nextInt(peizhi.Width-img.getWidth());
        y=-h;
        if(index==1){
            sp=10;
        }else if(index==2){
            sp=15;
        }else if (index==3){
            sp=20;
        }else if (index==4){
            sp=25;
        }
        //所有的类型都默认继承自Object
        /*List obj=new ArrayList();
        obj.add("123");
        obj.add(12);
        obj.add(true)*/;
    }
    //敌机移动
    public void move() {
        y+=sp;
    }

    public boolean shootBy(Fire f) {
        boolean hit=x<=f.x+f.w &&
                    x>=f.x-w &&
                    y<=f.y+f.h &&
                    y>=f.y-h;
        return hit;
    }

    public boolean hitBy(Hero f) {
        boolean hit=x<=f.x+f.w &&
                x>=f.x-w &&
                y<=f.y+f.h &&
                y>=f.y-h;
        return hit;
    }
}

Fire.java

package ui;

public class Fire extends Fly{
    //子弹当前移动的方向
    int dir;//dir=0:左上角; dir=1:垂直; dir=2:右上角
    public Fire(int hx,int hy,int dir){
        //确定子弹的图片
        img=App.getImge(peizhi.zi);
        //确定子弹的大小
        w=img.getWidth();
        h=img.getHeight();
        //子弹的初始位置
        x=hx+50;
        y=hy-20;
        this.dir=dir;
    }
    //子弹移动
    public void move() {
        if(dir==0){
            x-=2;
            y-=10;
        }else if(dir==1){
            y-=10;
        }else if (dir==2){
            x+=2;
            y-=10;
        }
    }
}

GamePanel.java

package ui;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

//游戏面板
public class GamePanel extends JPanel {
    //定义背景图
    BufferedImage bg;//背景图
    //创建我方飞机
    Hero hero=new Hero();
    //创建敌机大本营
    List<Ep> eps=new ArrayList<Ep>();
    //创建敌机
    //Ep ep=new Ep();
    //创建我方飞机的弹药库
    List<Fire> fs=new ArrayList<Fire>();
    //定义分数
    int score;
//    bao b=new bao();
//    boolean abc=true;
    //设置游戏的开关
    boolean gameover;//默认开始时gameover为false
    public void action(){
        //创建并启动一个线程,固定格式
        new Thread(){
            public void run(){
                //写死循环,使游戏可以一直运行
                while (true){
                    if(!gameover){
                        //调用敌机入场的方法
                        epEnter();
                        //敌机移动
                        epMove();
                        //发射子弹
                        shoot();
                        //子弹移动
                        fireMove();
                        //判断子弹是否打到敌机
                        shootEp();
                        //判断两方飞机是否相撞
                        hit();
                    }
                    //每执行一次,休息一会儿
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //刷新界面
                    repaint();
                }
            }
        }.start();
    }
    //是否相撞
    private void hit() {
        //遍历敌机
        for (int i = 0; i <eps.size() ; i++) {
            //获取敌机
            Ep e=eps.get(i);
            //如果敌机相撞
            if(e.hitBy(hero)){
                //删除敌机
                eps.remove(e);
                hero.hp--;
                score+=1;
                if(hero.hp==0){
                    gameover=true;
                }
            }
        }
    }
    //判断子弹是否打到敌机
    private void shootEp() {
        //先遍历所有子弹
        for (int i = 0; i <fs.size() ; i++) {
            //获取每一颗子弹
            Fire f=fs.get(i);
            if(f.y>20){
                //每拿一颗子弹,就判断一次这颗子弹是否击中敌机;
                bang(f);
            }
        }
    }
    //判断是否击中
    private  void bang(Fire f) {
        //遍历敌机
        for (int i = 0; i <eps.size() ; i++) {
            //获取每一个敌机
            Ep e=eps.get(i);
            //判断子弹与敌机是否相碰
            if(e.shootBy(f)){
                e.hp--;
                if(e.hp==0){
                    //如果敌机被子弹击中
                    eps.remove(e);//敌机消失
                    score++;
                }
                fs.remove(f);//子弹消失
//                bao.palymusic();
//                abc=false;
            }
//            abc=true;
        }
    }
    //子弹移动
    private void fireMove() {
        //遍历所有子弹
        for (int i = 0; i < fs.size(); i++) {
            //获取子弹
            Fire f=fs.get(i);
            //子弹移动
            f.move();
        }
    }
    int findex=0;//计数器
    //发射子弹的方法
    private void shoot() {
        findex++;
        if(findex>=5){
            if(score<50){
                //创建子弹
                Fire fire=new Fire(hero.x,hero.y,1);
                //将子弹加入到弹药库
                fs.add(fire);
                findex=0;
            }
            if(score>=50&&score<150){
                Fire fire=new Fire(hero.x+50,hero.y+20,1);
                fs.add(fire);
                Fire fire1=new Fire(hero.x-50,hero.y+20,1);
                fs.add(fire1);
                findex=0;
            }
            if(score>=150&&score<250){
                Fire fire=new Fire(hero.x+50,hero.y+20,1);
                fs.add(fire);
                Fire fire1=new Fire(hero.x-50,hero.y+20,1);
                fs.add(fire1);
                Fire fire2=new Fire(hero.x,hero.y,1);
                fs.add(fire2);
                findex=0;
            }
            if(score>=250){
                Fire fire3=new Fire(hero.x+50,hero.y+20,2);
                fs.add(fire3);
                Fire fire14=new Fire(hero.x-50,hero.y+20,0);
                fs.add(fire14);
                Fire fire5=new Fire(hero.x,hero.y,1);
                fs.add(fire5);
                findex=0;
            }
        }
    }
    //敌机移动
    private void epMove() {
        //便利所有敌机
        for (int i = 0; i <eps.size(); i++) {
            //获取每个敌机
            Ep e=eps.get(i);
            //让敌机移动
            e.move();
        }
    }
    //敌机入场的方法
    int index=0;//记录方法执行的次数
    private void epEnter() {
        index++;
        if(index>=20){
            //创建敌机
            Ep e=new Ep();
            //将敌机加入到大本营中
            eps.add(e);
            index=0;
        }
    }
    //构造方法
    public GamePanel(GameFrame frame){
        //设置背景
        setBackground(Color.black);
        //初始化图片
        bg=App.getImge(peizhi.img);
        //使用鼠标监听器(固定格式)
        //创建鼠标适配器
        MouseAdapter adapter=new MouseAdapter(){
            //确定需要监听的鼠标的事件
            //mouseMoved() 监听鼠标移动事件
            //mouseCliked() 监听鼠标单击事件
            //mousePressed() 监听鼠标按下去的事件
            //mouseEntered() 监听鼠标移入游戏界面事件
            //mouseExited() 监听鼠标移出游戏界面事件
            @Override
            public void mouseClicked(MouseEvent e) {
                //鼠标点击屏幕
                if(gameover){
                    hero=new Hero();
                    gameover=false;
                    score=0;
                    //随机背景图
                    repaint();
                }
            }

            public void mouseMoved(MouseEvent e){
                //让我方飞机跟着鼠标一起移动
                //获取鼠标的坐标
                int mx=e.getX();
                int my=e.getY();
                //让我方飞机的坐标与鼠标的坐标相等
                if(!gameover){
                    hero.moveToMouse(mx,my);
                }
                //刷新界面
                repaint();
            }
        };
        //将适配器加入到监听器中(鼠标控制)
        addMouseListener(adapter);
        addMouseMotionListener(adapter);
        //使用键盘监听器(固定模式)
        KeyAdapter adapter1=new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                //键盘触发
                //获取键盘上按键的数字
                int keyCode=e.getKeyCode();
                if(!gameover){
                    //上键
                    if(keyCode==KeyEvent.VK_UP){
                        hero.moveUp();
                    }
                    //向下
                    else if(keyCode==KeyEvent.VK_DOWN){
                        hero.moveDown();
                    }
                    //向左
                    else if(keyCode==KeyEvent.VK_LEFT){
                        hero.moveLeft();
                    }
                    //向右
                    else if(keyCode==KeyEvent.VK_RIGHT){
                        hero.moveRight();
                    }
                }
                repaint();
            }
        };
        //将适配器加入到窗体的键盘监听器中
        frame.addKeyListener(adapter1);
    }
    //Graphics g 画笔
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        //画图片
        g.drawImage(bg,0,0,peizhi.Width,peizhi.Height,null);
        g.drawImage(hero.img,hero.x,hero.y,hero.w,hero.h,null);
        //遍历敌机大本营,画出所有敌机
        for(int i=0;i<eps.size();i++){
            Ep ep=eps.get(i);
            g.drawImage(ep.img,ep.x,ep.y,ep.w,ep.h,null);
        }
        //遍历弹药库,画子弹
        for (int i = 0; i <fs.size() ; i++) {
            //获取一个子弹
            Fire fire=fs.get(i);
            g.drawImage(fire.img,fire.x,fire.y,fire.w,fire.h,null);
        }
//        if(abc=false){
//            g.drawImage(b.img,b.w,b.h,null);
//        }
        //画分数
        g.setColor(Color.red);
        g.setFont(new Font("楷体",Font.BOLD,20));
        g.drawString("分数:"+score,10,30);
        //画我方飞机的血量
        for (int i = 0; i <hero.hp ; i++) {
            g.drawImage(hero.img,480+i*35,5,hero.w/4,hero.h/4,null);
        }
        //游戏结束
        if(gameover==true){
            g.setColor(Color.red);
            g.setFont(new Font("方正舒体",Font.BOLD,40));
            g.drawString("GAME OVER!",peizhi.Width/4,300);
            g.setColor(Color.green);
            g.setFont(new Font("方正舒体",Font.BOLD,30));
            g.drawString("点击屏幕可重新开始游戏",peizhi.Width/4,100);
        }
    }
}

至于跟详细的代码请移步:https://download.csdn.net/download/liang13654/12643024 里面包括了代码以及素材