Генерация мира

Темы, связанные с проектированием и программированием roguelike-игр

Модераторы: Sanja, Максим Кич

Аватара пользователя
Troll
Сообщения: 59
Зарегистрирован: 08 июл 2007, 12:55
Откуда: Одесса

Сообщение Troll » 10 июл 2007, 14:42

Maelstrom писал(а):Качается какая-то лыжа в 155 байт...
У меня тоже, да и по другим файлам на форуме лежащим тоже так...

Dmiry
Сообщения: 168
Зарегистрирован: 14 июн 2007, 10:32

Сообщение Dmiry » 10 июл 2007, 17:28

Вот текст этого файлика (теги порипаны):

Warning readfile() has been disabled for security reasons in /home/rlgclu00/public_html/forum/download.php on line 197
Первая заповедь фотолюбителя: Проявил себя - закрепи!

Аватара пользователя
Sanja
Администратор
Сообщения: 791
Зарегистрирован: 24 ноя 2006, 12:25
Откуда: Новосибирск
Контактная информация:

Сообщение Sanja » 11 июл 2007, 00:35

Блин, похоже у хостера включён safe mode. Посмотрю что можно сделать.

edit: Ага, значит так, хостер запретил функции чтения файлов, использующиеся в этом моде. Ну и фиг с ним. Пока что ссылки будут во вложениях прямые, можно качать. Дальше посмотрим.

edit2: Тэксь, теперь можно и без прямых ссылок. Ну всё, вроде настроил.

ADB

Сообщение ADB » 12 июл 2007, 20:16

Переписал творение Troll'а на си, получилось нечто вроде

Код: Выделить всё

// Константы







main()
{
   char l;
   unsigned char k,i,j,ni,nj,col;
   bool bb;
   int kol;
   unsigned char pole[x][y];
   
   randomize();
   
   ClearScreen();
   
   for(i=0; i<x; i++)
      for(j=0; j<y; j++)
         pole[i][j] = 0;
         
   for(kol=0; kol<baza; kol++)
   {
      bb = false;
      while(bb==false)
      {
         i = rand()%x;
         j = rand()%y;
         col = rand()%tip + 1;
         if(pole[i][j]==0)
         {
            pole[i][j] = col;
            Draw(i,j, col);
            bb = true;
         }
      }
   } 
   
   while(kol!=x*y)
   {
      bb = false;
      while(bb==false)
      {
         i = rand()%x+1;
         j = rand()%y+1;
         if(pole[i][j]!=0) bb = true;
      } 
      
      k = rand()%(d*4)+1;
      if(k>2*d) ni = i;
      else if(k>d) ni = i + k - d;
           else  ni = i + k - d - 1;
      if(k<=2*d) nj = j;
      else if(k>3*d) nj = j + k -d*3;
           else nj = j + k - d*3 - 1;
           
      if(ni<0) ni = 0;
      if(ni==x) ni = x-1;
      if(nj<0) nj = 0;
      if(nj==x) nj = y-1; 
      
      if(pole[ni][nj]==0)
      {
          pole[ni][nj] = pole [i][j];
          Draw(ni,nj, col);
          kol++;
      }
   }
   
}
У меня цикл while kol<>x*y do входит в бесконечное исполнение.
Заместил в своем генераторе, представленном на сайте в разделе для разработчиков, фрактальный алгоритм - данным...
Вот какую ерунду он рисует :)
http://www.templer.rlgclub.ru/gallery/lgen/lgen_01.gif
http://www.templer.rlgclub.ru/gallery/lgen/lgen_02.gif
http://www.templer.rlgclub.ru/gallery/lgen/lgen_03.gif

Аватара пользователя
Troll
Сообщения: 59
Зарегистрирован: 08 июл 2007, 12:55
Откуда: Одесса

Сообщение Troll » 12 июл 2007, 22:15

ADB писал(а): У меня цикл while kol<>x*y do входит в бесконечное исполнение.
А у меня нет почему то. Вот странно...
Но как-то исправил наверно, раз пишешь
Заместил в своем генераторе, представленном на сайте в разделе для разработчиков, фрактальный алгоритм - данным...
Вот какую ерунду он рисует :)
http://www.templer.rlgclub.ru/gallery/lgen/lgen_01.gif
http://www.templer.rlgclub.ru/gallery/lgen/lgen_02.gif
http://www.templer.rlgclub.ru/gallery/lgen/lgen_03.gif
Я конечно не знаю что тот рисовал, но то что нарисовано на этих картинках этот рисовать никак не может. Если конечно как-то жёстко не поизменять какие-то параметры, но вообще-то и это невозможно. По крайней мере мне не приходит в голову. Судя по всему что-то добавлено - какие-то ограничения на некоторые типы рельефа или неравноценные вероятности для них. Либо остались те, что были под фрактальный и на него настроены.

