我开始进入随机世界生成,我对随机数生成如何工作(实际上是伪随机数)有一个想法,但我不知道如何让世界看起来“漂亮”,换句话说,不仅仅是基于它给我的随机x,y来放置块,而是让它看起来很流畅。
这将是每个世界1代。所以一切都是在开始时创建的。
我刚才想到了一个算法,但问题是它只会使用无数的嵌套if循环,这可能需要超过必要的时间。我在考虑以下几点:
概念化算法并不是一个大问题,我遇到的困难是从第2步及以下开始实际代码。基于上述算法或您想到的算法,您将如何启动代码?我不是要求制作实际的代码,而是要了解它的外观。
我知道这个问题不准确并且可以有多个答案,但我看到很多类似于这个问题的问题。
答案 0 :(得分:2)
hmm看起来像平面(或立方)地图填充。从我的角度来看,首先你需要一些数据库
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]
+方向矩阵,地图坐标将与网格对齐。有许多方法可以调整此代码,它只是一个起始模板。希望它有所帮助。
<强> P.S。强>
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