java程序设计-飞机大战

制作人:尹子杰,朱健钊

项目简介:

团队选择任务为小游戏,选择具体游戏为飞机大战,不仅是因为编写出游戏有一定的挑战性和难度,是对我们本学期java学习的检测,更能通过本次代码编写找到自身更多不足之处,也让我们更加了解了我们所学的知识点的应用。我们通过努力完成了这个项目,其中不足的地方也请老师指出我们改正。

项目关键技术:

java变量、java数据类型、判断语句、循环结构、数组、Java集合、简单窗口创建、图形图片绘制、双缓存技术、事件-鼠标和键盘事件、awt抽象窗口工具包、部分复杂算法、大部分注释、GUI界面、面向对象程序设计、线程等

开发工具:idea

开发环境:jdk11

项目需求分析:

1.方法简单,游戏方式简单,更容易上手游玩。

2.能够方便操作,可以用鼠标灵活操作。

功能演示截图

 

 

任务分配

位置姓名

任务分配

组长:朱健钊

完成大体的布置,检查、修改共同完成各模块内容最后整合一起

组员:尹子杰

图片的查找,模块内容的细分以及具体处理

git项目提交地址:untitle: 雷霆战机java课程设计——朱健钊,尹子杰 (gitee.com)

git提交截图:

代码部分:

Bomb

package game;

import java.awt.Graphics;
import java.awt.image.ImageObserver;
import javax.swing.ImageIcon;

public class Bomb {
    private int x;
    private int y;
    private int height;
    private int width;
    private ImageIcon imageIcon = new ImageIcon("img/bomb.png");
    private int flag;

    public Bomb(int x, int y) {
        this.x = x;
        this.y = y;
        this.height = this.imageIcon.getIconHeight();
        this.width = this.imageIcon.getIconWidth();
    }

    public int getX() {
        return this.x;
    }

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

    public int getY() {
        return this.y;
    }

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

    public int getHeight() {
        return this.height;
    }

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

    public int getWidth() {
        return this.width;
    }

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

    public ImageIcon getImageIcon() {
        return this.imageIcon;
    }

    public void setImageIcon(ImageIcon imageIcon) {
        this.imageIcon = imageIcon;
    }

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

    public void delete() {
        ++this.flag;
    }

    public int getFlag() {
        return this.flag;
    }

    public void setFlag(int flag) {
        this.flag = flag;
    }
}



Bullet

package game;

import java.awt.Graphics;
import java.awt.image.ImageObserver;
import javax.swing.ImageIcon;

public class Bullet {
    private int x;
    private int y;
    private int width;
    private int height;
    private ImageIcon bulletImageIcon = new ImageIcon("img/bullet.png");

    public Bullet(int x, int y) {
        this.width = this.bulletImageIcon.getIconWidth();
        this.height = this.bulletImageIcon.getIconHeight();
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return this.x;
    }

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

    public int getY() {
        return this.y;
    }

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

    public int getWidth() {
        return this.width;
    }

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

    public int getHeight() {
        return this.height;
    }

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

    public ImageIcon getBulletImageIcon() {
        return this.bulletImageIcon;
    }

    public void setBulletImageIcon(ImageIcon bulletImageIcon) {
        this.bulletImageIcon = bulletImageIcon;
    }

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

    public void move() {
        this.y -= 4;
    }
}

Emeny

package game;

import java.awt.Graphics;
import java.awt.image.ImageObserver;
import java.util.Random;
import javax.swing.ImageIcon;

public class Enemy {
    private int x;
    private int y;
    private int height;
    private int width;
    private ImageIcon enemyImageIcon = new ImageIcon("img/enemy.png");

    public Enemy() {
        this.height = this.enemyImageIcon.getIconHeight();
        this.width = this.enemyImageIcon.getIconWidth();
        Random random = new Random();
        this.x = random.nextInt(GameMain.width - this.width);
        this.y = -random.nextInt(GameMain.height - this.height);
    }

    public void move() {
        ++this.y;
    }

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

    public int getX() {
        return this.x;
    }

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

    public int getY() {
        return this.y;
    }

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

    public int getHeight() {
        return this.height;
    }

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

    public int getWidth() {
        return this.width;
    }

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

    public ImageIcon getEnemyImageIcon() {
        return this.enemyImageIcon;
    }

    public void setEnemyImageIcon(ImageIcon enemyImageIcon) {
        this.enemyImageIcon = enemyImageIcon;
    }
}

GamePanel

package game;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;

public class GamePanel extends JPanel implements MouseMotionListener {
    //读取英雄机的图片
    ImageIcon heroImage = new ImageIcon("img/hero.png");
    //英雄机坐标
    int heroX = 300;
    int heroY = 500;
    private int number;//记录分数
    //定义一个集合来装所有敌机
    private List<Enemy> enems = new ArrayList<Enemy>();//定义一个集合来装所有的敌机
    //定义一个集合来装所有子弹对象
    private List<Bullet> bullets = new ArrayList<Bullet>();
    //定义一个集合用来装爆炸图片
    private List<Bomb> bombs =new ArrayList<Bomb>();

