利用JavaSE编写简单的小游戏—飞机大战

这是一个基于JavaSE编写的飞机大战小游戏的代码实现,包括背景、飞机、子弹、敌人和爆炸效果的类,以及游戏主窗口的逻辑处理。游戏具备基本的玩家飞机移动、射击、敌人生成和碰撞检测等功能,同时使用了双缓冲技术来减少画面闪烁。
摘要由CSDN通过智能技术生成

利用JavaSE编写简单的小游戏—飞机大战

  • 运行效果:

在这里插入图片描述

  • 项目结构:

在这里插入图片描述

  1. Background类
package com.lhd.base;

import com.lhd.util.ImageUtils;

import java.awt.*;

public class Background extends Sprite {
    private Image image = ImageUtils.get("bg1");

    public Background() {
        init();
    }

    private void init() {
        image = ImageUtils.get("bg1");
        setX(0);
        setY(0);
        setWidth(image.getWidth(null));
        setHeight(image.getHeight(null));
    }


    @Override
    public void draw(Graphics g) {
        move();
        g.drawImage(image, getX(), getY(), getWidth(), getHeight(), null);
    }

    @Override
    public void move() {
        this.setY(getY()-2);
        outOfBounds();
    }
        //边缘判断
    public void outOfBounds(){
        if(getY()<=Constant.FRAME_HEIGHT-getHeight() ){
            setY(0);
        }
    }


}

  1. Constant 类
package com.lhd.base;

public class Constant {
    public static final int FRAME_WIDTH = 600;
    public static final int FRAME_HEIGHT = 800;
    public static  PlaneFrame PLANE_FRAME;
}

  1. EnemyPlane 类
package com.lhd.base;

import com.lhd.util.ImageUtils;

import java.awt.*;

public class EnemyPlane extends Sprite {
    private Image image;
    private int speed = 2;

    public EnemyPlane(int x, int y) {
        init(x, y);
    }

    public void init(int x, int y) {
        image = ImageUtils.get("my1");

        setX(x);
        setY(y);
        setWidth(image.getWidth(null));
        setHeight(image.getHeight(null));


    }

    @Override
    public void draw(Graphics g) {
        move();
        g.drawImage(image, getX(), getY(), getWidth(), getHeight(), null);
    }

    @Override
    public void move() {
        setY(getY() + speed);
        if (getY() >= Constant.FRAME_HEIGHT) {
            Constant.PLANE_FRAME.enemyPlaneList.remove(this);
        }
    }
}

  1. Explode 类
package com.lhd.base;

import com.lhd.util.ImageUtils;

import java.awt.*;
import java.util.ArrayList;
import java.util.List;

public class Explode extends Sprite {
    private List<Image> imageList = new ArrayList<>();
    private double index;

    public Explode(int x, int y) {
        init(x, y);
    }

    private void init(int x, int y) {
        imageList.add(ImageUtils.get("e1"));
        imageList.add(ImageUtils.get("e2"));
        imageList.add(ImageUtils.get("e3"));
        imageList.add(ImageUtils.get("e4"));
//        imageList.add(ImageUtils.get(""));
//        imageList.add(ImageUtils.get(""));
        setX(x);
        setY(y);
        setWidth(ImageUtils.get("e1").getWidth(null));
        setHeight(ImageUtils.get("e1").getHeight(null));


    }


    @Override
    public void draw(Graphics g) {
        index += 0.2;
        if (index >= 2) {
            Constant.PLANE_FRAME.explodes.remove(this);
            return;
        }
        g.drawImage(imageList.get((int) Math.floor(index)), getX(), getY(), getWidth(), getHeight(), null);


    }
}

  1. MyBullet 类
package com.lhd.base;

import com.lhd.util.ImageUtils;
import com.sun.xml.internal.ws.api.pipe.ClientPipeAssemblerContext;
import javafx.scene.shape.ClosePathBuilder;

import java.awt.*;
import java.util.List;

public class MyBullet extends Sprite {
    Image image;

    public MyBullet(int x,int y) {
        init(x,y);
    }

