java实现飞机大战(简单版)

2023-11-17

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.input.KeyCode;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import java.util.ArrayList;
import java.util.List;

public class PlaneWar extends Application {

    private final int WIDTH = 800;
    private final int HEIGHT = 600;
    private final int PLAYER_SPEED = 5;
    private final int BULLET_SPEED = 10;
    private final int ENEMY_SPEED = 3;
    private final int SCORE_STEP = 10;
    private final int ENEMY_GENERATE_INTERVAL = 100;
    private final Image playerImage = new Image("file:player.png");
    private final Image enemyImage = new Image("file:enemy.png");
    private final Image bulletImage = new Image("file:bullet.png");

    private int score = 0;
    private int enemyGenerateCount = 0;

    private boolean upPressed = false;
    private boolean downPressed = false;
    private boolean leftPressed = false;
    private boolean rightPressed = false;

    private List<Bullet> playerBullets = new ArrayList<>();
    private List<Bullet> enemyBullets = new ArrayList<>();
    private List<Enemy> enemies = new ArrayList<>();

    private Player player = new Player(100, 300, playerImage);

    private class Bullet {
        private int x, y;
        private Image image;

        public Bullet(int x, int y, Image image) {
            this.x = x;
            this.y = y;
            this.image = image;
        }

        public void move(boolean up) {
            if (up) {
                y -= BULLET_SPEED;
            } else {
                y += BULLET_SPEED;
            }
        }

        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }

