用idea写一个星飞机大战

时间: 2023-06-12 07:06:50 浏览: 73
很好,下面是用 Java 语言和 IntelliJ IDEA 编写的星飞机大战游戏的示例代码。 首先,创建一个 `Main` 类,这个类包含了游戏的主要逻辑和窗口的绘制。 ``` import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Main extends JPanel implements ActionListener { private Timer timer; private Player player; private Enemy enemy; private Missile missile; public Main() { setBackground(Color.BLACK); player = new Player(); enemy = new Enemy(); missile = new Missile(); timer = new Timer(10, this); timer.start(); addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { player.keyPressed(e); } public void keyReleased(KeyEvent e) { player.keyReleased(e); } }); setFocusable(true); } public void actionPerformed(ActionEvent e) { player.move(); enemy.move(); missile.move(); repaint(); } public void paint(Graphics g) { super.paint(g); player.draw(g); enemy.draw(g); missile.draw(g); } public static void main(String[] args) { JFrame frame = new JFrame("Starship"); frame.setSize(600, 400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new Main()); frame.setVisible(true); } } ``` `Main` 类继承了 `JPanel`,并实现了 `ActionListener` 接口,用于处理游戏的主要逻辑。在构造函数中,我们设置了游戏窗口的背景颜色、创建了玩家、敌人和导弹对象,以及启动了一个定时器,每隔10毫秒更新一次游戏画面。我们还添加了一个键盘监听器,用于处理玩家的键盘输入。 在 `actionPerformed` 方法中,我们调用了 `move` 方法,使玩家、敌人和导弹移动,并调用 `repaint` 方法刷新游戏画面。 在 `paint` 方法中,我们调用了各个对象的 `draw` 方法,用于绘制它们在游戏中的位置和状态。 最后,在 `main` 方法中,我们创建了一个 `JFrame` 对象,并将 `Main` 类添加到窗口中。 接下来,我们创建 `Player`、`Enemy` 和 `Missile` 类,用于处理玩家、敌人和导弹的逻辑和绘制。 ``` import java.awt.*; import java.awt.event.*; public class Player { private int x, y; private int dx, dy; private boolean left, right, up, down; public Player() { x = 300; y = 300; dx = 0; dy = 0; } public void move() { if (left) { dx = -5; } else if (right) { dx = 5; } else { dx = 0; } if (up) { dy = -5; } else if (down) { dy = 5; } else { dy = 0; } x += dx; y += dy; if (x < 0) { x = 0; } if (x > 550) { x = 550; } if (y < 0) { y = 0; } if (y > 350) { y = 350; } } public void draw(Graphics g) { g.setColor(Color.BLUE); g.fillRect(x, y, 50, 50); } public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if (key == KeyEvent.VK_LEFT) { left = true; } if (key == KeyEvent.VK_RIGHT) { right = true; } if (key == KeyEvent.VK_UP) { up = true; } if (key == KeyEvent.VK_DOWN) { down = true; } } public void keyReleased(KeyEvent e) { int key = e.getKeyCode(); if (key == KeyEvent.VK_LEFT) { left = false; } if (key == KeyEvent.VK_RIGHT) { right = false; } if (key == KeyEvent.VK_UP) { up = false; } if (key == KeyEvent.VK_DOWN) { down = false; } } } ``` `Player` 类处理了玩家的移动和绘制。在构造函数中,我们初始化了玩家的位置和速度。在 `move` 方法中,我们根据玩家的键盘输入更新玩家的速度和位置,限制了玩家不能移动出游戏窗口。在 `draw` 方法中,我们绘制了一个蓝色的矩形作为玩家。 下面是 `Enemy` 类的代码。 ``` import java.awt.*; public class Enemy { private int x, y; private int dx, dy; public Enemy() { x = 100; y = 100; dx = 3; dy = 3; } public void move() { x += dx; y += dy; if (x < 0 || x > 550) { dx = -dx; } if (y < 0 || y > 350) { dy = -dy; } } public void draw(Graphics g) { g.setColor(Color.RED); g.fillOval(x, y, 50, 50); } } ``` `Enemy` 类处理了敌人的移动和绘制。在构造函数中,我们初始化了敌人的位置和速度。在 `move` 方法中,我们根据敌人的位置和速度更新敌人的位置,并在敌人到达游戏窗口边界时反转速度。在 `draw` 方法中,我们绘制了一个红色的圆形作为敌人。 最后,这是 `Missile` 类的代码。 ``` import java.awt.*; public class Missile { private int x, y; private int dy; private boolean visible; public Missile() { visible = false; } public void move() { if (visible) { y += dy; if (y < 0) { visible = false; } } } public void draw(Graphics g) { if (visible) { g.setColor(Color.WHITE); g.fillRect(x, y, 5, 10); } } public void fire(int playerX, int playerY) { if (!visible) { x = playerX + 20; y = playerY - 10; dy = -10; visible = true; } } public boolean isVisible() { return visible; } public Rectangle getBounds() { return new Rectangle(x, y, 5, 10); } } ``` `Missile` 类处理了导弹的移动和绘制。在构造函数中,我们将导弹的可见性设置为假。在 `move` 方法中,如果导弹可见,我们根据导弹的速度更新导弹的位置,并在导弹离开游戏窗口时将其设置为不可见。在 `draw` 方法中,如果导弹可见,我们绘制了一个白色的矩形作为导弹。 在 `fire` 方法中,如果导弹不可见,我们将导弹的位置设置为玩家的位置加上一些偏移量,并将导弹的速度设置为负数,表示导弹朝上方移动。我们还将导弹的可见性设置为真。 最后,我们添加一些代码将玩家、敌人和导弹连接起来。 ``` import java.awt.event.*; import java.awt.*; import javax.swing.*; import java.util.*; public class Main extends JPanel implements ActionListener { private Timer timer; private Player player; private ArrayList<Enemy> enemies; private ArrayList<Missile> missiles; public Main() { setBackground(Color.BLACK); player = new Player(); enemies = new ArrayList<Enemy>(); missiles = new ArrayList<Missile>(); timer = new Timer(10, this); timer.start(); addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { player.keyPressed(e); } public void keyReleased(KeyEvent e) { player.keyReleased(e); } }); setFocusable(true); } public void actionPerformed(ActionEvent e) { player.move(); for (int i = 0; i < enemies.size(); i++) { Enemy enemy = enemies.get(i); enemy.move(); if (enemy.getBounds().intersects(player.getBounds())) { System.out.println("Game Over!"); System.exit(0); } } for (int i = 0; i < missiles.size(); i++) { Missile missile = missiles.get(i); missile.move(); if (missile.isVisible()) { for (int j = 0; j < enemies.size(); j++) { Enemy enemy = enemies.get(j); if (missile.getBounds().intersects(enemy.getBounds())) { enemy.setVisible(false); missile.setVisible(false); } } } } repaint(); } public void paint(Graphics g) { super.paint(g); player.draw(g); for (int i = 0; i < enemies.size(); i++) { Enemy enemy = enemies.get(i); enemy.draw(g); } for (int i = 0; i < missiles.size(); i++) { Missile missile = missiles.get(i); missile.draw(g); } } public static void main(String[] args) { JFrame frame = new JFrame("Starship"); frame.setSize(600, 400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Main game = new Main(); frame.add(game); frame.setVisible(true); while (true) { game.enemies.add(new Enemy()); game.repaint(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public void fire() { Missile missile = new Missile(); missile.fire(player.getX(), player.getY()); missiles.add(missile); } } ``` 在 `Main` 类的构造函数中,我们创建了玩家、敌人和导弹的对象数组,以及一个定时器。在 `actionPerformed` 方法中,我们调用了各个对象的 `move` 方法,并检查敌人和导弹是否与玩家相撞。如果相撞,我们输出 "Game Over!" 并退出游戏。 在 `paint` 方法中,我们调用了各个对象的 `draw` 方法,以便绘制它们在游戏中的位置和状态。 在 `main` 方法中,我们添加了一个无限循环,每隔一秒创建一个敌人对象,并将其添加到敌人数组中,然后调用 `repaint` 方法刷新游戏画面。 最后,我们添加了一个 `fire` 方法,用于发射导弹。在 `fire` 方法中,我们创建了一个导弹对象,并将其添加到导弹数组中。

