You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何根据与玩家的距离动态排序Zombie对象的ArrayList

实现方案

首先确认两个前置条件:

  • 你的逻辑类中已持有玩家当前坐标的Point对象,示例命名为playerPosition
  • Zombie类提供getPosition()公共方法,返回自身存储的坐标Position对象

步骤1:修正原有遍历删除的逻辑漏洞

原有循环中边遍历边删除会触发索引错位,推荐直接用removeIf过滤不可见僵尸:

zombies.removeIf(zombie -> !zombie.isVisible());

步骤2:对可见僵尸按与玩家的距离升序排序

排序时可以直接用距离平方代替实际距离计算,省掉开根号的性能开销,排序结果完全一致。

Java 8+ 简洁写法(推荐)

zombies.sort((z1, z2) -> {
    double dist1 = Math.pow(z1.getPosition().getX() - playerPosition.getX(), 2)
                    + Math.pow(z1.getPosition().getY() - playerPosition.getY(), 2);
    double dist2 = Math.pow(z2.getPosition().getX() - playerPosition.getX(), 2)
                    + Math.pow(z2.getPosition().getY() - playerPosition.getY(), 2);
    return Double.compare(dist1, dist2);
});

如果你用的是Java内置的java.awt.Point、javafx.geometry.Point2D类,可以直接调用自带的distanceSq方法简化代码:

zombies.sort((z1, z2) -> Double.compare(
    z1.getPosition().distanceSq(playerPosition),
    z2.getPosition().distanceSq(playerPosition)
));

兼容Java 8之前版本的写法

Collections.sort(zombies, new Comparator<Zombie>() {
    @Override
    public int compare(Zombie z1, Zombie z2) {
        double dist1 = Math.pow(z1.getPosition().getX() - playerPosition.getX(), 2)
                        + Math.pow(z1.getPosition().getY() - playerPosition.getY(), 2);
        double dist2 = Math.pow(z2.getPosition().getX() - playerPosition.getX(), 2)
                        + Math.pow(z2.getPosition().getY() - playerPosition.getY(), 2);
        return Double.compare(dist1, dist2);
    }
});

步骤3:选取最近的僵尸作为目标

排序后列表第一个元素就是距离最近的目标:

if (!zombies.isEmpty()) {
    this.zombie = zombies.get(0);
}

修改后完整的zombieSpawn方法

public void zombieSpawn(){
    // 移除所有不可见僵尸
    zombies.removeIf(zombie -> !zombie.isVisible());
    // 无僵尸时直接返回,可根据业务需求处理无目标的情况
    if (zombies.isEmpty()) {
        this.zombie = null;
        return;
    }
    // 按距离升序排序
    zombies.sort((z1, z2) -> {
        double dist1 = Math.pow(z1.getPosition().getX() - playerPosition.getX(), 2)
                        + Math.pow(z1.getPosition().getY() - playerPosition.getY(), 2);
        double dist2 = Math.pow(z2.getPosition().getX() - playerPosition.getX(), 2)
                        + Math.pow(z2.getPosition().getY() - playerPosition.getY(), 2);
        return Double.compare(dist1, dist2);
    });
    // 取最近的第一个僵尸作为目标
    this.zombie = zombies.get(0);
}

内容的提问来源于stack exchange,提问作者B_Recon17

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 22:27:02