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;
}
}
}
按下空格键可以发射子弹,子弹会向上移动,并且如果子弹击中敌机,敌机会爆炸(敌机变成绿色),游戏结束。