Псевдослучайное для процедурной генерации

Я делаю игру с процедурной картой, и я хотел бы применить этот способ:

Процедурная генерация острова

Это легко реализовать, и результаты - это то, что я ищу.

Единственная часть, с которой я застрял, — это часть 3, когда мне приходится ходить кругами и случайным образом менять воду на сушу, с более высоким шансом, что вода превратится в сушу, когда она коснется большого количества земли.

Я пытался сделать так:

if (rand() % 10 < 3 + countAdjacentTile(x, y, LAND))

функция countAdjacentTile просто подсчитывает количество плиток, помеченных как третий параметр, вокруг плитки, заданной координатами x и y.

Таким образом, у тайла воды все еще есть шанс превратиться в тайл земли, если вокруг него нет земли, и шансы выше, если вокруг есть земля.

Но это дает мне это:

введите здесь описание изображения

в то время как это дает это по ссылке, которую я дал ранее:

введите здесь описание изображения

Я хотел бы иметь такие же ветки. Вы знаете название алгоритма для этого? Я прочитал это: Экспоненциальное распределение Но это не очень разговорчиво для меня...

Спасибо за чтение до сих пор.


person tho    schedule 19.12.2013    source источник
comment
Вы дважды проверили, что ваша функция countAdjacentTile возвращает то, что вы ожидаете?   -  person benjymous    schedule 19.12.2013
comment
Да, у меня хорошие возвращаемые значения.   -  person tho    schedule 19.12.2013
comment
Если вы используете компилятор C++11, вы можете рассмотреть возможность использования одного из новых генераторов случайных чисел из заголовка random. rand не лучший вариант, и смешивание его с модом делает его еще хуже.   -  person Retired Ninja    schedule 19.12.2013
comment
Вы играли с вероятностями?   -  person molbdnilo    schedule 19.12.2013


Ответы (2)


Как работает countAdjacentTile()? Считает ли он тайлы по диагонали или только 4 соседа? Если вы считаете диагонали, попробуйте этого не делать. Также попробуйте настроить константы - это 10 и 3, трудно сказать, какие значения будут хорошими без этого кода, просто проверьте некоторые комбинации и выберите лучший результат.

person alxio    schedule 19.12.2013
comment
Сделав это, я поиграл с вероятностями, чтобы найти что-то отличное с разными семенами :). - person tho; 19.12.2013

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

person nesderl    schedule 19.12.2013