        public void init(int x,int y) {
        image = ImageUtils.get("myb1");
        setX(x);
        setY(y);
        setWidth(image.getWidth(null));
        setHeight(image.getHeight(null));
    }

//
    @Override
    public void draw(Graphics g) {
        move();
       outOfBounds();
        g.drawImage(image, getX(), getY(), getWidth(), getHeight(), null);

    }
    public void outOfBounds(){
        if(getY()<0-getHeight()){
            //从集合中移除自己
            Constant.PLANE_FRAME.myBulletList.remove(this);
        }
    }

    @Override
    public void move() {
        setY(getY()-10);

    }
    public void collisionDetection(List<EnemyPlane > enemyPlaneList){
        for (EnemyPlane enemyPlane : enemyPlaneList) {
            if (this.creatRectangle().intersects(enemyPlane.creatRectangle())){
                Constant.PLANE_FRAME.myBulletList.remove(this);
                Constant.PLANE_FRAME.enemyPlaneList.remove(enemyPlane);
                Constant.PLANE_FRAME.explodes.add(new Explode(enemyPlane.getX(),enemyPlane.getY()));
                Constant.PLANE_FRAME.score++;
            }

        }

    }
}

  1. Plane 类
package com.lhd.base;

import com.lhd.util.ImageUtils;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.List;

public class Plane extends Sprite {
    private Image image;
    private boolean up, right, down, left, fire;
    private int fireFrequency ;
    private int speed = 5;

    public Plane() {
        init();
    }

    public void init() {
        image = ImageUtils.get("my1");
        setX(Constant.FRAME_WIDTH / 2 - image.getWidth(null) / 2);
        setY(Constant.FRAME_HEIGHT - image.getHeight(null));
        setWidth(image.getWidth(null));
        setHeight(image.getHeight(null));
    }


    @Override
    public void draw(Graphics g) {
        move();
        outOfBounds();
        g.drawImage(image, getX(), getY(), getWidth(), getHeight(), null);
        attack();
        fireFrequency++;
    }

    public void attack() {
        if (fire && fireFrequency >= 10) {
            Constant.PLANE_FRAME.myBulletList.add(new MyBullet(getX() + getWidth() / 2 - (ImageUtils.get("myb1").getWidth(null) / 2),
                    getY() - ImageUtils.get("myb1").getHeight(null)));
            fireFrequency = 0;
        }
    }
    public void outOfBounds() {
        if (getY() < 30) {
            setY(30);
        }
        if (getY() >= Constant.FRAME_HEIGHT - getHeight()) {
            setY(Constant.FRAME_HEIGHT - getHeight());
        }
        if (getX() < 0) {
            setX(0);
        }
        if (getX() >= Constant.FRAME_WIDTH - getWidth()) {
            setX(Constant.FRAME_WIDTH - getWidth());
        }
    }

    public void move() {
        if (up) {
            setY(getY() - speed);
        }
        if (right) {
            setX(getX() + speed);
        }
        if (down) {
            setY(getY() + speed);
        }
        if (left) {
            setX(getX() - speed);
        }
    }

    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W) {
            up = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_D) {
            right = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_S) {
            down = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_A) {
            left = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_J) {
            fire = true;
        }
    }

    public void keyReleased(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W) {
            up = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_D) {
            right = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_S) {
            down = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_A) {
            left = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_J) {
            fire = false;
        }
   }
}

  1. PlaneFrame 类
package com.lhd.base;

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CopyOnWriteArrayList;

public class PlaneFrame extends Frame {
Random random = new Random();
    public PlaneFrame() {
        this.init();
    }
    private void init() {
        setSize(Constant.FRAME_WIDTH, Constant.FRAME_HEIGHT);
        //设置居中
        setLocationRelativeTo(null);
        //屏蔽输入法
        enableInputMethods(false);

        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        //设置显示
        setVisible(true);
        new Thread() {
            @Override
            public void run() {
                while (true) {
                    repaint();
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                plane.keyPressed(e);
            }
            @Override
            public void keyReleased(KeyEvent e) {
                plane.keyReleased(e);
            }
        });
        //初始化敌机
        enemyPlaneList.add(new EnemyPlane(0,0));
        enemyPlaneList.add(new EnemyPlane(200,0));
        enemyPlaneList.add(new EnemyPlane(400,0));
    }