Лучше выложи тот кусок, который это рисует. И какие там константы установленны?
Или переделанный тобой код под Си, который я могу тут наблюдать, отдельно от остального всего запусти (а ещё лучше в Паскале набери). Будет ессно не очень хорошо (я писал, что нужно настраивать) но уж никак не то что на картинках...

Аватара пользователя
Troll
Сообщения: 59
Зарегистрирован: 08 июл 2007, 12:55
Откуда: Одесса

Сообщение Troll » 12 июл 2007, 22:43

ADB
Кажется, догадался в чём дело...

Размер карты большой по сравнению с 78x23, а количество начальных точек то же? Если в этом - то поставь baza где-то 100 или даже больше.

Ещё раз повторю - НУЖНО НАСТРАИВАТЬ (изменять параметры, добавлять условия итд), это не готовая программа, а так намётка за полчаса.

К слову, параметр d стоит 3 или 2 задавать.

ADB

Сообщение ADB » 13 июл 2007, 08:48

Troll, а распиши, пожалуйста, назначение параметров baza и d.

ADB

Сообщение ADB » 13 июл 2007, 08:52

а ещё лучше в Паскале набери
Если честно, я не умею. :oops:

И какие там константы установленны?
Кстати, различие массивов в паскале и си в том, что в первом случае они начинаются с 1-цы, а во втором - с нуля. Посмотри, пожалуйста, мой код, возможно я не правильно переработал какие-то формулы или условия, учитывая это.

Аватара пользователя
Maelstrom
Мастер
Сообщения: 2062
Зарегистрирован: 26 ноя 2006, 14:19
Откуда: г. Усть-Кирдык
Контактная информация:

Сообщение Maelstrom » 13 июл 2007, 10:36

Вообще, Тролль, опиши свой алгоритм не на всяких там паскалях, а нормальным человеческим языком.
Айв кнгенгах Йог-Сотот

Аватара пользователя
Troll
Сообщения: 59
Зарегистрирован: 08 июл 2007, 12:55
Откуда: Одесса

Сообщение Troll » 13 июл 2007, 16:20

ADB писал(а):
а ещё лучше в Паскале набери
Если честно, я не умею. :oops:
А мне на СИ тяжеленько писать. У меня он и не установлен даже...

Поэтому распишу человеческим. Долго получится (расписываю очень подробно)...

X,Y - размер карты. BAZA - количество начальных очагов. TIP - количество разных рельефов. D - удалённость.

1. Задаем массив X на Y значением элементов которого является тип рельефа. Вначале заполнен несуществующим типом местности (неопределён).

2. Начальные очаги.
Накидываем некоторый набор случайных точек количеством BAZA с каким-то типом рельефа, который для каждой точки рэндомом выбран из количества TIP.
Например, BAZA=20 TIP=5, следовательно после проделанной операции 2 в массиве будут определёнными 20 точек, то есть для каждой из них будет выбран определённый тип из 5-ти возможных рельефов.
Следует учитывать, что если в процессе накидывания при случайном выборе очередной точки выясняется, что эта точка уже задана (для неё уже определён тип местности, то есть она уже выпадала раньше), то следует перебросить, чтобы после операции 2 было выбрано ровно BAZA точек. (Думаю, это и без объяснения понятно, но подробно описываю)

3. Расширение очагов.
***Выбираем одну из уже опредёлённых точек (i,j). Определяем направление. Случайно выбираем число K из диапазона от 1 до D. Если точка, находящаяся от точки (i,j) в выбранном направлении на расстоянии K находится в пределах карты и для неё не определён пока тип рельефа, то определяем рельеф этой точки таким же, как рельеф точки (i,j). Если нет то перекидываем, начиная с ***. (Уточню, что в программе на паскале K сразу определяет и направление и расстояние).

4. Повторяем операцию 3 до тех пор, пока не заполнится вся карта.

Чем больше D - тем более смешанной получится карта, при D=1 типы местности вообще не будут залазить один на другой.
Да, работая таким образом программа дочерта холостых действий произвёдёт... Ну, уж как есть

Примечания.
1. Параметр BAZA кажется удобным ~1-2% от общего числа точек (то есть от произведения X на Y). Это для 4-5 типов рельефа, если типов больше то и BAZA стоить чуть увеличить. Ну и, повторю, что D стоит выбирать 2 или 3. Но это смотреть надо в зависимости от того, что хочется получить.
2. Ну и общие настойки, например, лес в 3 раза чаще болот, и в 2 чаще равнины или как там надо. Ну и другие всякие, типа, что в каком месте карты можно
ADB писал(а):
У меня цикл while kol<>x*y do входит в бесконечное исполнение
Кстати, различие массивов в паскале и си в том, что в первом случае они начинаются с 1-цы, а во втором - с нуля. Посмотри, пожалуйста, мой код, возможно я не правильно переработал какие-то формулы или условия, учитывая это
Очень на то похоже. Измени строку "while(kol!=x*y)" на "while(kol!=x*y-1)", а то и на "while(kol!=(x-1)*(y-1))". Если в паскале при BAZA=20 kol после первой операции равно 20, а после заполнения поля произведению X на Y, то в СИ насколько я понимаю после первой операции kol=19, а после заполнения должно быть равным произведению X на Y минус 1. Хотя может и что-то ещё...


