【问题标题】:Generating a Random Location Within a Given Range (that can be positive or negative)在给定范围内生成随机位置(可以是正数或负数)
【发布时间】:2015-08-03 09:58:48
【问题描述】:

目前我有这个代码。

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 之间的数字?

【问题讨论】:

  • 您只希望这些位置跨一个街区吗?
  • @kmecpp 可以说我想要一个随机的 x,z 可以高于最大值,低于最小值,所以它可以是 1000,1000 但不是 999,999 可以是 -1000,-1000 但不是-999.-999
  • 对您的图片有点困惑...您想要一个位置还是多个位置?喜欢在戒指中?
  • 1 个位置可以是 1000 或更多,1000 或更多 | -1000 或更多,-1000 或更多但不能为 999 或更少,999 或更少 | -999 或更低,-999 或更低
  • 你能举个例子 min max 并提供一个可接受的值列表,然后提供一个不可接受的值列表,这样我就知道你想要什么了吗?

标签: java random location bukkit radius


【解决方案1】:

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

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();
}

【讨论】:

  • 另一个问题,现在它们在右上、左上、右下、左下生成。但不是在左、右、上、下。
  • i.gyazo.com/cece1143ee7980cdd2594fd56d049d36.png 红色方框是正在生成位置的位置。
  • @Danielngx-development 您能否发布更多代码,以便我确切知道您在使用该方法做什么?
  • @Danielngx-development 啊哈,比我最初想象的要困难一些。我更新了我的原始答案,但您可能只想考虑将玩家传送到任何随机位置。这个盒子的东西似乎不必要地复杂:P
  • 问题是,随机 tp 的意思是将玩家从出生点传送到随机位置。如果我将它设置为 1 个大盒子,随机传送回 spawn 似乎不太好。
【解决方案2】:

我无法评论kmecpp所说的补充一点,不要循环遍历所有Y块以检查它们是否为空气。这比使用getHighestBlockYAt(x, z); 更长。这将返回该位置世界上最高块的 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());

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

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

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;

如果你想让它们不会传送到 spawn,你需要设置另外六个 int,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2016-05-04
    相关资源
    最近更新 更多