    Background background = new Background();
    Plane plane = new Plane();
    //    MyBullet myBullet = new MyBullet(100,100);
    List<MyBullet> myBulletList = new CopyOnWriteArrayList<>();
    //EnemyPlane enemyPlane = new EnemyPlane(300,300);
    public  List<EnemyPlane> enemyPlaneList = new CopyOnWriteArrayList<>();
    public List<Explode> explodes = new CopyOnWriteArrayList<>();
//    Explode explode = new Explode(100,100);
     int score;
    //绘制
    @Override
    public void paint(Graphics g) {
        background.draw(g);
        plane.draw(g);

        for (MyBullet myBullet : myBulletList) {
            myBullet.draw(g);
            myBullet.collisionDetection(enemyPlaneList);
        }
//      myBullet.draw(g);
        for (EnemyPlane enemyPlane : enemyPlaneList) {
            enemyPlane.draw(g);
        }
//        explode.draw(g);
        for (Explode explode : explodes) {
            explode.draw(g);
        }
//        //碰撞检测
//        for (EnemyPlane enemyPlane : enemyPlaneList) {
//            for (MyBullet myBullet : myBulletList) {
//                if(enemyPlane.creatRectangle().intersects(myBullet.creatRectangle()));
//                enemyPlaneList.remove(enemyPlane);
//                myBulletList.remove(myBullet);
//            }
//        }
          if (enemyPlaneList.size()<=2){
              int count = random.nextInt(3)+3;
              for (int i = 0; i < count; i++) {
                  enemyPlaneList.add(new EnemyPlane(random.nextInt(400),random.nextInt(300)-300));
              }
          }
          g.setColor(Color.red);
          g.setFont(new Font("黑体",Font.BOLD,36));
          g.drawString("分数:"+score,100,100);
//
    }
  //双缓冲,解决画面闪烁
    Image offScreenImage = null;

    @Override
    public void update(Graphics g) {
        if (offScreenImage == null) {
            offScreenImage = this.createImage(600, 800);
        }
        Graphics gOffScreen = offScreenImage.getGraphics();
        Color c = gOffScreen.getColor();
        gOffScreen.setColor(Color.WHITE);
        gOffScreen.fillRect(0, 0, 600, 800);
        gOffScreen.setColor(c);
        paint(gOffScreen);
        g.drawImage(offScreenImage, 0, 0, null);
    }

}

  1. Sprite 类
package com.lhd.base;

import java.awt.*;

//抽象类所有元素的基类
public abstract class Sprite {
    private int x;
    private int y;
    private int width;
    private int height;

    public abstract void draw(Graphics g);

