java 飞机大战(超简易版,供新手小白们练习用)

import javax.swing.*;
import javax.swing.Timer;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class PlaneWarGame extends JFrame implements ActionListener, KeyListener {
    private Timer timer;
    private int width = 500, height = 500;
    private int planeX, planeY;
    private ArrayList<Enemy> enemies = new ArrayList<>(); // 保存敌机对象的数组列表
    private boolean left, right, up, down, bulletFired;
    private int bulletX, bulletY;

    public PlaneWarGame() {
        setTitle("Plane War Game");
        setSize(width, height);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);

        planeX = width / 2 - 25;
        planeY = height - 100;

        addKeyListener(this);

        createEnemies(); // 初始化敌机

        timer = new Timer(10, this);
        timer.start();
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(Color.BLUE);
        g.fillRect(planeX, planeY, 50, 50);

        for (Enemy enemy : enemies) { // 遍历敌机数组列表
            if (!enemy.isDead()) {
                g.setColor(enemy.getColor());
                g.fillRect(enemy.getX(), enemy.getY(), 50, 50);
            } else {
                g.setColor(Color.GREEN);
                g.fillRect(enemy.getX(), enemy.getY(), 50, 50);
            }
        }

        if (bulletFired) {
            g.setColor(Color.BLACK);
            g.fillRect(bulletX, bulletY, 5,10);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (left) {
            planeX -= 5;
        }
        if (right) {
            planeX += 5;
        }
        if (up) {
            planeY -= 5;
        }
        if (down) {
            planeY += 5;
        }

        for (Enemy enemy : enemies) { // 遍历敌机数组列表
            if (!enemy.isDead()) { // 如果敌机没有被击中
                enemy.move(); // 敌机向下移动
                if (enemy.getX() <= planeX + 50 && enemy.getX() + 50 >= planeX && enemy.getY() <= planeY + 50 && enemy.getY() + 50 >= planeY) {
                    // 如果玩家飞机和敌机重叠
                    enemy.setDead(true); // 敌机被击中
                }
            }
        }

        if (bulletFired) {
            bulletY -= 10;
            if (bulletY < 0) {
                bulletFired = false;
            }
            for (Enemy enemy : enemies) { // 遍历敌机数组列表
                if (!enemy.isDead()) { // 如果敌机没有被击中
                    if (bulletX <= enemy.getX() + 50 && bulletX + 5 >= enemy.getX() && bulletY <= enemy.getY() + 50 && bulletY + 10 >= enemy.getY()) {
                        // 如果子弹击中敌机
                        enemy.setDead(true); // 敌机被击中
                        bulletFired = false; // 子弹失效
                    }
                }
            }
        }

        repaint();
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            left = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            right = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_UP) {
            up = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_DOWN) {
            down = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_SPACE) {
            if (!bulletFired) {
                bulletFired = true;
                bulletX = planeX + 22;
                bulletY = planeY - 10;
            }
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            left = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            right = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_UP) {
            up = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_DOWN) {
            down = false;
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {}

    public static void main(String[] args) {
        PlaneWarGame pwg = new PlaneWarGame();
        pwg.setVisible(true);
    }

    private void createEnemies() {
        Random rand = new Random();

        for (int i = 0; i < 5; i++) { // 添加 5 个敌机
            int x = rand.nextInt(width - 50); // 随机敌机的 X 坐标
            int y = rand.nextInt(height / 2 - 50); // 随机敌机的 Y 坐标
            Color color = new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)); // 随机敌机的颜色
            enemies.add(new Enemy(x, y, color)); // 添加
           // 敌机对象到数组列表中
        }
    }

    // 敌机类
    private class Enemy {
        private int x, y;
        private Color color;
        private boolean dead;

        public Enemy(int x, int y, Color color) {
            this.x = x;
            this.y = y;
            this.color = color;
            this.dead = false;
        }

        public void move() {
            y++;
            if (y >= height) {
                y = 0;
                x = new Random().nextInt(width - 50);
            }
        }

        public void setDead(boolean dead) {
            this.dead = dead;
        }

        public boolean isDead() {
            return dead;
        }

        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }

        public Color getColor() {
            return color;
        }
    }
}

按下空格键可以发射子弹,子弹会向上移动,并且如果子弹击中敌机,敌机会爆炸(敌机变成绿色),游戏结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值