在给定范围内生成随机位置(可以是正数或负数)

Generating a Random Location Within a Given Range (that can be positive or negative)

目前我有这个代码。

public static Location getRandomLocation(int min, int max, World w) {
    int x = CommonUtils.randomInt(min, max);
    int y = 255;
    int z = CommonUtils.randomInt(min, max);
    while (w.getBlockAt(x, y, z).getType() == Material.AIR) {
        y--;
    }
    return w.getBlockAt(x, y + 1, z).getLocation();
}

我想为 x 和 z 坐标生成也可以为负的随机值。我遇到的问题是,我需要数字的绝对值仍然大于 min 值,即使实际数字不是。

更简单地说,现在它只能生成minmax之间的随机位置。我还如何包括 -min-max 之间的数字?

好的,现在我得到你想要的。如果您只需要使其适用于负数,那么您已经有了基本的工作代码。一个简单的解决方法是在已经生成的数字上添加一个随机符号。像这样的东西应该可以正常工作:

public static Location getRandomLocation(int min, int max, World world) {
    int x = CommonUtils.randomInt(-max, max);//Random x coord
    int z;
    if (Math.abs(x) < min) {
        z = CommonUtils.randomInt(min, max);//If x coord is less than the minimum choose a z coord that is within range
        if (new Random().nextBoolean()) {//Top or bottom of range
            z = -z;
        }
    } else {
        z = CommonUtils.randomInt(-max, max);//Else choose any z coord
    }
    int y = 255;
    while (world.getBlockAt(x, y, z).getType() == Material.AIR) {
        y--;
    }
    return world.getBlockAt(x, y + 1, z).getLocation();
}

有一点要补充到 kmecpp 所说的内容,因为我无法发表评论,不要遍历所有 Y 块来检查它们是否是空气。这比使用 getHighestBlockYAt(x, z); 需要更长的时间。这将 return 世界上最高方块在该位置的 Y 位置。例如:

//Get your Random location with random x and y, and set the y to something like 5.
int newY = getServer().getWorld(worldName).getHighestBlockYAt(loc.getX(), loc.getZ());
Location newLoc = new Location(loc.getWorld(), loc.getX(), newY, loc.getZ());

关于负数和正数范围内的随机传送,这是我在服务器上使用的代码。 (请注意,这会将它们传送到重生点)

这会将玩家传送到一个以 0,0 为中心的 12000 格宽的正方形中的随机位置。

Random rand = new Random();
int max = 6000;
int min = -6000;
int locX = rand.nextInt((max - min) + 1) + min;
int locZ = rand.nextInt((max - min) + 1) + min;
Location loc = new Location(getServer().getWorld("wild"), locX, 20, locZ);
loc.setY(getServer().getWorld("wild").getHighestBlockYAt(locX, locZ));
Block b = getServer().getWorld("world").getBlockAt((int) loc.getX(), (int) loc.getY() - 1, (int) loc.getZ());
while(b.getType() == Material.LAVA || b.getType() == Material.WATER){
    locX = rand.nextInt((max - min) + 1) + min;
    locZ = rand.nextInt((max - min) + 1) + min;
    loc = new Location(getServer().getWorld("wild"), locX, 20, locZ);
    loc.setY(getServer().getWorld("wild").getHighestBlockYAt(locX, locZ));
    b = getServer().getWorld("world").getBlockAt((int) loc.getX(), (int), loc.getY() - 1, (int) loc.getZ());
}
return loc;

如果你想让它们不传送到出生点,你需要设置另外六个整数,spawnXMin,spawnXMax,以及对应的Y和Z。然后做一个简单的检查:

int spawnXMin = 100, spawnXMax = 200, spawnYMin = 0, spawnYMax = 255, spawnZMin = 150, spawnZMax = 250;
while(!(loc.getX() < spawnXMax && loc.getX() > spawnXMin && loc.getY() < spawnYMax && loc.getY() > spawnMin && loc.getZ() < spawnZMax && loc.getZ() > spawnZMin)) {
    //Player is not in spawn so redo above while code
}
//Found Location!
//Teleport Player