gpt4 book ai didi

algorithm - 随机世界生成

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:36 24 4
gpt4 key购买 nike

我开始研究随机世界生成,我知道随机数生成的工作原理(实际上是伪随机数),但我不知道如何让世界看起来“不错”,换句话说,不仅要根据它给我的随机 x、y 来放置方 block ,还要让它看起来很平滑。

这将是每个世界 1 次生成。所以一切都是在开始时创建的。

我刚才在想一个算法,但问题是它只会使用无穷无尽的嵌套 if 循环,这可能会花费比必要时间更多的时间。我在想以下几点:

  1. 在 map 上随机选择一个位置并将生成点放置在该位置。
  2. 开始根据重生位置 build 街道,就像重生位置是 16世界边缘附近的空间 build 房屋,否则开始 build 街道。
  3. 基于之前生成的街道的地点结构。
  4. 放置杂项。

将算法概念化不是什么大问题,我遇到的困难是从第 2 步及以下开始实际代码。基于上面的算法或者你想到的一个算法,你会怎么开始写代码?我不是要求编写实际代码,只是想知道它的外观。

我知道这个问题并不精确并且可以有多个答案,但我已经看到许多与此问题类似的问题都有一种奇怪的方法。

最佳答案

嗯看起来像平面(或立方体) map 填充。在我看来,首先你需要一些数据库

struct _object
{
string name,help,info; // texts for later use
int siz[3]; // grid size of object
int pos[3]; // placement pos (center or what ever)
// other stuff like: mesh-id,color,hit points,...
};

struct _dependency
{
int objid
List<int> near; // can be near this objects (can add probability)
List<int> far; // cannot be near this objects (can add probability,min distance)
};

List<_object> object; // DBS of all object types
List<_dependency> depend; // DBS of object dependency

然后您需要从 ini 文件或其他文件中初始化此 DBS。之后你需要创建世界地图。为简单起见,让它仅由一个方形城镇和单层(无子地形)组成,大小和位置可以是随机的。

List<_object> obj;   // DBS of placed objects, could be lesser derivate of previous _object to conserve memory requirements
const int N=100;
int[N][N] map; // placement map, containing placed obj id, or -1 for empty space

所以现在你需要一些城镇生成函数来填充 map[N][N]:

void genere()
{
int i,j,x,y,xx,yy,objid,objix;
int _min_complexity=N/10; // this can also be random
int _max_complexity=N; // this can also be random
// clear map
for (i=0;i<N;i++)
for (j=0;j<N;j++)
map[i][j]=-1;
int complexity=_min_complexity+random(_max_complexity-_min_complexity);
for (i=0;i<complexity;)
{
// random placenet position
x=random(N);
y=random(N);
// random object, should take in mind object[].near and closest objects in map[y][x]
objid=random(object.num);
if (check if map[][] is empty enough to place object[objid] to x,y,z)
if (check if near x,y position is not bad type of object already object[].far)
{
// add new object to list
objix=obj.add(object[objid]);
// add new object to map
int *siz=obj[objix].siz
int *pos=obj[objix].pos
x+=pos[0];
y+=pos[1];
for (yy=0;yy<siz[1];yy++)
for (xx=0;xx<siz[0];xx++)
map[y+yy][x+xx]=objid;
i++;
}
}
}

位置也可以是 double[3] + 方向矩阵,然后 map 坐标将与网格对齐。有很多方法可以调整此代码,它只是一个起始模板。希望对您有所帮助。

附言

List<type> l;
l.num - number of items in list
l[i] - i item from list
i=l.add(a) - add new item a to list and returns its index

关于algorithm - 随机世界生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18609168/

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