随机世界一代

时间:2013-09-04 08:42:05

标签: algorithm random random-seed

我开始进入随机世界生成,我对随机数生成如何工作(实际上是伪随机数)有一个想法,但我不知道如何让世界看起来“漂亮”,换句话说,不仅仅是基于它给我的随机x,y来放置块,而是让它看起来很流畅。

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

我刚才想到了一个算法,但问题是它只会使用无数的嵌套if循环,这可能需要超过必要的时间。我在考虑以下几点:

  1. 在地图上选择一个随机位置,并将生成点放在该位置。
  2. 根据生成位置开始构建街道,就像生成位置是16一样 世界边缘附近的空间会建造房屋,否则就会开始修建一条街道。
  3. 基于先前生成的街道周围的地方结构。
  4. 放置misc。
  5. 概念化算法并不是一个大问题,我遇到的困难是从第2步及以下开始实际代码。基于上述算法或您想到的算法,您将如何启动代码?我不是要求制作实际的代码,而是要了解它的外观。

    我知道这个问题不准确并且可以有多个答案,但我看到很多类似于这个问题的问题。

1 个答案:

答案 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