相关推荐

最新推荐

recommend-type

使用idea搭建一个spring mvc项目的图文教程

主要介绍了使用idea直接创建一个spring mvc项目的图文教程,本文通过图文并茂的方式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

用IDEA创建一个SSH项目.doc

用idea开发工具创一个SSH框架的java web 项目实例,以及项目相关配置
recommend-type

IDEA 中 30 秒创建一个 Spring Cloud Alibaba 工程

主要介绍了IDEA 中 30 秒生成 Spring Cloud Alibaba 工程,本文通过图文并茂的形式给大家介绍的非常详细对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

使用IDEA中的Maven创建一个Web项目

(一)创建web项目 File -&gt; New -&gt; Project 出现如下图所示: 出现上图所示,项目就创建完毕了。 (二)项目配置 项目目录结构如下所示: 上图中我们可以看到它没有源码目录,和资源文件目录,我们需要自行创建,...
recommend-type

intellij idea创建第一个动态web项目的步骤方法

主要介绍了intellij idea创建第一个动态web项目的步骤方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

SQL怎么实现 数据透视表

SQL可以通过使用聚合函数和GROUP BY子句来实现数据透视表。 例如,假设有一个销售记录表,其中包含产品名称、销售日期、销售数量和销售额等信息。要创建一个按照产品名称、销售日期和销售额进行汇总的数据透视表,可以使用以下SQL语句: ``` SELECT ProductName, SaleDate, SUM(SaleQuantity) AS TotalQuantity, SUM(SaleAmount) AS TotalAmount FROM Sales GROUP BY ProductName, SaleDate; ``` 该语句将Sales表按照ProductName和SaleDat
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。