        public Image getImage() {
            return image;
        }
    }

    private class Enemy {
        private int x, y;
        private Image image;
        private int speed;
        private int health;

        public Enemy(int x, int y, Image image, int speed, int health) {
            this.x = x;
            this.y = y;
            this.image = image;
            this.speed = speed;
            this.health = health;
        }

        public void move() {
            x -= speed;
        }

        public boolean shoot() {
            if (Math.random() < 0.01) {
                enemyBullets.add(new Bullet(x + 25, y + 50, bulletImage));
                return true;
            }
            return false;
        }

        public boolean isHit(int x, int y) {
            if (x > this.x && x < this.x + 50 && y > this.y && y < this.y + 50) {
                return true;
            }
            return false;
        }

        public void hit() {
            health--;
        }

        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }

        public Image getImage() {
            return image;
        }

        public int getHealth() {
            return health;
        }
    }

    private class Player {
        private int x, y;
        private Image image;
        private int health;

        public Player(int x, int y, Image image) {
            this.x = x;
            this.y = y;
            this.image = image;
            this.health = 3;
        }

        public void move() {
            if (upPressed && y > 0) {
                y -= PLAYER_SPEED;
            }
            if (downPressed && y < HEIGHT - 50) {
                y += PLAYER_SPEED;
            }
            if (leftPressed && x > 0) {
                x -= PLAYER_SPEED;
            }
            if (rightPressed && x < WIDTH - 50) {
                x += PLAYER_SPEED;
            }
        }

        public boolean shoot() {
            if (Math.random() < 0.05) {
                playerBullets.add(new Bullet(x + 25, y - 10, bulletImage));
                return true;
            }
            return false;
        }

        public boolean isHit(int x, int y) {
            if (x > this.x && x < this.x + 50 && y > this.y && y < this.y + 50) {
                return true;
            }
            return false;
        }

        public void hit() {
            health--;
        }

        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }

        public Image getImage() {
            return image;
        }

        public int getHealth() {
            return health;
        }
    }

    private void update() {
        player.move();
        for (Bullet bullet : playerBullets) {
            bullet.move(true);
        }
        for (Bullet bullet : enemyBullets) {
            bullet.move(false);
        }
        enemyGenerateCount++;
        if (enemyGenerateCount >= ENEMY_GENERATE_INTERVAL) {
            enemies.add(new Enemy(WIDTH, (int) (Math.random() * (HEIGHT - 50)), enemyImage, ENEMY_SPEED, 1));
            enemyGenerateCount = 0;
        }
        for (Enemy enemy : enemies) {
            enemy.move();
            if (enemy.shoot()) {
                continue;
            }
            for (Bullet bullet : playerBullets) {
                if (enemy.isHit(bullet.getX(), bullet.getY())) {
                    enemy.hit();
                    if (enemy.getHealth() == 0) {
                        enemies.remove(enemy);
                        score += SCORE_STEP;
                    }
                    playerBullets.remove(bullet);
                    break;
                }
            }
        }
        for (Bullet bullet : enemyBullets) {
            if (player.isHit(bullet.getX(), bullet.getY())) {
                player.hit();
                enemyBullets.remove(bullet);
                break;
            }
        }
        for (Enemy enemy : enemies) {
            if (player.isHit(enemy.getX() + 25, enemy.getY() + 50)) {
                player.hit();
                enemies.remove(enemy);
                break;
            }
        }
    }

    @Override
    public void start(Stage primaryStage) {
        Group root = new Group();
        Scene scene = new Scene(root, WIDTH, HEIGHT, Color.BLACK);
        Canvas canvas = new Canvas(WIDTH, HEIGHT);
        root.getChildren().add(canvas);
        GraphicsContext gc = canvas.getGraphicsContext2D();

        scene.setOnKeyPressed(event -> {
            if (event.getCode() == KeyCode.UP) {
                upPressed = true;
            }
            if (event.getCode() == KeyCode.DOWN) {
                downPressed = true;
            }
            if (event.getCode() == KeyCode.LEFT) {
                leftPressed = true;
            }
            if (event.getCode() == KeyCode.RIGHT) {
                rightPressed = true;
            }
            if (event.getCode() == KeyCode.SPACE) {
                player.shoot();
            }
        });

        scene.setOnKeyReleased(event -> {
            if (event.getCode() == KeyCode.UP) {
                upPressed = false;
            }
            if (event.getCode() == KeyCode.DOWN) {
                downPressed = false;
            }
            if (event.getCode() == KeyCode.LEFT) {
                leftPressed = false;
            }
            if (event.getCode() == KeyCode.RIGHT) {
                rightPressed = false;
            }
        });

        new AnimationTimer() {
            public void handle(long currentNanoTime) {
                gc.clearRect(0, 0, WIDTH, HEIGHT);
                update();
                gc.drawImage(player.getImage(), player.getX(), player.getY());
                for (Bullet bullet : playerBullets) {
                    gc.drawImage(bullet.getImage(), bullet.getX(), bullet.getY());
                }
                for (Bullet bullet : enemyBullets) {
                    gc.drawImage(bullet.getImage(), bullet.getX(), bullet.getY());
                }
                for (Enemy enemy : enemies) {
                    gc.drawImage(enemy.getImage(), enemy.getX(), enemy.getY());
                }
                gc.setFill(Color.WHITE);
                gc.fillText("Score: " + score, 10, 20);
                gc.fillText("Health: " + player.getHealth(), 10, 40);
                if (player.getHealth() == 0) {
                    gc.setFill(Color.RED);
                    gc.fillText("Game Over", WIDTH / 2 - 50, HEIGHT / 2);
                    this.stop();
                }
            }
        }.start();

        primaryStage.setTitle("Plane War");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

这是一个基于JavaFX的游戏框架,实现了玩家飞机和敌机的移动、射击等基本功能。你可以在此基础上进行开发和完善。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java实现飞机大战(简单版) 的相关文章

  • 在 Spring Boot 中重新加载/刷新缓存

    我正在使用 Spring Boot 对于缓存 我使用 Ehcache 到目前为止一切正常 但现在我必须重新加载 刷新 那么我该如何执行此操作 以便我的应用程序不会出现任何停机时间 我在Spring Ehcache中尝试了很多方法 但它不起作
  • 为什么在使用 repaint() 而不是使用 getParent().repaint() 时会出现此 Swing 错误?

    这个问题是基于我不久前在一个简单的 Swing 骰子程序中遇到的问题 我发布的原始问题是here https stackoverflow com questions 22306637 mystery concurrency componen
  • Criteria eager fetch-joined 集合以避免 n+1 选择

    假设 Item 和 Bid 是实体 一个 Item 有多个 Bid 它们被映射到休眠在典型的父子关系中
  • 在游戏框架中编写功能测试的正确方法

    在为基于 play1 2 4 的 web 应用程序编写功能测试时 我对如何正确编码感到有点困惑 困惑在于所涉及的事务边界 我在某处读到每个测试都有自己的事务 在我的应用程序中 用户可以登录并向购物车添加一些商品 然后他可以提供一个地址 以便
  • 使用 CXF 通过 HTTP 基本身份验证使用 Web 服务时出现 401 错误

    我正在尝试在 JUnit 测试中使用使用 HTTP 基本身份验证 使用 Apache CXF 的远程 Web 服务 我收到的错误是 javax xml ws WebServiceException Failed to access the
  • 在Tomcat中设置环境变量TESSDATA_PREFIX

    我们正在使用名为 Tess4J 的 Tesseract OCR Java 库 如果作为独立应用程序运行 它可以正常工作 它需要一个名为 TESSDATA PREFIX 的变量 其中包含 tessdata 配置和其他字符集相关文件 它也可以与
  • IntelliJ 建议错误的 @NotNull 注释

    IntelliJ 建议导入com sun istack internal NotNull以下程序中的 NotNull 注释 这是错误的 public class Test implements Comparable
  • Android 防火墙与 VpnService

    我正在尝试使用 BS 项目的 VpnService 为 Android 实现一个简单的防火墙 我选择 VpnService 因为它将在非 root 设备上运行 它将记录连接并让您过滤连接 基于IP 有一个应用程序可以做到这一点 因此这是可能
  • Android 上的自定义视图和窗口属性

    我想要做的是在我的应用程序顶部添加一个视图 该视图类似于过滤器视图 我想操纵屏幕的颜色 并且我还希望能够同时更改屏幕的亮度时间 这两件事似乎是分开起作用的 但不能一起起作用 这是我的代码 添加视图 colourView new Layer
  • 添加和完成 PHP 源代码文档的工具 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有几个已完成的较旧的 PHP 项目 其中有很多内容 我想以 javadoc phpDocumentor
  • 更改 Spring Web 应用程序的默认会话超时

    我必须测试一个由 spring 和 jsp 编写的 Web 应用程序 应用程序的默认会话超时为 30 分钟 我想减少会话超时 为此 我改变了web xml文件输入tomcatInstallationLocation conf 但这不起作用
  • 不想保留一对一的实体

    假设我有两节课Employee and Department In Employee我已经写了 OneToOne fetch FetchType EAGER cascade CascadeType ALL JoinColumn name d
  • 为什么 Cassandra 客户端在生产中没有 epoll 时会失败? [复制]

    这个问题在这里已经有答案了 当我在本地运行服务时 我收到一条警告 指出 epoll 不可用 因此它使用 NIO 很公平 当我将其部署到 Kubernetes 中时 我得到了以下信息 这导致服务无法运行 2017 03 29T19 09 22
  • APACHE POI 从 Java 中的 Excel 获取精确的字体颜色

    在 Excel 工作表中 如何使用 Java 中的 Apache POI 获取准确的字体颜色值 我试图通过使用来获取字体颜色 org apache poi ss usermodel Font f book getFontAt style g
  • 从字符串中提取文本 Java

    使用此字符串 ADACADABRA 如何从java中的字符串 ADACADABRA 中提取 CADA 以及如何提取 和 之间的id从下面的链接 http www youtube nocookie com embed zaaU9lJ34c5
  • JSF“总”变量类似于 JSTL 中的 c:set

    我不喜欢 JSF 但我需要用它来解决这个问题 我正在 纯 JSF 中工作 所以这就是我基本上需要的 但我不知道如何用 JSF 来实现它
  • JSF - 实施受限页面过滤器

    我正在关注 BalusC 的回答JSF 2 0 如何获取在浏览器地址栏中输入的 URL https stackoverflow com questions 4105263 jsf 2 0 how to get the url that is
  • 需要同步仅增量计数器吗?

    我使用整数作为计数器 该整数只会增加 并且肯定有多个线程会同时增加它 当没有其他线程尝试访问其值时 在程序执行结束时读取该计数器的值 我假设我不必为这种仅增量计数器使用锁或任何类型的同步 这是正确的吗 如果这有什么区别的话 我用 Java
  • Java分数计算器

    我对 Java 编程还很陌生 我的 AP 计算机编程课程有作业要完成 所以请耐心等待 我必须弄清楚如何将两个分数相乘 我想知道是否有任何方法可以在方法内部声明变量并在该方法外部使用它 我在介绍方法中的 while 循环 谢谢您 希望这不会令
  • selenium 没有找到合适的方法,直到(ExpectedCondition)

    这是有线的问题 我导入的项目运行 100 几个月前 今天我已将其与依赖项一起导入 但存在问题WebDriverWait 这是我的代码 WebDriverWait driverWait new WebDriverWait driver 100

随机推荐