gpt4 book ai didi

java - 噪声产生 : 'Room Noise'

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:35:26 29 4
gpt4 key购买 nike

上周我正在开发一个世界生成器(用于 Minecraft 模组)。但是,我不只是在寻找 Perlin 噪声,而是在寻找基于细胞噪声的东西。我想生成一种地下实验室,存在几个不同大小的房间。

为了解释这个问题,我使用了二维示例。

噪声发生器获取一个网格单元位置 (int x, int y),并返回具有以下结构的对象:

boolean top;
boolean right;
boolean down;
boolean left;

int roomType;

4 个 boolean 值代表启用或禁用的墙:

roomType分别代表房间的类型。

最终的结果应该是这样的: enter image description here
在这里,背景棋盘图案代表基础网格,黑线代表墙壁。这只是一个可以生成的简单示例,但在实际情况中,网格在 x 和 y 方向上都是无限的

我现在遇到的问题是噪声发生器只接受 x 和 y 坐标,这是它应该生成的网格单元格的坐标。有一个种子,我可以为哈希函数生成更多随机种子:

long seed = 0x75fd239de48;

Random r = new Random(seed);
int seed1 = r.nextInt();
int seed2 = r.nextInt();
// etc.

我可以使用哈希函数:Hash.hash2D(int seed, int x, int y),它返回一个随机的 double 作为坐标,根据种子。

这将提供为周围细胞生成信息的能力。

要轻松生成更大的房间,您可以为房间设置最大尺寸,并检查试图大于 1x1 的房间区域。如果它们在那里,并且将跨越到当前房间,则该房间将是另一个房间的延伸。然而,检查一个房间是否会扩展需要检查它是否已经扩展(否则,不需要的房间扩展会出现在扩展另一个房间的基础上),这会进入无限循环。

在我的例子中,有一个房间类型、大小和重量的给定表格。示例:

name:   size [weight]
room-1: 1x1 [128]
room-2: 1x1 [128]
room-3: 2x1 [16]
room-4: 1x2 [16]
room-5: 2x2 [8]
room-6: 3x1 [4]
room-7: 1x3 [4]

还有很多其他的,尺寸最大为 5x5,但我使用这个示例列表来回答我的问题。此示例中的最大尺寸为 3x3(仅最大宽度乘以最大高度)。

这里我有一个 Java 中一些基本设置的示例类:

public class RoomNoise {
private final long seed;
private final Random rand;
public RoomNoise( long seed ) {
this.seed = seed;
this.rand = new Random( seed );
}

public enum RoomTypes {
ROOM1( 1, 1, 128 ),
ROOM2( 1, 1, 128 ),
ROOM3( 2, 1, 16 ),
ROOM4( 1, 2, 16 ),
ROOM5( 2, 2, 8 ),
ROOM6( 1, 3, 4 ),
ROOM7( 3, 1, 4 );

public final int width;
public final int height;
public final int weight;
private RoomTypes( int w, int h, int weight ) {
width = w;
height = h;
this.weight = weight;
}
}

public static class Output {
public final RoomTypes roomType;
public final boolean upWall;
public final boolean rightWall;
public final boolean downWall;
public final boolean leftWall;
public Output( RoomTypes type, boolean u, boolean r, boolean d, boolean l ) {
roomType = type;
upWall = u;
rightWall = r;
downWall = d;
leftWall = l;
}
}

public Output generate( int x, int y ) {
// What should be here
}
}

我正在寻找generate方法的内容,为此我尝试了很多方法,但每次都陷入死循环或不起作用。

有什么方法可以在 O(N) 中生成这种噪声,N 小于无穷大?如果有办法,那是哪种方式,我该如何实现?我已经在互联网上搜索并尝试了很多东西(现在已经 3 周了),但仍然没有找到解决方案。

我使用 Java 1.8,但我更喜欢任何 C 风格的语言。

同样,我有这个哈希函数:

Hash.hash2D( int seed, int x, int y );

编辑:

预期结果:
enter image description here
蓝线是稍后生成的走廊。忘了他们吧。


备注:

我无法手动加载和删除 block (网格单元),基本 API (Minecraft) 正在为我做这件事。它只给了我坐标(这取决于玩家的互动),我应该还给一个(部分)适合该坐标 block 的房间。我也知道,一旦生成了一个 block ,就不会再生成了。

最佳答案

我不确定我是否完全理解您要解决的问题,所以如果有不足之处,请随时发表评论:

如果你想生成一个无限 网格,你只能近似无限。我认为您有两个选择:

  1. 生成一个“足够大”的网格。这可能是时间/空间密集型的,但如果您需要多少有上限,并且一次完成所有操作是可行的,那么这是最简单的选择。例如。如果用户不可能使其距离中心超过 1000 个方格,则生成 2000x2000。

或者:

  1. 使用延迟评估。这意味着,在需要之前不要生成任何东西。如果用户靠近尚未生成的区域,则生成它。另一方面,如果您需要释放资源,您也可以丢弃用户不太可能返回的旧部分。例如:将您的区域切割成正方形(例如 20x20 或 1000x1000),并根据需要在玩家靠近它们时生成额外的相邻正方形,或者 map 向该方向平移等。

关于java - 噪声产生 : 'Room Noise' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50220948/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com