摸鱼时间使用java写一个简单的飞机大战

设计:飞机大战游戏,我们需要设计几个关键部分:敌机的生成和移动、子弹的发射和移动、碰撞检测、以及游戏的胜负条件,为了保持代码的可读性和简洁性,我将仅提供一个简化版的实现。
 

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

public class AdvancedAirplaneGame extends JPanel implements ActionListener, KeyListener {
    private final int WIDTH = 400, HEIGHT = 600;
    private int playerX = WIDTH / 2, playerY = HEIGHT - 60;
    private final int PLAYER_WIDTH = 40, PLAYER_HEIGHT = 40;
    private final int ENEMY_WIDTH = 30, ENEMY_HEIGHT = 30;
    private final int BULLET_WIDTH = 5, BULLET_HEIGHT = 10;
    private List<Rectangle> enemies = new ArrayList<>();
    private List<Rectangle> bullets = new ArrayList<>();
    private int bulletFrequency = 500; // 子弹发射频率(毫秒)
    private long lastBulletTime = 0;
    private Timer timer;
    private int score = 0;
    private boolean gameOver = false;

    public AdvancedAirplaneGame() {
        this.setPreferredSize(new Dimension(WIDTH, HEIGHT));
        this.setBackground(Color.BLACK);
        this.setFocusable(true);
        this.addKeyListener(this);
        timer = new Timer(20, this);
        timer.start();
    }

    private void updateGame() {
        if (gameOver) {
            return;
        }
        
        // 敌机生成逻辑
        if (new Random().nextInt(100) > 98) { // 随机生成敌机
            int x = new Random().nextInt(WIDTH - ENEMY_WIDTH);
            enemies.add(new Rectangle(x, 0, ENEMY_WIDTH, ENEMY_HEIGHT));
        }

        // 更新敌机位置
        Iterator<Rectangle> enemyIterator = enemies.iterator();
        while (enemyIterator.hasNext()) {
            Rectangle enemy = enemyIterator.next();
            enemy.y += 1; // 敌机下降速度
            if (enemy.intersects(new Rectangle(playerX, playerY, PLAYER_WIDTH, PLAYER_HEIGHT))) {
                gameOver = true; // 碰撞检测
                break;
            }
        }

        // 发射子弹
        long currentTime = System.currentTimeMillis();
        if (currentTime - lastBulletTime > bulletFrequency) {
            bullets.add(new Rectangle(playerX + PLAYER_WIDTH / 2 - BULLET_WIDTH / 2, playerY, BULLET_WIDTH, BULLET_HEIGHT));
            lastBulletTime = currentTime;
        }

        // 更新子弹位置并检查是否击中敌机
        Iterator<Rectangle> bulletIterator = bullets.iterator();
        while (bulletIterator.hasNext()) {
            Rectangle bullet = bulletIterator.next();
            bullet.y -= 5; // 子弹速度
            if (bullet.y < 0) {
                bulletIterator.remove(); // 移除飞出屏幕的子弹
            } else {
                enemyIterator = enemies.iterator();
                while (enemyIterator.hasNext()) {
                    Rectangle enemy = enemyIterator.next();
                    if (bullet.intersects(enemy)) {
                        enemyIterator.remove(); // 移除被击中的敌机
                        bulletIterator.remove(); // 移除击中敌机的子弹
                        score++;
                        if (score % 10 == 0) {
                            bulletFrequency = Math.max(100, bulletFrequency - 100); // 每击败10个敌机,增加子弹发射频率
                        }
                        break;
                    }
                }
            }
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (gameOver) {
            g.setColor(Color.RED);
            g.drawString("Game Over!", WIDTH / 2 - 50, HEIGHT / 2);
            return;
        }
        g.setColor(Color.BLUE);
        g.fillRect(playerX, playerY, PLAYER_WIDTH, PLAYER_HEIGHT);
        g.setColor(Color.RED);
        for (Rectangle enemy : enemies) {
            g.fillRect(enemy.x, enemy.y, enemy.width, enemy.height);
        }
        g.setColor(Color.WHITE);
        for (Rectangle bullet : bullets) {
            g.fillRect(bullet.x, bullet.y, bullet.width, bullet.height);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        updateGame();
        repaint();
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (gameOver) {
            return;
        }
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_LEFT && playerX > 0) {
            playerX -= 10;
        } else if (keyCode == KeyEvent.VK_RIGHT && playerX < WIDTH - PLAYER_WIDTH) {
            playerX += 10;
        }
    }

    // 必须实现KeyListener接口的其他方法
    @Override
    public void keyTyped(KeyEvent e) {}
    @Override
    public void keyReleased(KeyEvent e) {}

    public static void main(String[] args) {
        JFrame frame = new JFrame("Advanced Airplane Game");
        AdvancedAirplaneGame gamePanel = new AdvancedAirplaneGame();
        frame.add(gamePanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
    }
}

这个代码实现了敌机的随机生成和下降、玩家的自动子弹发射、击中敌机后敌机和子弹的移除、以及碰撞检测。同时,游戏的难度会随着玩家击败敌机的数量增加而逐渐升高,击败每10个敌机后会增加子弹的发射频率。如果玩家被敌机碰到,游戏结束

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值