2013-09-04 2 views
2

Я начинаю разбираться в генерации случайного мира, у меня есть идея о том, как работает генерация случайных чисел (на самом деле псевдослучайные числа), но у меня нет хорошей идеи, как заставить мир выглядеть " nice ", другими словами, не просто размещать блоки на основе случайного x, y, который он мне дает, а сделать его гладким.Случайное мировое поколение

Это будет 1 поколение за мир. Итак, все создается в начале.

Я думал об алгоритме несколько мгновений назад, но проблема в том, что он просто использовал бы бесконечное количество вложенных циклов, которые, вероятно, занимали бы более чем необходимое время. Я подумал о следующем:

  1. Выберите случайное местоположение на карте и поместите точку появления в этом месте.
  2. Начните строить улицу, основываясь на месте появления, например, если место появления некрополя составляет 16 Пространства возле краю мира строят дом, иначе начните строить улицу.
  3. Основано на ранее созданных структурах улиц вокруг.
  4. Место разное.

Концептуальный алгоритм - это не проблема, с чем я с трудом сталкивается, начиная с действительного кода с шага 2 и ниже. Основываясь на вышеупомянутом алгоритме или алгоритме, о котором вы думаете, как бы вы начали код? Я не прошу, чтобы действительно был создан код, просто идея о том, как он будет выглядеть.

Я знаю, что этот вопрос не является точным и может иметь несколько ответов, но я видел много вопросов, похожих на этот, имеющих странный подход.

+0

Внедрение решения, которое является достаточно эффективным является реальной проблемой здесь –

+1

Вашу конкретная реализация может не подходить для этого, но когда вы говорите гладкий шум, который заставляет меня думать о Перлином шуме (или технически фрактальный шум из несколько октав шума перлина); выглядит как естественный ландшафт, но может использоваться и для других вещей.Процессно созданные миры (из minecraft ilk) очень сильно влияют на шум perlin (или симплекс-шум) –

+0

Ознакомьтесь с L-Systems для создания уличных рисунков, вы можете получить интересные (интересные) результаты – VoronoiPotato

ответ

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 

Затем вам необходимо инициализировать этот 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 
+0

Мне нравится, как вы разработали идею, Я, вероятно, воспользуюсь этим методом с помощью нескольких настроек кода и алгоритма. – Debels

+0

, как вы писали ранее, есть много подходов к этой проблеме ... это самый простой, о котором я думаю. вы можете инкапсулировать его в классы (класс города, мир, поле), добавлять маршруты и т. д. Я предлагаю вам хранить объекты в двух отдельных структурах/классах с фиксированными данными (размер, перемещение, максимальная hp, информационные тексты ...) и второй с только wariables (фактические hitpoints, карты повреждений, раскраска, ....) фиксирован для объекта [] и переменной для obj []. после генерации вы можете удалить карту [] [], .. или использовать ее для радара, линии визирования, планирования маршрута ... – Spektre

+0

Это может быть немного лингвистическая стрейч, чтобы рассмотреть список объектов в базе данных ... – VoronoiPotato

Смежные вопросы