    public void move() {

    }
    public Rectangle creatRectangle(){
        return new Rectangle(x,y,width,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 getWidth() {
        return width;
    }

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

    public int getHeight() {
        return height;
    }

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

  1. ImageUtils 工具类
package com.lhd.util;

import javax.imageio.ImageIO;
import java.awt.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class ImageUtils {
    private static Map<String,Image> imageMap = new HashMap<>();

    static {
        imageMap.put("bg1",readImage("com/lhd/img/bg/bj1.jpg"));
        imageMap.put("my1",readImage("com/lhd/img/plant/my1.png"));
        imageMap.put("myb1",readImage("com/lhd/img/bullet/myb1.png"));
        imageMap.put("e1",readImage("com/lhd/img/explode/e1.png"));
        imageMap.put("e2",readImage("com/lhd/img/explode/e2.png"));
        imageMap.put("e3",readImage("com/lhd/img/explode/e3.png"));
        imageMap.put("e4",readImage("com/lhd/img/explode/e4.png"));

    }
    public static Image get(String key){
        return imageMap.get(key);
    }
    public static Image readImage(String path){
        Image image = null;
        try {
            image = ImageIO.read(ImageUtils.class.getClassLoader().getResourceAsStream(path));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return image;
    }
}

  1. Start 启动类
package com.lhd;

import com.lhd.base.Constant;
import com.lhd.base.PlaneFrame;

public class Start {

    public static void main(String[] args) {
        Constant.PLANE_FRAME =  new PlaneFrame();
    }
}

点击start类即可运行程序,另外游戏还有一些功能没有完善,待后续开发—
后面有游戏需要的图片
myb1
my1
e4

e3
e2
e1
bj1

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本文将利用JavaSE编写一个超市管理系统,包括需求分析、系统设计和系统实现。超市管理系统是一个基于计算机网络的信息管理系统,它可以帮助超市管理者实现对超市各项业务的管理和监控,从而提高超市的经营效益和管理水平。 一、需求分析 超市管理系统的主要功能包括商品管理、库存管理、销售管理和员工管理。具体需求如下: 1. 商品管理:实现商品的添加、修改、删除和查询功能,以及对商品价格、数量等信息的管理。 2. 库存管理:实现库存的入库、出库、盘点等功能,以及对库存状态的监控和管理。 3. 销售管理:实现商品销售、退货、统计等功能,以及对销售情况的分析和管理。 4. 员工管理:实现员工的添加、修改、删除和查询功能,以及对员工信息的管理和监控。 二、系统设计 超市管理系统采用B/S结构,即浏览器/服务器结构,客户端通过浏览器访问服务器端的应用程序,实现对超市管理系统的使用。 1. 技术选型 超市管理系统采用JavaSE技术进行开发,包括Java语言、JDBC、Servlet、JSP等技术。 2. 系统架构 超市管理系统采用MVC架构,即Model-View-Controller架构。其中,Model层负责数据访问和业务逻辑处理,View层负责页面显示和用户交互,Controller层负责调度和控制整个系统的流程。 3. 数据库设计 超市管理系统的数据库采用MySQL数据库,包括商品表、库存表、销售表和员工表等。其中,商品表包括商品编号、商品名称、商品价格等字段,库存表包括商品编号、库存数量、入库时间等字段,销售表包括销售编号、销售时间、商品编号等字段,员工表包括员工编号、员工姓名、员工职位等字段。 4. 功能模块设计 超市管理系统的功能模块包括商品管理模块、库存管理模块、销售管理模块和员工管理模块。 商品管理模块包括添加商品、修改商品、删除商品和查询商品等功能。其中,添加商品功能可以添加商品的基本信息和价格信息,修改商品功能可以修改商品的基本信息和价格信息,删除商品功能可以删除商品的基本信息和价格信息,查询商品功能可以按照商品编号、商品名称等条件进行查询。 库存管理模块包括入库、出库、盘点等功能。其中,入库功能可以将商品加入库存中,出库功能可以将商品从库存中移除,盘点功能可以对库存进行实时监控和统计。 销售管理模块包括商品销售、退货、统计等功能。其中,商品销售功能可以实现商品的销售和生成销售订单,退货功能可以实现商品的退货和生成退货订单,统计功能可以对销售情况进行统计和分析。 员工管理模块包括添加员工、修改员工、删除员工和查询员工等功能。其中,添加员工功能可以添加员工的基本信息和职位信息,修改员工功能可以修改员工的基本信息和职位信息,删除员工功能可以删除员工的基本信息和职位信息,查询员工功能可以按照员工编号、员工姓名等条件进行查询。 三、系统实现 超市管理系统的实现包括数据库连接、业务逻辑处理和页面显示等方面。 1. 数据库连接 超市管理系统采用JDBC技术连接MySQL数据库,实现数据的增删改查等操作。 2. 业务逻辑处理 超市管理系统采用Servlet和JSP技术实现业务逻辑处理和页面跳转等功能。其中,Servlet负责接收和处理客户端请求,JSP负责页面显示和用户交互。 3. 页面显示 超市管理系统采用HTML、CSS和JavaScript等技术实现页面的设计和显示。其中,HTML负责页面结构和内容,CSS负责页面样式和布局,JavaScript负责页面动态效果和交互。 四、总结 本文利用JavaSE技术编写了一个超市管理系统,实现了商品管理、库存管理、销售管理和员工管理等功能。超市管理系统采用B/S结构、MVC架构和MySQL数据库,实现了数据的增删改查等操作。超市管理系统可以帮助超市管理者实现对超市各项业务的管理和监控,提高超市的经营效益和管理水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值