设计:飞机大战游戏,我们需要设计几个关键部分:敌机的生成和移动、子弹的发射和移动、碰撞检测、以及游戏的胜负条件,为了保持代码的可读性和简洁性,我将仅提供一个简化版的实现。
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个敌机后会增加子弹的发射频率。如果玩家被敌机碰到,游戏结束