P.S. Чтоб меня ещё раз чёрт дёрнул что-то объяснять... Запарился, блин.

Аватара пользователя
Максим Кич
Администратор
Сообщения: 1642
Зарегистрирован: 03 дек 2006, 20:17
Откуда: Витебск, Беларусь
Контактная информация:

Сообщение Максим Кич » 31 июл 2007, 07:30

ADB писал(а): Кстати, различие массивов в паскале и си в том, что в первом случае они начинаются с 1-цы, а во втором - с нуля. Посмотри, пожалуйста, мой код, возможно я не правильно переработал какие-то формулы или условия, учитывая это.
В Паскале массивы начинаются с чего угодно. Там описываются индексы начального и конечного элементов. Исключение составляют динамические массивы, индексы в которых идут с нуля.
Dump the screen? [y/n]

Аватара пользователя
Максим Кич
Администратор
Сообщения: 1642
Зарегистрирован: 03 дек 2006, 20:17
Откуда: Витебск, Беларусь
Контактная информация:

Сообщение Максим Кич » 27 авг 2007, 14:50

Закончился конкурс картогенераторов. С результатами можно ознакомиться по ссылке:
http://www.dev-spot.com/forums/index.php?topic=4.15
Dump the screen? [y/n]

Аватара пользователя
Troll
Сообщения: 59
Зарегистрирован: 08 июл 2007, 12:55
Откуда: Одесса

Сообщение Troll » 27 авг 2007, 20:31

Максим Кич писал(а):Закончился конкурс картогенераторов. С результатами можно ознакомиться по ссылке:
http://www.dev-spot.com/forums/index.php?topic=4.15
Спасибо за ссылку, сам бы никогда не стал бы искать

По самому конкурсу. Неплохое состязание. Если б я ещё знал английский настолько, чтобы толково оценить правила...
Если предположить, что я смог верно смог перевести все ограничения в правилах, и учитывая месяц на создание; то я вынужден сделать вывод что ихние генераторы, нельзя сказать что хреновые, но как минимум - невыдающиеся.

По очереди если
1. (konijn) Вообще чёрти-что. Это ж додуматся надо генерить кактусы в пустыне.... Сам генератор простейший, судя по свему.
2. (Icey) Город. Толково, но недоработано. Много оформительных эффектов, а мало нужных. Дома повёрнуты чёрти куда и дорог нет к ним.
3. (sinoth) Остров. Всё бы хорошо, песок и речки вообще супер, но эти луга посреди гор... Недоработано.
4. (gerryq) В целом, хорошо. Даже отлично я бы сказал. (Как-то странно двухклеточные коридоры смотрятся...)
5. (microwerx) Такое пишется за минимальное время. Наверно начинающий программер писал.
6. (Seventh Holy Scripture - winner). Совершенно не могу оценить реальность нарисованного, поскольку не понимаю, какой символ чего обозначает. По программе - действительно лучшая. Хотя может лес и не так растёт.

И это нужно учитывать, что показаны лучшие варианты. Сурс-коды не юзал и даже не читал, мне пока незачем.
You see the Troll. He wield giant club in right hand and huge rock in left hand. Troll looks satiaited and not agressive, he look at you with interest. It seems that Troll asks you: "What you do in trollish land?"

Аватара пользователя
Sanja
Администратор
Сообщения: 791
Зарегистрирован: 24 ноя 2006, 12:25
Откуда: Новосибирск
Контактная информация:

Сообщение Sanja » 28 авг 2007, 01:21

Жаль библиотека Roguelike Lib здесь не участвовала (по условиям явно не проходит). Там есть немало разнотипных картогенераторов. Довольно хороших.

Аватара пользователя
Maelstrom
Мастер
Сообщения: 2062
Зарегистрирован: 26 ноя 2006, 14:19
Откуда: г. Усть-Кирдык
Контактная информация:

Сообщение Maelstrom » 28 авг 2007, 05:27

(Как-то странно двухклеточные коридоры смотрятся...)
Зато на такие уровни можно многоклеточных монстров писать :)

А соревнование получилось какое-то гнилое :(
Айв кнгенгах Йог-Сотот

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 46 гостей