    public GamePanel() {//创建十个敌人
        for (int i = 0; i < 10; i++) {
            enems.add(new Enemy());
        }
    }
    //鼠标按键在组件上按下并拖动时调用
    @Override
    public void mouseDragged(MouseEvent e) {
        heroX = e.getX() - (heroImage.getIconWidth() / 2);//使鼠标与战机重合
        heroY = e.getY() - (heroImage.getIconHeight() / 2);//把鼠标的y赋值
        repaint();//重新绘制
    }
    //鼠标光标移动到组件上但无按键按下时调用
    @Override
    public void mouseMoved(MouseEvent e) {
        heroX = e.getX() - (heroImage.getIconWidth() / 2);
        heroY = e.getY() - (heroImage.getIconHeight() / 2);
        repaint();
    }

    /**
     * 绘制图片 这个方法是窗口对象来调用
     * @param g
     */
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawString("ZJZ and YZJ", 250, 30);

        //绘制分数板
        g.setFont(new Font("", Color.RED.getRed(), 30));
        g.drawString("当前得分:"+number, 20, 30);

        //1.绘制英雄机
        //g.drawImage(heroImage.getImage(), 350, 0, null);


        g.drawImage(heroImage.getImage(), heroX, heroY, null);
        //2.绘制敌机
        for (int i = 0; i < enems.size(); i++) {
            Enemy enemy = enems.get(i);
            enemy.drawImage(g);//重新绘制

        }
        //3.绘制子弹
        for (int i = 0; i < bullets.size(); i++) {
            Bullet bullet=bullets.get(i);
            bullet.drawImage(g);
        }
        //4.绘制爆炸图片
        for(int i=0;i<bombs.size();i++){
            Bomb bomb = bombs.get(i);
            bomb.drawImage(g);
        }
    }

    /**
     * 这个方法做初始化使用
     * 创建一些组件(英雄机,子弹,敌人)
     */
    public void init() {
        int flag=0;//控制子弹流出的速度

        while (true) {
            flag++;
            if(flag % 15 ==0) {
                //创建一些子弹
                Bullet bullet = new Bullet(heroX + (heroImage.getIconWidth() / 2), heroY);
                //把子弹添加到集合
                bullets.add(bullet);
            }
            //让敌机往下移动
            for (int i = 0; i < enems.size(); i++) {
                Enemy enemy = enems.get(i);
                enemy.move();//改变敌机的y坐标

                //判断敌机的y值是否大于窗口的高夫
                if(enemy.getY()>GameMain.height){
                    //删除敌机
                    enems.remove(enemy);
                    //再加一个新的敌机
                    enems.add(new Enemy());
                }
            }
            //让子弹飞起来
            for (int i = 0; i < bullets.size(); i++) {
                Bullet tempBullet = bullets.get(i);
                tempBullet.move();

            }
            //删除越界子弹数
            for (int i = 0; i < bullets.size(); i++) {
                Bullet bullet=bullets.get(i);
                if(bullet.getY()<0){//越界
                    bullets.remove(bullet);
                }
            }
            //处理子弹碰到敌机的效果
            for (int i = 0; i < enems.size(); i++) {
                Enemy enemy=enems.get(i);//敌机

                for (int j = 0; j < bullets.size(); j++) {
                    Bullet bullet=bullets.get(j);//子弹
                    if(isHit(enemy,bullet)){
                        enems.remove(enemy);//先删除集中的敌机
                        enems.add(new Enemy());//再加入敌机
                        bullets.remove(bullet);//删除子弹

                        //创建一个爆炸图片的对象
                        Bomb bomb=new Bomb(enemy.getY(),enemy.getY());//爆炸的地方是敌机被消灭的地方
                        bombs.add(bomb);//添加到集合中
                        number+=10;//每次碰撞加十分
                    }
                }
            }
            for (int i = 0; i < bombs.size(); i++) {
                Bomb bomb=bombs.get(i);
                bomb.delete();//立马删看不到效果,删五次
                if(bomb.getFlag()>10){
                    bombs.remove(bomb);//删集合
                }
            }

            repaint();//重新绘制,使图片动起来

            try {//休眠五毫秒,否则我们看不见
                Thread.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    //碰撞方法
    public boolean isHit(Enemy e, Bullet b){
        // 1.指定一个区域
        Rectangle rect = new Rectangle(e.getX(), e.getY(), e.getWidth(), e.getHeight());

        // 2.表示 (x,y) 坐标空间中的位置的点
        Point p = new Point(b.getX()+b.getWidth()/2,b.getY()+b.getHeight()/2);

        return rect.contains(p);//敌机包含子弹
    }
}

GameMain

package game;

import java.awt.Component;
import javax.swing.JFrame;

public class GameMain {
    static int width = 600;
    static int height = 800;

    public GameMain() {
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setTitle("飞机大战");
        frame.setSize(width, height);
        frame.setLocationRelativeTo((Component)null);
        frame.setDefaultCloseOperation(3);
        GamePanel j = new GamePanel();
        frame.add(j);
        frame.addMouseMotionListener(j);
        frame.setVisible(true);
        j.init();
    }
}

  • 8
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值