飞机大战是一个非常经典的游戏,相信很多人都玩过。下面我们将通过Java代码来实现一个简单的飞机大战游戏。
首先,我们需要搭建游戏引擎。这里我们使用Java Swing来创建GUI界面,使用Java线程来实现游戏逻辑。
- 创建一个Java项目,并将下面的代码复制到新建的Java文件中。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class GameFrame extends JFrame implements ActionListener {
private GamePanel gamePanel;
public GameFrame() {
gamePanel = new GamePanel();
this.add(gamePanel);
this.setTitle("飞机大战");
this.setSize(800, 600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
gamePanel.repaint();
}
}
- 创建一个名为GamePanel的Java类,并将下面的代码复制到新建的Java文件中。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GamePanel extends JPanel {
private Player player;
private Enemy enemy;
private Bullet bullet;
private Timer timer;
private int score;
private boolean gameOver;
public GamePanel() {
player = new Player(100, 450);
enemy = new Enemy();
bullet = new Bullet();
timer = new Timer(10, new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (gameOver) {
timer.stop();
} else {
update();
repaint();
}
}
});
timer.start();
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
bullet.setX(e.getX());
bullet.setY(e.getY());
bullet.setVelocity(5);
}
});
}
``3. 在GamePanel类中继续添加以下代码,以实现游戏逻辑和绘制功能。
```java
public void update() {
if (bullet.getY() < 600) {
bullet.setY(bullet.getY() + bullet.getVelocity());
} else {
bullet.setAlive(false);
}
if (player.getY() > 600) {
player.setAlive(false);
gameOver = true;
timer.stop();
}
if (enemy.getY() > 600) {
enemy.setAlive(false);
}
if (!bullet.isAlive() && enemy.isAlive()) {
score++;
enemy.setAlive(false);
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
player.draw(g);
enemy.draw(g);
bullet.draw(g);
g.setFont(new Font("Arial", Font.BOLD, 30));
g.setColor(Color.RED);
g.drawString("Score: " + score, 10, 50);
if (gameOver) {
g.setColor(Color.RED);
g.setFont(new Font("Arial", Font.BOLD, 40));
g.drawString("Game Over!", 100, 200);
g.drawString("Press space to play again.", 100, 250);
}
}
- 在GamePanel类中添加以下代码,以实现游戏结束时的重新开始功能。
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
player.setAlive(true);
enemy.setAlive(true);
bullet.setAlive(false);
gameOver = false;
timer.start();
}
}
`5. 在GamePanel类中添加以下代码,以实现游戏窗口的关闭功能。
public void windowClosing(WindowEvent e) {
System.exit(0);
}
- 在GameFrame类中添加以下代码,以实现游戏窗口的创建和显示。
public GameFrame() {
gamePanel = new GamePanel();
this.add(gamePanel);
this.setTitle("飞机大战");
this.setSize(800, 600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
- 在GamePanel类中添加以下代码,以实现敌机的生成和移动功能。
public void addEnemy() {
Enemy enemy = new Enemy();
enemy.setX(rand.nextInt(700));
enemy.setY(rand.nextInt(50) + 100);
enemy.setSpeed(rand.nextInt(5) + 2);
enemies.add(enemy);
}
public void moveEnemies() {
for (Enemy enemy : enemies) {
enemy.setY(enemy.getY() + enemy.getSpeed());
if (enemy.getY() > 600) {
enemy.setAlive(false);
}
}
}
- 在GamePanel类中添加以下代码,以实现敌机的绘制功能。
public void drawEnemies(Graphics g) {
for (Enemy enemy : enemies) {
enemy.draw(g);
}
}
- 在GamePanel类中添加以下代码,以实现敌机的数量控制和生成功能。
private ArrayList<Enemy> enemies = new ArrayList<Enemy>();
private Random rand = new Random();
public void addEnemies() {
if (enemies.size() < 15) {
addEnemy();
} else {
enemies.remove(0);
addEnemy();
}
}
- 在GamePanel类中添加以下代码,以实现敌机的移动和绘制功能。
public void moveEnemies() {
for (Enemy enemy : enemies) {
enemy.setY(enemy.getY() + enemy.getSpeed());
if (enemy.getY() > 600) {
enemy.setAlive(false);
} else {
enemy.draw(getGraphics());
}
}
}
- 在GamePanel类中添加以下代码,以实现敌机被击落后得分的变化。
public void enemyShotDown(Bullet bullet) {
for (Enemy enemy : enemies) {
if (bullet.getX() < enemy.getX() + 50 && bullet.getX() > enemy.getX() - 50 && bullet.getY() < enemy.getY() + 50 && bullet.getY() > enemy.getY() - 50) {
enemies.remove(enemy);
score++;
break;
}
}
}
- 在GamePanel类中添加以下代码,以实现游戏窗口的创建和显示。
public static void main(String[] args) {
GameFrame gameFrame = new GameFrame();
}
至此,我们已经完成了一个简单的2D飞机大战敌机的游戏程序。你可以运行该程序进行测试,检查是否实现了预期的功能。