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
相关产品推荐
相关产品推荐

